/** * 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; }