/**
* 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.constants.DDLWebKeys;
import com.liferay.dynamic.data.lists.form.web.constants.DDLFormPortletKeys;
import com.liferay.dynamic.data.lists.form.web.internal.display.context.util.DDLFormAdminRequestHelper;
import com.liferay.dynamic.data.lists.model.DDLFormRecord;
import com.liferay.dynamic.data.lists.model.DDLRecord;
import com.liferay.dynamic.data.lists.model.DDLRecordSet;
import com.liferay.dynamic.data.lists.model.DDLRecordSetVersion;
import com.liferay.dynamic.data.lists.service.DDLRecordLocalService;
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.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMStructureVersion;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.util.DDMFormValuesMerger;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.ResourceBundleUtil;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import javax.portlet.RenderRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Marcellus Tavares
*/
public class DDLFormViewRecordDisplayContext {
public DDLFormViewRecordDisplayContext(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
DDLRecordLocalService ddlRecordLocalService,
DDMFormRenderer ddmFormRenderer,
DDMFormValuesFactory ddmFormValuesFactory,
DDMFormValuesMerger ddmFormValuesMerger) {
_httpServletResponse = httpServletResponse;
_ddlRecordLocalService = ddlRecordLocalService;
_ddmFormRenderer = ddmFormRenderer;
_ddmFormValuesFactory = ddmFormValuesFactory;
_ddmFormValuesMerger = ddmFormValuesMerger;
_ddlFormAdminRequestHelper = new DDLFormAdminRequestHelper(
httpServletRequest);
}
public String getDDMFormHTML(RenderRequest renderRequest)
throws PortalException {
DDLRecord record = getRecord();
DDLRecordSet recordSet = record.getRecordSet();
DDMStructure ddmStructure = recordSet.getDDMStructure();
DDLRecordSetVersion recordSetVersion = recordSet.getRecordSetVersion(
record.getRecordSetVersion());
DDMStructureVersion ddmStructureVersion =
recordSetVersion.getDDMStructureVersion();
DDMForm currentDDMForm = ddmStructureVersion.getDDMForm();
DDMFormValues ddmFormValues = _ddmFormValuesFactory.create(
renderRequest, currentDDMForm);
ddmFormValues = _ddmFormValuesMerger.merge(
record.getDDMFormValues(), ddmFormValues);
DDMFormRenderingContext ddmFormRenderingContext =
createDDMFormRenderingContext();
ddmFormRenderingContext.setDDMFormValues(ddmFormValues);
updateDDMFormFields(currentDDMForm, ddmStructure.getDDMForm());
DDMFormLayout ddmFormLayout = ddmStructureVersion.getDDMFormLayout();
return _ddmFormRenderer.render(
currentDDMForm, ddmFormLayout, ddmFormRenderingContext);
}
protected DDMFormRenderingContext createDDMFormRenderingContext() {
DDMFormRenderingContext ddmFormRenderingContext =
new DDMFormRenderingContext();
ddmFormRenderingContext.setHttpServletRequest(
_ddlFormAdminRequestHelper.getRequest());
ddmFormRenderingContext.setHttpServletResponse(_httpServletResponse);
ddmFormRenderingContext.setLocale(
_ddlFormAdminRequestHelper.getLocale());
ddmFormRenderingContext.setPortletNamespace(
PortalUtil.getPortletNamespace(
DDLFormPortletKeys.DYNAMIC_DATA_LISTS_FORM_ADMIN));
ddmFormRenderingContext.setReadOnly(true);
return ddmFormRenderingContext;
}
protected DDLRecord getRecord() throws PortalException {
HttpServletRequest httpServletRequest =
_ddlFormAdminRequestHelper.getRequest();
long recordId = ParamUtil.getLong(httpServletRequest, "recordId");
if (recordId > 0) {
return _ddlRecordLocalService.fetchRecord(recordId);
}
Object record = httpServletRequest.getAttribute(
DDLWebKeys.DYNAMIC_DATA_LISTS_RECORD);
if (record instanceof DDLFormRecord) {
DDLFormRecord formRecord = (DDLFormRecord)record;
return formRecord.getDDLRecord();
}
else {
return (DDLRecord)record;
}
}
protected boolean isDDMFormFieldRemoved(
Map<String, DDMFormField> latestDDMFormFieldMap, String fieldName) {
if (latestDDMFormFieldMap.containsKey(fieldName)) {
return false;
}
return true;
}
protected void setDDMFormFieldRemovedLabel(DDMFormField ddmFormField) {
Locale locale = _ddlFormAdminRequestHelper.getLocale();
LocalizedValue label = ddmFormField.getLabel();
String labelString = label.getString(locale);
ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
"content.Language", locale, getClass());
label.addString(
locale,
LanguageUtil.format(
resourceBundle, "x-removed", labelString, false));
}
protected void updateDDMFormField(
Map<String, DDMFormField> latestDDMFormFieldMap,
DDMFormField ddmFormField) {
boolean removed = isDDMFormFieldRemoved(
latestDDMFormFieldMap, ddmFormField.getName());
if (removed) {
setDDMFormFieldRemovedLabel(ddmFormField);
}
ddmFormField.setReadOnly(true);
// Nested fields
for (DDMFormField nestedDDMFormField :
ddmFormField.getNestedDDMFormFields()) {
updateDDMFormField(latestDDMFormFieldMap, nestedDDMFormField);
}
}
protected void updateDDMFormFields(
DDMForm currentDDMForm, DDMForm latestDDMForm) {
Map<String, DDMFormField> latestDDMFormFieldMap =
latestDDMForm.getDDMFormFieldsMap(true);
for (DDMFormField ddmFormField : currentDDMForm.getDDMFormFields()) {
updateDDMFormField(latestDDMFormFieldMap, ddmFormField);
}
}
private final DDLFormAdminRequestHelper _ddlFormAdminRequestHelper;
private final DDLRecordLocalService _ddlRecordLocalService;
private final DDMFormRenderer _ddmFormRenderer;
private final DDMFormValuesFactory _ddmFormValuesFactory;
private final DDMFormValuesMerger _ddmFormValuesMerger;
private final HttpServletResponse _httpServletResponse;
}