/**
* 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.form.renderer.internal;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluationException;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluationResult;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluator;
import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormEvaluatorContext;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderingContext;
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.LocalizedValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
/**
* @author Marcellus Tavares
*/
public class DDMFormPagesTemplateContextFactory {
public DDMFormPagesTemplateContextFactory(
DDMForm ddmForm, DDMFormLayout ddmFormLayout,
DDMFormRenderingContext ddmFormRenderingContext) {
_ddmForm = ddmForm;
_ddmFormLayout = ddmFormLayout;
_ddmFormRenderingContext = ddmFormRenderingContext;
DDMFormValues ddmFormValues =
ddmFormRenderingContext.getDDMFormValues();
if (ddmFormValues == null) {
DefaultDDMFormValuesFactory defaultDDMFormValuesFactory =
new DefaultDDMFormValuesFactory(
ddmForm, ddmFormRenderingContext.getLocale());
ddmFormValues = defaultDDMFormValuesFactory.create();
}
else {
removeStaleDDMFormFieldValues(
ddmForm.getDDMFormFieldsMap(true),
ddmFormValues.getDDMFormFieldValues());
}
_ddmFormValues = ddmFormValues;
_ddmFormFieldsMap = ddmForm.getDDMFormFieldsMap(true);
_ddmFormFieldValuesMap = ddmFormValues.getDDMFormFieldValuesMap();
_locale = ddmFormRenderingContext.getLocale();
}
public List<Object> create() {
_ddmFormEvaluationResult = _createDDMFormEvaluationResult();
return createPagesTemplateContext(
_ddmFormLayout.getDDMFormLayoutPages());
}
public void setDDMFormEvaluator(DDMFormEvaluator ddmFormEvaluator) {
_ddmFormEvaluator = ddmFormEvaluator;
}
public void setDDMFormFieldTypeServicesTracker(
DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker) {
_ddmFormFieldTypeServicesTracker = ddmFormFieldTypeServicesTracker;
}
protected boolean containsRequiredField(List<String> ddmFormFieldNames) {
for (String ddmFormFieldName : ddmFormFieldNames) {
DDMFormField ddmFormField = _ddmFormFieldsMap.get(ddmFormFieldName);
if (ddmFormField.isRequired()) {
return true;
}
}
return false;
}
protected List<Object> createColumnsTemplateContext(
List<DDMFormLayoutColumn> ddmFormLayoutColumns) {
List<Object> columnsTemplateContext = new ArrayList<>();
for (DDMFormLayoutColumn ddmFormLayoutColumn : ddmFormLayoutColumns) {
columnsTemplateContext.add(
createColumnTemplateContext(ddmFormLayoutColumn));
}
return columnsTemplateContext;
}
protected Map<String, Object> createColumnTemplateContext(
DDMFormLayoutColumn ddmFormLayoutColumn) {
Map<String, Object> columnTemplateContext = new HashMap<>();
columnTemplateContext.put(
"fields",
createFieldsTemplateContext(
ddmFormLayoutColumn.getDDMFormFieldNames()));
columnTemplateContext.put("size", ddmFormLayoutColumn.getSize());
return columnTemplateContext;
}
protected List<Object> createFieldsTemplateContext(
List<String> ddmFormFieldNames) {
List<Object> fieldsTemplateContext = new ArrayList<>();
for (String ddmFormFieldName : ddmFormFieldNames) {
fieldsTemplateContext.addAll(
createFieldTemplateContext(ddmFormFieldName));
}
return fieldsTemplateContext;
}
protected List<Object> createFieldTemplateContext(String ddmFormFieldName) {
DDMFormFieldTemplateContextFactory ddmFormFieldTemplateContextFactory =
new DDMFormFieldTemplateContextFactory(
_ddmFormFieldsMap, _ddmFormEvaluationResult,
_ddmFormFieldValuesMap.get(ddmFormFieldName),
_ddmFormRenderingContext);
ddmFormFieldTemplateContextFactory.setDDMFormFieldTypeServicesTracker(
_ddmFormFieldTypeServicesTracker);
return ddmFormFieldTemplateContextFactory.create();
}
protected List<Object> createPagesTemplateContext(
List<DDMFormLayoutPage> ddmFormLayoutPages) {
List<Object> pagesTemplateContext = new ArrayList<>();
int i = 0;
for (DDMFormLayoutPage ddmFormLayoutPage : ddmFormLayoutPages) {
pagesTemplateContext.add(
createPageTemplateContext(ddmFormLayoutPage, i++));
}
return pagesTemplateContext;
}
protected Map<String, Object> createPageTemplateContext(
DDMFormLayoutPage ddmFormLayoutPage, int pageIndex) {
Map<String, Object> pageTemplateContext = new HashMap<>();
LocalizedValue description = ddmFormLayoutPage.getDescription();
pageTemplateContext.put("description", description.getString(_locale));
pageTemplateContext.put("enabled", isPageEnabled(pageIndex));
pageTemplateContext.put(
"localizedDescription", getLocalizedValueMap(description));
LocalizedValue title = ddmFormLayoutPage.getTitle();
pageTemplateContext.put("localizedTitle", getLocalizedValueMap(title));
pageTemplateContext.put(
"rows",
createRowsTemplateContext(
ddmFormLayoutPage.getDDMFormLayoutRows()));
boolean showRequiredFieldsWarning = isShowRequiredFieldsWarning(
ddmFormLayoutPage.getDDMFormLayoutRows());
pageTemplateContext.put(
"showRequiredFieldsWarning", showRequiredFieldsWarning);
pageTemplateContext.put("title", title.getString(_locale));
return pageTemplateContext;
}
protected List<Object> createRowsTemplateContext(
List<DDMFormLayoutRow> ddmFormLayoutRows) {
List<Object> rowsTemplateContext = new ArrayList<>();
for (DDMFormLayoutRow ddmFormLayoutRow : ddmFormLayoutRows) {
rowsTemplateContext.add(createRowTemplateContext(ddmFormLayoutRow));
}
return rowsTemplateContext;
}
protected Map<String, Object> createRowTemplateContext(
DDMFormLayoutRow ddFormLayoutRow) {
Map<String, Object> rowTemplateContext = new HashMap<>();
rowTemplateContext.put(
"columns",
createColumnsTemplateContext(
ddFormLayoutRow.getDDMFormLayoutColumns()));
return rowTemplateContext;
}
protected Map<String, String> getLocalizedValueMap(
LocalizedValue localizedValue) {
Map<String, String> map = new HashMap<>();
Map<Locale, String> values = localizedValue.getValues();
for (Map.Entry<Locale, String> entry : values.entrySet()) {
String languageId = LocaleUtil.toLanguageId(entry.getKey());
map.put(languageId, entry.getValue());
}
return map;
}
protected boolean isPageEnabled(int pageIndex) {
Set<Integer> disabledPagesIndexes =
_ddmFormEvaluationResult.getDisabledPagesIndexes();
if (disabledPagesIndexes.contains(pageIndex)) {
return false;
}
return true;
}
protected boolean isShowRequiredFieldsWarning(
List<DDMFormLayoutRow> ddmFormLayoutRows) {
if (!_ddmFormRenderingContext.isShowRequiredFieldsWarning()) {
return false;
}
for (DDMFormLayoutRow ddmFormLayoutRow : ddmFormLayoutRows) {
for (DDMFormLayoutColumn ddmFormLayoutColumn :
ddmFormLayoutRow.getDDMFormLayoutColumns()) {
if (containsRequiredField(
ddmFormLayoutColumn.getDDMFormFieldNames())) {
return true;
}
}
}
return false;
}
protected void removeStaleDDMFormFieldValues(
Map<String, DDMFormField> ddmFormFieldsMap,
List<DDMFormFieldValue> ddmFormFieldValues) {
Iterator<DDMFormFieldValue> iterator = ddmFormFieldValues.iterator();
while (iterator.hasNext()) {
DDMFormFieldValue ddmFormFieldValue = iterator.next();
if (!ddmFormFieldsMap.containsKey(ddmFormFieldValue.getName())) {
iterator.remove();
}
removeStaleDDMFormFieldValues(
ddmFormFieldsMap,
ddmFormFieldValue.getNestedDDMFormFieldValues());
}
}
private DDMFormEvaluationResult _createDDMFormEvaluationResult() {
try {
DDMFormEvaluatorContext ddmFormEvaluatorContext =
new DDMFormEvaluatorContext(_ddmForm, _ddmFormValues, _locale);
ddmFormEvaluatorContext.addProperty(
"groupId", _ddmFormRenderingContext.getGroupId());
ddmFormEvaluatorContext.addProperty(
"request", _ddmFormRenderingContext.getHttpServletRequest());
return _ddmFormEvaluator.evaluate(ddmFormEvaluatorContext);
}
catch (DDMFormEvaluationException ddmfee) {
_log.error("Unable to evaluate the form", ddmfee);
throw new IllegalStateException(
"Unexpected error occurred during form evaluation", ddmfee);
}
}
private static final Log _log = LogFactoryUtil.getLog(
DDMFormPagesTemplateContextFactory.class);
private final DDMForm _ddmForm;
private DDMFormEvaluationResult _ddmFormEvaluationResult;
private DDMFormEvaluator _ddmFormEvaluator;
private final Map<String, DDMFormField> _ddmFormFieldsMap;
private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker;
private final Map<String, List<DDMFormFieldValue>> _ddmFormFieldValuesMap;
private final DDMFormLayout _ddmFormLayout;
private final DDMFormRenderingContext _ddmFormRenderingContext;
private final DDMFormValues _ddmFormValues;
private final Locale _locale;
}