/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping.web.internal.portlet; import com.liferay.dynamic.data.mapping.constants.DDMPortletKeys; import com.liferay.dynamic.data.mapping.constants.DDMWebKeys; import com.liferay.dynamic.data.mapping.exception.NoSuchStructureException; import com.liferay.dynamic.data.mapping.exception.NoSuchTemplateException; import com.liferay.dynamic.data.mapping.exception.RequiredStructureException; import com.liferay.dynamic.data.mapping.exception.RequiredTemplateException; import com.liferay.dynamic.data.mapping.exception.StructureDefinitionException; import com.liferay.dynamic.data.mapping.exception.StructureDuplicateElementException; import com.liferay.dynamic.data.mapping.exception.StructureNameException; import com.liferay.dynamic.data.mapping.exception.TemplateNameException; import com.liferay.dynamic.data.mapping.exception.TemplateScriptException; import com.liferay.dynamic.data.mapping.exception.TemplateSmallImageNameException; import com.liferay.dynamic.data.mapping.exception.TemplateSmallImageSizeException; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.DDMTemplate; import com.liferay.dynamic.data.mapping.service.DDMStructureLocalService; import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalService; import com.liferay.dynamic.data.mapping.storage.StorageAdapterRegistry; import com.liferay.dynamic.data.mapping.util.DDMDisplayRegistry; import com.liferay.dynamic.data.mapping.util.DDMTemplateHelper; import com.liferay.dynamic.data.mapping.validator.DDMFormLayoutValidationException; import com.liferay.dynamic.data.mapping.validator.DDMFormValidationException; import com.liferay.dynamic.data.mapping.validator.DDMFormValidationException.MustNotDuplicateFieldName; import com.liferay.dynamic.data.mapping.validator.DDMFormValidationException.MustSetOptionsForField; import com.liferay.dynamic.data.mapping.validator.DDMFormValidationException.MustSetValidCharactersForFieldName; import com.liferay.dynamic.data.mapping.web.configuration.DDMWebConfiguration; import com.liferay.dynamic.data.mapping.web.internal.display.context.DDMDisplayContext; import com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil; import com.liferay.portal.kernel.exception.LocaleException; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.PortletPreferencesException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet; import com.liferay.portal.kernel.security.auth.PrincipalException; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import java.io.IOException; import java.util.Map; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.Portlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.ConfigurationPolicy; import org.osgi.service.component.annotations.Modified; import org.osgi.service.component.annotations.Reference; /** * @author Leonardo Barros */ @Component( configurationPid = "com.liferay.dynamic.data.mapping.web.configuration.DDMWebConfiguration", configurationPolicy = ConfigurationPolicy.OPTIONAL, immediate = true, property = { "com.liferay.portlet.add-default-resource=true", "com.liferay.portlet.autopropagated-parameters=backURL", "com.liferay.portlet.autopropagated-parameters=navigationStartsOn", "com.liferay.portlet.autopropagated-parameters=refererPortletName", "com.liferay.portlet.autopropagated-parameters=refererWebDAVToken", "com.liferay.portlet.autopropagated-parameters=scopeTitle", "com.liferay.portlet.autopropagated-parameters=showAncestorScopes", "com.liferay.portlet.autopropagated-parameters=showBackURL", "com.liferay.portlet.autopropagated-parameters=showCacheableInput", "com.liferay.portlet.autopropagated-parameters=showHeader", "com.liferay.portlet.autopropagated-parameters=showManageTemplates", "com.liferay.portlet.css-class-wrapper=portlet-dynamic-data-mapping", "com.liferay.portlet.display-category=category.hidden", "com.liferay.portlet.header-portlet-css=/css/main.css", "com.liferay.portlet.header-portlet-javascript=/js/main.js", "com.liferay.portlet.header-portlet-javascript=/js/custom_fields.js", "com.liferay.portlet.preferences-owned-by-group=true", "com.liferay.portlet.private-request-attributes=false", "com.liferay.portlet.private-session-attributes=false", "com.liferay.portlet.render-weight=50", "com.liferay.portlet.use-default-template=true", "javax.portlet.display-name=Dynamic Data Mapping Web", "javax.portlet.expiration-cache=0", "javax.portlet.init-param.always-send-redirect=true", "javax.portlet.init-param.copy-request-parameters=true", "javax.portlet.init-param.template-path=/", "javax.portlet.init-param.view-template=/view.jsp", "javax.portlet.name=" + DDMPortletKeys.DYNAMIC_DATA_MAPPING, "javax.portlet.resource-bundle=content.Language", "javax.portlet.security-role-ref=power-user,user", "javax.portlet.supports.mime-type=text/html" }, service = Portlet.class ) public class DDMPortlet extends MVCPortlet { @Override public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException { try { super.processAction(actionRequest, actionResponse); } catch (Exception e) { if (e instanceof NoSuchStructureException || e instanceof NoSuchTemplateException || e instanceof PortletPreferencesException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass()); include("/error.jsp", actionRequest, actionResponse); } else if (e instanceof DDMFormLayoutValidationException || e instanceof DDMFormValidationException || e instanceof LocaleException || e instanceof MustNotDuplicateFieldName || e instanceof MustSetOptionsForField || e instanceof MustSetValidCharactersForFieldName || e instanceof RequiredStructureException || e instanceof RequiredTemplateException || e instanceof StructureDefinitionException || e instanceof StructureDuplicateElementException || e instanceof StructureNameException || e instanceof TemplateNameException || e instanceof TemplateNameException || e instanceof TemplateScriptException || e instanceof TemplateSmallImageNameException || e instanceof TemplateSmallImageSizeException) { SessionErrors.add(actionRequest, e.getClass(), e); if (e instanceof RequiredStructureException || e instanceof RequiredTemplateException) { String redirect = portal.escapeRedirect( ParamUtil.getString(actionRequest, "redirect")); if (Validator.isNotNull(redirect)) { actionResponse.sendRedirect(redirect); } } } else { throw e; } } } @Override public void render( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { try { setDDMDisplayContextRequestAttribute(renderRequest); setDDMTemplateRequestAttribute(renderRequest); setDDMStructureRequestAttribute(renderRequest); } catch (NoSuchStructureException | NoSuchTemplateException e) { // Let this slide because the user can manually input a structure // or template key for a new model that does not yet exist if (_log.isDebugEnabled()) { _log.debug(e, e); } } catch (Exception e) { if (e instanceof PortletPreferencesException || e instanceof PrincipalException) { SessionErrors.add(renderRequest, e.getClass()); include("/error.jsp", renderRequest, renderResponse); } else { throw new PortletException(e); } } super.render(renderRequest, renderResponse); } @Activate @Modified protected void activate(Map<String, Object> properties) { ddmWebConfiguration = ConfigurableUtil.createConfigurable( DDMWebConfiguration.class, properties); } protected void setDDMDisplayContextRequestAttribute( RenderRequest renderRequest) throws PortalException { DDMDisplayContext ddmDisplayContext = new DDMDisplayContext( renderRequest, _ddmDisplayRegistry, _ddmTemplateHelper, ddmWebConfiguration, _storageAdapterRegistry); renderRequest.setAttribute( WebKeys.PORTLET_DISPLAY_CONTEXT, ddmDisplayContext); } @Reference(unbind = "-") protected void setDDMDisplayRegistry( DDMDisplayRegistry ddmDisplayRegistry) { _ddmDisplayRegistry = ddmDisplayRegistry; } @Reference(unbind = "-") protected void setDDMStructureLocalService( DDMStructureLocalService ddmStructureLocalService) { this.ddmStructureLocalService = ddmStructureLocalService; } protected void setDDMStructureRequestAttribute(RenderRequest renderRequest) throws PortalException { long classNameId = ParamUtil.getLong(renderRequest, "classNameId"); long classPK = ParamUtil.getLong(renderRequest, "classPK"); if ((classNameId > 0) && (classPK > 0)) { DDMStructure structure = null; long structureClassNameId = portal.getClassNameId( DDMStructure.class); if ((structureClassNameId == classNameId) && (classPK > 0)) { structure = ddmStructureLocalService.getStructure(classPK); } renderRequest.setAttribute( DDMWebKeys.DYNAMIC_DATA_MAPPING_STRUCTURE, structure); } } @Reference(unbind = "-") protected void setDDMTemplateHelper(DDMTemplateHelper ddmTemplateHelper) { _ddmTemplateHelper = ddmTemplateHelper; } @Reference(unbind = "-") protected void setDDMTemplateLocalService( DDMTemplateLocalService ddmTemplateLocalService) { this.ddmTemplateLocalService = ddmTemplateLocalService; } protected void setDDMTemplateRequestAttribute(RenderRequest renderRequest) throws PortalException { long templateId = ParamUtil.getLong(renderRequest, "templateId"); if (templateId > 0) { DDMTemplate template = ddmTemplateLocalService.getDDMTemplate( templateId); renderRequest.setAttribute( DDMWebKeys.DYNAMIC_DATA_MAPPING_TEMPLATE, template); } } @Reference(unbind = "-") protected void setStorageAdapterRegistry( StorageAdapterRegistry storageAdapterRegistry) { _storageAdapterRegistry = storageAdapterRegistry; } protected volatile DDMStructureLocalService ddmStructureLocalService; protected volatile DDMTemplateLocalService ddmTemplateLocalService; protected volatile DDMWebConfiguration ddmWebConfiguration; @Reference protected Portal portal; private static final Log _log = LogFactoryUtil.getLog(DDMPortlet.class); private DDMDisplayRegistry _ddmDisplayRegistry; private DDMTemplateHelper _ddmTemplateHelper; private StorageAdapterRegistry _storageAdapterRegistry; }