001/*
002 *  Copyright 2013 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.cms.search.cocoon;
017
018import java.io.IOException;
019import java.util.Collection;
020import java.util.Locale;
021import java.util.Map;
022
023import org.apache.avalon.framework.context.Context;
024import org.apache.avalon.framework.context.ContextException;
025import org.apache.avalon.framework.context.Contextualizable;
026import org.apache.avalon.framework.service.ServiceException;
027import org.apache.avalon.framework.service.ServiceManager;
028import org.apache.cocoon.ProcessingException;
029import org.apache.cocoon.components.ContextHelper;
030import org.apache.cocoon.environment.Request;
031import org.apache.cocoon.generation.ServiceableGenerator;
032import org.apache.cocoon.i18n.I18nUtils;
033import org.apache.cocoon.xml.AttributesImpl;
034import org.apache.cocoon.xml.XMLUtils;
035import org.apache.commons.lang3.StringUtils;
036import org.xml.sax.SAXException;
037
038import org.ametys.cms.repository.Content;
039import org.ametys.cms.search.model.ResultField;
040import org.ametys.cms.search.ui.model.SearchUIColumn;
041
042/**
043 * Generate contents returned by the {@link SearchAction}.
044 */
045public class ContentDocGenerator extends ServiceableGenerator implements Contextualizable
046{
047    /** Context */
048    protected Context _context;
049    /** Helper for saxing result */
050    protected ContentResultSetHelper _contentRSH;
051
052    @Override
053    public void service(ServiceManager smanager) throws ServiceException
054    {
055        super.service(smanager);
056
057        _contentRSH = (ContentResultSetHelper) smanager.lookup(ContentResultSetHelper.ROLE);
058    }
059    @SuppressWarnings("unchecked")
060    public void generate() throws IOException, SAXException, ProcessingException
061    {
062        Request request = ContextHelper.getRequest(_context);
063        Content content = (Content) request.getAttribute(Content.class.getName());
064        
065        Collection<? extends ResultField> resultFields = (Collection< ? extends ResultField>) request.getAttribute(ResultField.class.getName());
066
067        contentHandler.startDocument();
068        
069        XMLUtils.startElement(contentHandler, "content");
070        
071        Map<String, SearchUIColumn> uiResultFields = (Map<String, SearchUIColumn>) request.getAttribute("uiResultFields");
072        _saxColumns(uiResultFields);
073        
074        Locale defaultLocale = getDefaultLocale(request);
075        
076        AttributesImpl attrs = new AttributesImpl();
077        attrs.addCDATAAttribute("id", content.getId());
078        attrs.addCDATAAttribute("name", content.getName());
079        attrs.addCDATAAttribute("title", content.getTitle(defaultLocale));
080        if (content.getLanguage() != null)
081        {
082            attrs.addCDATAAttribute("language", content.getLanguage());
083        }
084        XMLUtils.startElement(contentHandler, "content", attrs);
085        _contentRSH.saxResultFields(contentHandler, content, resultFields, defaultLocale);
086        XMLUtils.endElement(contentHandler, "content");
087        
088        XMLUtils.endElement(contentHandler, "content");
089        contentHandler.endDocument();
090    }
091
092    public void contextualize(Context context) throws ContextException
093    {
094        _context = context;
095    }
096    
097    /**
098     * Get the default locale to use to sax localized values
099     * @param request the request
100     * @return the default locale
101     */
102    protected Locale getDefaultLocale(Request request)
103    {
104        String lang = parameters.getParameter("lang", request.getParameter("lang"));
105        return StringUtils.isNotEmpty(lang) ? new Locale(lang) : I18nUtils.findLocale(objectModel, "locale", null, Locale.getDefault(), true);
106    }
107    
108    private void _saxColumns(Map<String, SearchUIColumn> resultFields) throws SAXException
109    {
110        XMLUtils.startElement(contentHandler, "fields");
111        for (SearchUIColumn column : resultFields.values())
112        {
113            AttributesImpl attrs = new AttributesImpl();
114            // cf org.ametys.cms.search.ui.model.SearchUIModelHelper.getColumnInfo(SearchUIColumn)
115            attrs.addCDATAAttribute("id", column.getId().replace('.', '/'));
116            
117            if (column.getType() != null)
118            {
119                attrs.addCDATAAttribute("type", column.getType().getId().toLowerCase());
120            }
121            XMLUtils.startElement(contentHandler, "field", attrs);
122            column.getLabel().toSAX(contentHandler);
123            XMLUtils.endElement(contentHandler, "field");
124        }
125        XMLUtils.endElement(contentHandler, "fields");
126    }
127}