/**
* 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.lists.form.web.internal.display.context;
import com.liferay.dynamic.data.lists.model.DDLRecordConstants;
import com.liferay.dynamic.data.lists.model.DDLRecordSet;
import com.liferay.dynamic.data.lists.model.DDLRecordSetSettings;
import com.liferay.dynamic.data.lists.model.DDLRecordVersion;
import com.liferay.dynamic.data.lists.service.DDLRecordSetService;
import com.liferay.dynamic.data.lists.service.DDLRecordVersionLocalService;
import com.liferay.dynamic.data.lists.service.permission.DDLRecordSetPermission;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderer;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderingContext;
import com.liferay.dynamic.data.mapping.form.values.factory.DDMFormValuesFactory;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn;
import com.liferay.dynamic.data.mapping.model.DDMFormLayoutPage;
import com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow;
import com.liferay.dynamic.data.mapping.model.DDMFormSuccessPageSettings;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService;
import com.liferay.portal.kernel.service.permission.PortletPermissionUtil;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PrefsParamUtil;
import com.liferay.portal.kernel.util.SessionParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import java.util.List;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceURL;
/**
* @author Marcellus Tavares
*/
public class DDLFormDisplayContext {
public DDLFormDisplayContext(
RenderRequest renderRequest, RenderResponse renderResponse,
DDLRecordSetService ddlRecordSetService,
DDLRecordVersionLocalService ddlRecordVersionLocalService,
DDMFormRenderer ddmFormRenderer,
DDMFormValuesFactory ddmFormValuesFactory,
WorkflowDefinitionLinkLocalService
workflowDefinitionLinkLocalService)
throws PortalException {
_renderRequest = renderRequest;
_renderResponse = renderResponse;
_ddlRecordSetService = ddlRecordSetService;
_ddlRecordVersionLocalService = ddlRecordVersionLocalService;
_ddmFormRenderer = ddmFormRenderer;
_ddmFormValuesFactory = ddmFormValuesFactory;
_workflowDefinitionLinkLocalService =
workflowDefinitionLinkLocalService;
_containerId = StringUtil.randomString();
if (Validator.isNotNull(getPortletResource())) {
return;
}
DDLRecordSet recordSet = getRecordSet();
if ((recordSet == null) || !hasViewPermission()) {
renderRequest.setAttribute(
WebKeys.PORTLET_CONFIGURATOR_VISIBILITY, Boolean.TRUE);
}
}
public String getContainerId() {
return _containerId;
}
public String getDDMFormHTML() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return StringPool.BLANK;
}
DDMStructure ddmStructure = recordSet.getDDMStructure();
boolean requireCaptcha = isCaptchaRequired(recordSet);
DDMForm ddmForm = getDDMForm(ddmStructure, requireCaptcha);
DDMFormLayout ddmFormLayout = getDDMFormLayout(
ddmStructure, requireCaptcha);
DDMFormRenderingContext ddmFormRenderingContext =
createDDMFormRenderingContext(ddmForm);
ddmFormRenderingContext.setGroupId(recordSet.getGroupId());
DDLRecordVersion ddlRecordVersion =
_ddlRecordVersionLocalService.fetchLatestRecordVersion(
getUserId(), getRecordSetId(), getRecordSetVersion(),
WorkflowConstants.STATUS_DRAFT);
if (ddlRecordVersion != null) {
ddmFormRenderingContext.setDDMFormValues(
ddlRecordVersion.getDDMFormValues());
}
boolean showSubmitButton = isShowSubmitButton();
ddmFormRenderingContext.setShowSubmitButton(showSubmitButton);
String submitLabel = getSubmitLabel(recordSet);
ddmFormRenderingContext.setSubmitLabel(submitLabel);
return _ddmFormRenderer.render(
ddmForm, ddmFormLayout, ddmFormRenderingContext);
}
public DDMFormSuccessPageSettings getDDMFormSuccessPageSettings()
throws PortalException {
DDMForm ddmForm = getDDMForm();
return ddmForm.getDDMFormSuccessPageSettings();
}
public DDLRecordSet getRecordSet() {
if (_recordSet != null) {
return _recordSet;
}
try {
_recordSet = _ddlRecordSetService.fetchRecordSet(getRecordSetId());
}
catch (PortalException pe) {
// LPS-52675
if (_log.isDebugEnabled()) {
_log.debug(pe, pe);
}
return null;
}
return _recordSet;
}
public long getRecordSetId() {
if (_recordSetId != 0) {
return _recordSetId;
}
_recordSetId = PrefsParamUtil.getLong(
_renderRequest.getPreferences(), _renderRequest, "recordSetId");
if (_recordSetId == 0) {
_recordSetId = getRecordSetIdFromSession();
}
return _recordSetId;
}
public String getRedirectURL() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return null;
}
DDLRecordSetSettings recordSetSettings = recordSet.getSettingsModel();
return recordSetSettings.redirectURL();
}
public boolean isFormAvailable() throws PortalException {
if (isPreview()) {
return true;
}
if (isSharedURL()) {
if (isFormPublished() && isFormShared()) {
return true;
}
return false;
}
if (getRecordSet() != null) {
return true;
}
return false;
}
public boolean isShowConfigurationIcon() throws PortalException {
if (_showConfigurationIcon != null) {
return _showConfigurationIcon;
}
if (isPreview() || (isSharedURL() && isFormShared())) {
_showConfigurationIcon = false;
return _showConfigurationIcon;
}
ThemeDisplay themeDisplay = getThemeDisplay();
_showConfigurationIcon = PortletPermissionUtil.contains(
themeDisplay.getPermissionChecker(), themeDisplay.getLayout(),
getPortletId(), ActionKeys.CONFIGURATION);
return _showConfigurationIcon;
}
public boolean isShowSuccessPage() throws PortalException {
if (SessionMessages.isEmpty(_renderRequest)) {
return false;
}
DDMFormSuccessPageSettings ddmFormSuccessPageSettings =
getDDMFormSuccessPageSettings();
return ddmFormSuccessPageSettings.isEnabled();
}
protected String createCaptchaResourceURL() {
ResourceURL resourceURL = _renderResponse.createResourceURL();
resourceURL.setResourceID("captcha");
return resourceURL.toString();
}
protected DDMFormRenderingContext createDDMFormRenderingContext(
DDMForm ddmForm) {
DDMFormRenderingContext ddmFormRenderingContext =
new DDMFormRenderingContext();
ddmFormRenderingContext.setContainerId(_containerId);
ddmFormRenderingContext.setDDMFormValues(
_ddmFormValuesFactory.create(_renderRequest, ddmForm));
ddmFormRenderingContext.setHttpServletRequest(
PortalUtil.getHttpServletRequest(_renderRequest));
ddmFormRenderingContext.setHttpServletResponse(
PortalUtil.getHttpServletResponse(_renderResponse));
ddmFormRenderingContext.setLocale(ddmForm.getDefaultLocale());
ddmFormRenderingContext.setPortletNamespace(
_renderResponse.getNamespace());
return ddmFormRenderingContext;
}
protected DDMFormLayoutRow createFullColumnDDMFormLayoutRow(
String ddmFormFieldName) {
DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow();
DDMFormLayoutColumn ddmFormLayoutColumn = new DDMFormLayoutColumn(
DDMFormLayoutColumn.FULL, ddmFormFieldName);
ddmFormLayoutRow.addDDMFormLayoutColumn(ddmFormLayoutColumn);
return ddmFormLayoutRow;
}
protected DDMForm getDDMForm() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
DDMStructure ddmStructure = recordSet.getDDMStructure();
return ddmStructure.getDDMForm();
}
protected DDMForm getDDMForm(
DDMStructure ddmStructure, boolean requireCaptcha) {
DDMForm ddmForm = ddmStructure.getDDMForm();
if (requireCaptcha) {
DDMFormField captchaDDMFormField = new DDMFormField(
_DDM_FORM_FIELD_NAME_CAPTCHA, "captcha");
captchaDDMFormField.setDataType("string");
captchaDDMFormField.setProperty("url", createCaptchaResourceURL());
ddmForm.addDDMFormField(captchaDDMFormField);
}
return ddmForm;
}
protected DDMFormLayout getDDMFormLayout(
DDMStructure ddmStructure, boolean requireCaptcha)
throws PortalException {
DDMFormLayout ddmFormLayout = ddmStructure.getDDMFormLayout();
if (requireCaptcha) {
DDMFormLayoutPage lastDDMFormLayoutPage = getLastDDMFormLayoutPage(
ddmFormLayout);
DDMFormLayoutRow ddmFormLayoutRow =
createFullColumnDDMFormLayoutRow(_DDM_FORM_FIELD_NAME_CAPTCHA);
lastDDMFormLayoutPage.addDDMFormLayoutRow(ddmFormLayoutRow);
}
return ddmFormLayout;
}
protected DDMFormLayoutPage getLastDDMFormLayoutPage(
DDMFormLayout ddmFormLayout) {
List<DDMFormLayoutPage> ddmFormLayoutPages =
ddmFormLayout.getDDMFormLayoutPages();
return ddmFormLayoutPages.get(ddmFormLayoutPages.size() - 1);
}
protected String getPortletId() {
ThemeDisplay themeDisplay = getThemeDisplay();
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
return portletDisplay.getId();
}
protected String getPortletResource() {
ThemeDisplay themeDisplay = getThemeDisplay();
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
return portletDisplay.getPortletResource();
}
protected long getRecordSetIdFromSession() {
PortletSession portletSession = _renderRequest.getPortletSession();
return GetterUtil.getLong(portletSession.getAttribute("recordSetId"));
}
protected String getRecordSetVersion() {
DDLRecordSet ddlRecordSet = getRecordSet();
if (ddlRecordSet == null) {
return DDLRecordConstants.VERSION_DEFAULT;
}
return ddlRecordSet.getVersion();
}
protected String getSubmitLabel(DDLRecordSet recordSet) {
ThemeDisplay themeDisplay = getThemeDisplay();
boolean workflowEnabled = hasWorkflowEnabled(recordSet, themeDisplay);
if (workflowEnabled) {
return LanguageUtil.get(
themeDisplay.getRequest(), "submit-for-publication");
}
else {
return LanguageUtil.get(themeDisplay.getRequest(), "submit");
}
}
protected ThemeDisplay getThemeDisplay() {
ThemeDisplay themeDisplay = (ThemeDisplay)_renderRequest.getAttribute(
WebKeys.THEME_DISPLAY);
return themeDisplay;
}
protected long getUserId() {
ThemeDisplay themeDisplay = getThemeDisplay();
return themeDisplay.getUserId();
}
protected boolean hasViewPermission() throws PortalException {
if (_hasViewPermission != null) {
return _hasViewPermission;
}
_hasViewPermission = true;
DDLRecordSet recordSet = getRecordSet();
if (recordSet != null) {
ThemeDisplay themeDisplay = getThemeDisplay();
_hasViewPermission = DDLRecordSetPermission.contains(
themeDisplay.getPermissionChecker(), recordSet,
ActionKeys.VIEW);
}
return _hasViewPermission;
}
protected boolean hasWorkflowEnabled(
DDLRecordSet recordSet, ThemeDisplay themeDisplay) {
return _workflowDefinitionLinkLocalService.hasWorkflowDefinitionLink(
themeDisplay.getCompanyId(), recordSet.getGroupId(),
DDLRecordSet.class.getName(), recordSet.getRecordSetId());
}
protected boolean isCaptchaRequired(DDLRecordSet recordSet)
throws PortalException {
DDLRecordSetSettings recordSetSettings = recordSet.getSettingsModel();
return recordSetSettings.requireCaptcha();
}
protected boolean isFormPublished() throws PortalException {
DDLRecordSet recordSet = getRecordSet();
if (recordSet == null) {
return false;
}
DDLRecordSetSettings recordSetSettings = recordSet.getSettingsModel();
return recordSetSettings.published();
}
protected boolean isFormShared() {
return SessionParamUtil.getBoolean(_renderRequest, "shared");
}
protected boolean isPreview() {
return ParamUtil.getBoolean(_renderRequest, "preview");
}
protected boolean isSharedURL() {
ThemeDisplay themeDisplay = getThemeDisplay();
String urlCurrent = themeDisplay.getURLCurrent();
return urlCurrent.contains("/shared");
}
protected boolean isShowSubmitButton() {
boolean preview = ParamUtil.getBoolean(_renderRequest, "preview");
if (preview) {
return false;
}
return true;
}
private static final String _DDM_FORM_FIELD_NAME_CAPTCHA = "_CAPTCHA_";
private static final Log _log = LogFactoryUtil.getLog(
DDLFormDisplayContext.class);
private final String _containerId;
private final DDLRecordSetService _ddlRecordSetService;
private final DDLRecordVersionLocalService _ddlRecordVersionLocalService;
private final DDMFormRenderer _ddmFormRenderer;
private final DDMFormValuesFactory _ddmFormValuesFactory;
private Boolean _hasViewPermission;
private DDLRecordSet _recordSet;
private long _recordSetId;
private final RenderRequest _renderRequest;
private final RenderResponse _renderResponse;
private Boolean _showConfigurationIcon;
private final WorkflowDefinitionLinkLocalService
_workflowDefinitionLinkLocalService;
}