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