/** * 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.DDMFormEvaluationResult; import com.liferay.dynamic.data.mapping.form.evaluator.DDMFormFieldEvaluationResult; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTemplateContextContributor; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRendererConstants; import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderingContext; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMFormFieldOptions; import com.liferay.dynamic.data.mapping.model.DDMFormFieldValidation; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.render.DDMFormFieldRenderingContext; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.portal.kernel.language.LanguageConstants; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.KeyValuePair; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; /** * @author Marcellus Tavares */ public class DDMFormFieldTemplateContextFactory { public DDMFormFieldTemplateContextFactory( Map<String, DDMFormField> ddmFormFieldsMap, DDMFormEvaluationResult ddmFormEvaluationResult, List<DDMFormFieldValue> ddmFormFieldValues, DDMFormRenderingContext ddmFormRenderingContext) { _ddmFormFieldsMap = ddmFormFieldsMap; _ddmFormEvaluationResult = ddmFormEvaluationResult; _ddmFormFieldValues = ddmFormFieldValues; _ddmFormRenderingContext = ddmFormRenderingContext; _locale = ddmFormRenderingContext.getLocale(); } public List<Object> create() { return createDDMFormFieldTemplateContexts( _ddmFormFieldValues, StringPool.BLANK); } protected DDMFormFieldRenderingContext createDDDMFormFieldRenderingContext( Map<String, Object> ddmFormFieldTemplateContext) { DDMFormFieldRenderingContext ddmFormFieldRenderingContext = new DDMFormFieldRenderingContext(); ddmFormFieldRenderingContext.setHttpServletRequest( _ddmFormRenderingContext.getHttpServletRequest()); ddmFormFieldRenderingContext.setHttpServletResponse( _ddmFormRenderingContext.getHttpServletResponse()); ddmFormFieldRenderingContext.setLocale(_locale); ddmFormFieldRenderingContext.setPortletNamespace( _ddmFormRenderingContext.getPortletNamespace()); ddmFormFieldRenderingContext.setProperties(ddmFormFieldTemplateContext); return ddmFormFieldRenderingContext; } protected Map<String, Object> createDDMFormFieldTemplateContext() { Map<String, Object> ddmFormFieldTemplateContext = new HashMap<>(); ddmFormFieldTemplateContext.put("label", StringPool.BLANK); ddmFormFieldTemplateContext.put("value", StringPool.BLANK); return ddmFormFieldTemplateContext; } protected Map<String, Object> createDDMFormFieldTemplateContext( DDMFormFieldValue ddmFormFieldValue, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult, int index, String parentDDMFormFieldParameterName) { Map<String, Object> ddmFormFieldTemplateContext = createDDMFormFieldTemplateContext(); DDMFormField ddmFormField = _ddmFormFieldsMap.get( ddmFormFieldValue.getName()); setDDMFormFieldTemplateContextDataType( ddmFormFieldTemplateContext, ddmFormField.getDataType()); setDDMFormFieldTemplateContextDataProviderSettings( ddmFormFieldTemplateContext, _ddmFormRenderingContext.getProperty("dataProviderSettings"), ddmFormFieldValue.getName()); setDDMFormFieldTemplateContextDir(ddmFormFieldTemplateContext); setDDMFormFieldTemplateContextEvaluable( ddmFormFieldTemplateContext, ddmFormFieldEvaluationResult, ddmFormField.getProperty("evaluable")); setDDMFormFieldTemplateContextFieldName( ddmFormFieldTemplateContext, ddmFormFieldValue.getName()); setDDMFormFieldTemplateContextInstanceId( ddmFormFieldTemplateContext, ddmFormFieldValue.getInstanceId()); setDDMFormFieldTemplateContextLocalizedValue( ddmFormFieldTemplateContext, "label", ddmFormField.getLabel()); setDDMFormFieldTemplateContextLocalizable( ddmFormFieldTemplateContext, ddmFormField.isLocalizable()); setDDMFormFieldTemplateContextLocalizedValue( ddmFormFieldTemplateContext, "tip", ddmFormField.getTip()); String ddmFormFieldParameterName = getDDMFormFieldParameterName( ddmFormFieldValue.getName(), ddmFormFieldValue.getInstanceId(), index, parentDDMFormFieldParameterName); setDDMFormFieldTemplateContextName( ddmFormFieldTemplateContext, ddmFormFieldParameterName); Map<String, Object> nestedDDMFormFieldTemplateContext = createNestedDDMFormFieldTemplateContext( ddmFormFieldValue, ddmFormFieldParameterName); setDDMFormFieldTemplateContextNestedTemplateContexts( ddmFormFieldTemplateContext, nestedDDMFormFieldTemplateContext); setDDMFormFieldTemplateContextOptions( ddmFormFieldTemplateContext, ddmFormFieldEvaluationResult, ddmFormField.getDDMFormFieldOptions()); setDDMFormFieldTemplateContextReadOnly( ddmFormFieldTemplateContext, ddmFormFieldEvaluationResult); setDDMFormFieldTemplateContextRepeatable( ddmFormFieldTemplateContext, ddmFormField.isRepeatable()); setDDMFormFieldTemplateContextRequired( ddmFormFieldTemplateContext, ddmFormFieldEvaluationResult); setDDMFormFieldTemplateContextShowLabel( ddmFormFieldTemplateContext, ddmFormField.isShowLabel()); setDDMFormFieldTemplateContextType( ddmFormFieldTemplateContext, ddmFormField.getType()); setDDMFormFieldTemplateContextValid( ddmFormFieldEvaluationResult, ddmFormFieldTemplateContext); setDDMFormFieldTemplateContextValue( ddmFormFieldEvaluationResult, ddmFormFieldTemplateContext, ddmFormFieldValue.getValue()); setDDMFormFieldTemplateContextValueLocalizableValue( ddmFormFieldTemplateContext, ddmFormFieldValue.getValue()); setDDMFormFieldTemplateContextValidation( ddmFormFieldTemplateContext, ddmFormField.getDDMFormFieldValidation()); setDDMFormFieldTemplateContextVisibilityExpression( ddmFormFieldTemplateContext, ddmFormField.getVisibilityExpression()); setDDMFormFieldTemplateContextVisible( ddmFormFieldTemplateContext, ddmFormFieldEvaluationResult); // Contributed template parameters setDDMFormFieldTemplateContextContributedParameters( ddmFormFieldTemplateContext, ddmFormField); return ddmFormFieldTemplateContext; } protected List<Object> createDDMFormFieldTemplateContexts( List<DDMFormFieldValue> ddmFormFieldValues, String parentDDMFormFieldParameterName) { List<Object> ddmFormFieldTemplateContexts = new ArrayList<>(); int index = 0; for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) { DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult = _getDDMFormFieldEvaluationResult(ddmFormFieldValue); Object ddmFormFieldTemplateContext = createDDMFormFieldTemplateContext( ddmFormFieldValue, ddmFormFieldEvaluationResult, index++, parentDDMFormFieldParameterName); ddmFormFieldTemplateContexts.add(ddmFormFieldTemplateContext); } return ddmFormFieldTemplateContexts; } protected Map<String, Object> createNestedDDMFormFieldTemplateContext( DDMFormFieldValue parentDDMFormFieldValue, String parentDDMFormFieldParameterName) { Map<String, Object> nestedDDMFormFieldTemplateContext = new HashMap<>(); Map<String, List<DDMFormFieldValue>> nestedDDMFormFieldValuesMap = parentDDMFormFieldValue.getNestedDDMFormFieldValuesMap(); for (DDMFormFieldValue nestedDDMFormFieldValue : parentDDMFormFieldValue.getNestedDDMFormFieldValues()) { List<DDMFormFieldValue> nestedDDMFormFieldValues = nestedDDMFormFieldValuesMap.get( nestedDDMFormFieldValue.getName()); nestedDDMFormFieldTemplateContext.put( nestedDDMFormFieldValue.getName(), createDDMFormFieldTemplateContexts( nestedDDMFormFieldValues, parentDDMFormFieldParameterName)); } return nestedDDMFormFieldTemplateContext; } protected List<Map<String, String>> createOptions( DDMFormFieldOptions ddmFormFieldOptions) { List<Map<String, String>> list = new ArrayList<>(); Map<String, LocalizedValue> options = ddmFormFieldOptions.getOptions(); for (Entry<String, LocalizedValue> entry : options.entrySet()) { Map<String, String> option = new HashMap<>(); LocalizedValue localizedValue = entry.getValue(); option.put("label", localizedValue.getString(_locale)); option.put("value", entry.getKey()); list.add(option); } return list; } protected List<Map<String, String>> createOptions( List<KeyValuePair> keyValuePairs) { List<Map<String, String>> list = new ArrayList<>(); for (KeyValuePair keyValuePair : keyValuePairs) { Map<String, String> option = new HashMap<>(); option.put("label", keyValuePair.getValue()); option.put("value", keyValuePair.getKey()); list.add(option); } return list; } protected String getAffixedDDMFormFieldParameterName( String ddmFormFieldParameterName) { StringBundler sb = new StringBundler(5); sb.append(_ddmFormRenderingContext.getPortletNamespace()); sb.append(DDMFormRendererConstants.DDM_FORM_FIELD_NAME_PREFIX); sb.append(ddmFormFieldParameterName); sb.append( DDMFormRendererConstants.DDM_FORM_FIELD_LANGUAGE_ID_SEPARATOR); sb.append(LocaleUtil.toLanguageId(_locale)); return sb.toString(); } protected String getDDMFormFieldParameterName( String ddmFormFieldName, String instanceId, int index, String parentDDMFormFieldParameterName) { StringBundler sb = new StringBundler(7); if (Validator.isNotNull(parentDDMFormFieldParameterName)) { sb.append(parentDDMFormFieldParameterName); sb.append(DDMFormRendererConstants.DDM_FORM_FIELDS_SEPARATOR); } sb.append(ddmFormFieldName); sb.append(DDMFormRendererConstants.DDM_FORM_FIELD_PARTS_SEPARATOR); sb.append(instanceId); sb.append(DDMFormRendererConstants.DDM_FORM_FIELD_PARTS_SEPARATOR); sb.append(index); return sb.toString(); } protected void setDDMFormFieldTemplateContextContributedParameters( Map<String, Object> ddmFormFieldTemplateContext, DDMFormField ddmFormField) { DDMFormFieldTemplateContextContributor ddmFormFieldTemplateContextContributor = _ddmFormFieldTypeServicesTracker. getDDMFormFieldTemplateContextContributor( ddmFormField.getType()); if (ddmFormFieldTemplateContextContributor == null) { return; } DDMFormFieldRenderingContext ddmFormFieldRenderingContext = createDDDMFormFieldRenderingContext(ddmFormFieldTemplateContext); Map<String, Object> contributedParameters = ddmFormFieldTemplateContextContributor.getParameters( ddmFormField, ddmFormFieldRenderingContext); if ((contributedParameters == null) || contributedParameters.isEmpty()) { return; } ddmFormFieldTemplateContext.putAll(contributedParameters); } protected void setDDMFormFieldTemplateContextDataProviderSettings( Map<String, Object> ddmFormFieldTemplateContext, Map<String, Map<String, Object>> dataProviderSettings, String fieldName) { if ((dataProviderSettings == null) || !dataProviderSettings.containsKey(fieldName)) { return; } ddmFormFieldTemplateContext.put( "dataProviderSettings", dataProviderSettings.get(fieldName)); } protected void setDDMFormFieldTemplateContextDataType( Map<String, Object> ddmFormFieldTemplateContext, String dataType) { ddmFormFieldTemplateContext.put("dataType", dataType); } protected void setDDMFormFieldTemplateContextDir( Map<String, Object> ddmFormFieldTemplateContext) { ddmFormFieldTemplateContext.put( "dir", LanguageUtil.get(_locale, LanguageConstants.KEY_DIR)); } protected void setDDMFormFieldTemplateContextEvaluable( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult, Object evaluable) { if (ddmFormFieldEvaluationResult.isRequired()) { ddmFormFieldTemplateContext.put("evaluable", true); return; } if (evaluable == null) { return; } ddmFormFieldTemplateContext.put("evaluable", evaluable); } protected void setDDMFormFieldTemplateContextFieldName( Map<String, Object> ddmFormFieldTemplateContext, String fieldName) { ddmFormFieldTemplateContext.put("fieldName", fieldName); } protected void setDDMFormFieldTemplateContextInstanceId( Map<String, Object> ddmFormFieldTemplateContext, String instanceId) { ddmFormFieldTemplateContext.put("instanceId", instanceId); } protected void setDDMFormFieldTemplateContextLocalizable( Map<String, Object> ddmFormFieldTemplateContext, boolean localizable) { ddmFormFieldTemplateContext.put("localizable", localizable); } protected void setDDMFormFieldTemplateContextLocalizedValue( Map<String, Object> ddmFormFieldTemplateContext, String propertyName, LocalizedValue localizedValue) { Map<Locale, String> values = localizedValue.getValues(); if (values.isEmpty()) { return; } ddmFormFieldTemplateContext.put( propertyName, localizedValue.getString(_locale)); } protected void setDDMFormFieldTemplateContextName( Map<String, Object> ddmFormFieldTemplateContext, String ddmFormFieldParameterName) { String name = getAffixedDDMFormFieldParameterName( ddmFormFieldParameterName); ddmFormFieldTemplateContext.put("name", name); } protected void setDDMFormFieldTemplateContextNestedTemplateContexts( Map<String, Object> ddmFormFieldRenderingContext, Map<String, Object> nestedDDMFormFieldTemplateContexts) { if (nestedDDMFormFieldTemplateContexts.isEmpty()) { return; } ddmFormFieldRenderingContext.put( "nestedFields", nestedDDMFormFieldTemplateContexts); } protected void setDDMFormFieldTemplateContextOptions( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult, DDMFormFieldOptions ddmFormFieldOptions) { List<KeyValuePair> keyValuePairs = ddmFormFieldEvaluationResult.getProperty("options"); if (ListUtil.isNotEmpty(keyValuePairs)) { ddmFormFieldTemplateContext.put( "options", createOptions(keyValuePairs)); } else { ddmFormFieldTemplateContext.put( "options", createOptions(ddmFormFieldOptions)); } } protected void setDDMFormFieldTemplateContextReadOnly( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult) { boolean readOnly = ddmFormFieldEvaluationResult.isReadOnly(); if (_ddmFormRenderingContext.isReadOnly()) { readOnly = true; } ddmFormFieldTemplateContext.put("readOnly", readOnly); } protected void setDDMFormFieldTemplateContextRepeatable( Map<String, Object> ddmFormFieldTemplateContext, boolean repeatable) { ddmFormFieldTemplateContext.put("repeatable", repeatable); } protected void setDDMFormFieldTemplateContextRequired( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult) { ddmFormFieldTemplateContext.put( "required", ddmFormFieldEvaluationResult.isRequired()); } protected void setDDMFormFieldTemplateContextShowLabel( Map<String, Object> ddmFormFieldTemplateContext, boolean showLabel) { ddmFormFieldTemplateContext.put("showLabel", showLabel); } protected void setDDMFormFieldTemplateContextType( Map<String, Object> ddmFormFieldTemplateContext, String type) { ddmFormFieldTemplateContext.put("type", type); } protected void setDDMFormFieldTemplateContextValid( DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult, Map<String, Object> ddmFormFieldTemplateContext) { ddmFormFieldTemplateContext.put( "errorMessage", ddmFormFieldEvaluationResult.getErrorMessage()); ddmFormFieldTemplateContext.put( "valid", ddmFormFieldEvaluationResult.isValid()); } protected void setDDMFormFieldTemplateContextValidation( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldValidation ddmFormFieldValidation) { if (ddmFormFieldValidation == null) { return; } Map<String, String> validation = new HashMap<>(); validation.put( "errorMessage", GetterUtil.getString(ddmFormFieldValidation.getErrorMessage())); validation.put( "expression", GetterUtil.getString(ddmFormFieldValidation.getExpression())); ddmFormFieldTemplateContext.put("validation", validation); } protected void setDDMFormFieldTemplateContextValue( DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult, Map<String, Object> ddmFormFieldTemplateContext, Value value) { if (ddmFormFieldEvaluationResult.getValue() != null) { Object evaluationResultValue = ddmFormFieldEvaluationResult.getValue(); ddmFormFieldTemplateContext.put( "value", evaluationResultValue.toString()); } else if (value != null) { ddmFormFieldTemplateContext.put("value", value.getString(_locale)); } } protected void setDDMFormFieldTemplateContextValueLocalizableValue( Map<String, Object> ddmFormFieldTemplateContext, Value value) { if ((value == null) || !(value instanceof LocalizedValue)) { return; } Map<String, String> localizedValue = new HashMap<>(); for (Locale availableLocale : value.getAvailableLocales()) { localizedValue.put( LanguageUtil.getLanguageId(availableLocale), value.getString(availableLocale)); } ddmFormFieldTemplateContext.put("localizedValue", localizedValue); } protected void setDDMFormFieldTemplateContextVisibilityExpression( Map<String, Object> ddmFormFieldTemplateContext, String visibilityExpression) { ddmFormFieldTemplateContext.put( "visibilityExpression", visibilityExpression); } protected void setDDMFormFieldTemplateContextVisible( Map<String, Object> ddmFormFieldTemplateContext, DDMFormFieldEvaluationResult ddmFormFieldEvaluationResult) { ddmFormFieldTemplateContext.put( "visible", ddmFormFieldEvaluationResult.isVisible()); } protected void setDDMFormFieldTypeServicesTracker( DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker) { _ddmFormFieldTypeServicesTracker = ddmFormFieldTypeServicesTracker; } private DDMFormFieldEvaluationResult _getDDMFormFieldEvaluationResult( DDMFormFieldValue ddmFormFieldValue) { return _ddmFormEvaluationResult.geDDMFormFieldEvaluationResult( ddmFormFieldValue.getName(), ddmFormFieldValue.getInstanceId()); } private final DDMFormEvaluationResult _ddmFormEvaluationResult; private final Map<String, DDMFormField> _ddmFormFieldsMap; private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker; private final List<DDMFormFieldValue> _ddmFormFieldValues; private final DDMFormRenderingContext _ddmFormRenderingContext; private final Locale _locale; }