001/*
002 *  Copyright 2010 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.content;
017
018import java.util.HashMap;
019import java.util.Locale;
020import java.util.Map;
021
022import org.apache.avalon.framework.parameters.Parameters;
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025import org.apache.cocoon.ResourceNotFoundException;
026import org.apache.cocoon.acting.ServiceableAction;
027import org.apache.cocoon.environment.ObjectModelHelper;
028import org.apache.cocoon.environment.Redirector;
029import org.apache.cocoon.environment.Request;
030import org.apache.cocoon.environment.SourceResolver;
031import org.apache.commons.lang3.ArrayUtils;
032import org.apache.commons.lang3.StringUtils;
033
034import org.ametys.cms.contenttype.ContentTypeExtensionPoint;
035import org.ametys.cms.contenttype.ContentTypesHelper;
036import org.ametys.cms.repository.Content;
037import org.ametys.core.util.language.LocaleHelper;
038import org.ametys.plugins.repository.AmetysObject;
039import org.ametys.plugins.repository.AmetysObjectResolver;
040import org.ametys.plugins.repository.UnknownAmetysObjectException;
041import org.ametys.plugins.repository.version.VersionAwareAmetysObject;
042
043/**
044 * This action export the plugin name and content type for the current content.
045 */
046public class GetContentAction extends ServiceableAction
047{
048    /** The key for plugin's name */
049    public static final String RESULT_PLUGINNAME = "plugin";
050    /** The key for content type */
051    public static final String RESULT_CONTENTTYPE = "contentType";
052    /** The key for content version */
053    public static final String RESULT_CONTENTVERSION = "contentVersion";
054    /** The key for rendering  language */
055    public static final String RESULT_RENDERINGLANGUAGE = "renderingLanguage";
056    
057    /** The content type extension point */
058    protected ContentTypeExtensionPoint _contentTypeExtensionPoint;
059    /** The ametys object resolver */
060    protected AmetysObjectResolver _resolver;
061    /** Helper for content types */
062    protected ContentTypesHelper _contentTypeshelper;
063    /** The local helper */
064    protected LocaleHelper _localeHelper;
065    
066    @Override
067    public void service(ServiceManager serviceManager) throws ServiceException
068    {
069        super.service(serviceManager);
070        _contentTypeExtensionPoint = (ContentTypeExtensionPoint) serviceManager.lookup(ContentTypeExtensionPoint.ROLE);
071        _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE);
072        _contentTypeshelper = (ContentTypesHelper) manager.lookup(ContentTypesHelper.ROLE);
073        _localeHelper = (LocaleHelper) manager.lookup(LocaleHelper.ROLE);
074    }
075
076    public Map<String, String> act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
077    {
078        Map<String, String> result = new HashMap<>();
079        Request request = ObjectModelHelper.getRequest(objectModel);
080        
081        AmetysObject ametysObject;
082        String id = parameters.getParameter("id", null);
083        String path = parameters.getParameter("path", null);
084        
085        try
086        {
087            if (id != null)
088            {
089                ametysObject = _resolver.resolveById(id);
090            }
091            else if (path != null)
092            {
093                path = path.replaceAll("%3A", ":");
094                ametysObject = _resolver.resolveByPath(path);
095            }
096            else
097            {
098                Content content = (Content) request.getAttribute(Content.class.getName());
099                ametysObject = content != null ? content : (AmetysObject) request.getAttribute(AmetysObject.class.getName());
100            }
101        }
102        catch (UnknownAmetysObjectException e)
103        {
104            // Transorm a 500 error into a 404
105            throw new ResourceNotFoundException("Content not found", e);
106        }
107        
108        if (ametysObject instanceof Content)
109        {
110            String versionLabel = parameters.getParameter("versionLabel", null);
111            String revision = parameters.getParameter("contentVersion", null);
112            
113            if (StringUtils.isNotEmpty(versionLabel) && ametysObject instanceof VersionAwareAmetysObject versionAO)
114            {
115                String[] allLabels = versionAO.getAllLabels();
116                if (ArrayUtils.contains(allLabels, versionLabel))
117                {
118                    versionAO.switchToLabel(versionLabel);
119                }
120            }
121            else if (StringUtils.isNotEmpty(revision) && ametysObject instanceof VersionAwareAmetysObject versionAO)
122            {
123                versionAO.switchToRevision(revision);
124            }
125
126            Content content = (Content) ametysObject;
127            request.setAttribute(Content.class.getName(), content);
128            if (request.getAttribute(RESULT_RENDERINGLANGUAGE) == null)
129            {
130                String lang = content.getLanguage();
131                if (lang == null)
132                {
133                    lang = request.getParameter("lang");
134                }
135                if (lang == null)
136                {
137                    Locale locale = _localeHelper.findLocale(objectModel);
138                    lang = locale.getLanguage();
139                }
140                
141                request.setAttribute(RESULT_RENDERINGLANGUAGE, lang);
142                result.put(RESULT_RENDERINGLANGUAGE, lang);
143            }
144            else
145            {
146                result.put(RESULT_RENDERINGLANGUAGE, (String) request.getAttribute(RESULT_RENDERINGLANGUAGE));
147            }
148            
149            String contentTypeId = _contentTypeshelper.getContentTypeIdForRendering(content);
150            
151            request.setAttribute(RESULT_CONTENTTYPE, contentTypeId);
152            
153            result.put(RESULT_CONTENTTYPE, contentTypeId);
154            result.put(RESULT_PLUGINNAME, _contentTypeshelper.getContentTypePluginForRendering(content));
155            result.put(RESULT_CONTENTVERSION, revision);
156        }
157        else
158        {
159            request.setAttribute(AmetysObject.class.getName(), ametysObject);
160        }
161        
162        return result;
163    }
164}
165