/** * 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.servlet; import com.liferay.dynamic.data.mapping.model.DDMForm; 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.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.DDMFormRule; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.model.UnlocalizedValue; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.ListUtil; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; /** * @author Marcellus Tavares */ public class DDMFormTemplateContextProcessor { public DDMFormTemplateContextProcessor(JSONObject jsonObject) { _jsonObject = jsonObject; _ddmForm = new DDMForm(); _ddmFormLayout = new DDMFormLayout(); _ddmFormValues = new DDMFormValues(_ddmForm); _locale = Locale.US; initModels(); process(); } public DDMForm getDDMForm() { return _ddmForm; } public DDMFormLayout getDDMFormLayout() { return _ddmFormLayout; } public DDMFormValues getDDMFormValues() { return _ddmFormValues; } protected void addDDMFormDDMFormField(JSONObject jsonObject) { Map<String, DDMFormField> ddmFormFields = _ddmForm.getDDMFormFieldsMap( true); String fieldName = jsonObject.getString("fieldName"); if (ddmFormFields.containsKey(fieldName)) { return; } DDMFormField ddmFormField = getDDMFormField(jsonObject); _ddmForm.addDDMFormField(ddmFormField); } protected void addDDMFormValuesDDMFormFieldValue(JSONObject jsonObject) { DDMFormFieldValue ddmFormFieldValue = getDDMFormFieldValue(jsonObject); _ddmFormValues.addDDMFormFieldValue(ddmFormFieldValue); } protected DDMFormField getDDMFormField(JSONObject jsonObject) { String name = jsonObject.getString("fieldName"); String type = jsonObject.getString("type"); DDMFormField ddmFormField = new DDMFormField(name, type); setDDMFormFieldDataProviderSettings( jsonObject.getLong("ddmDataProviderInstanceId"), jsonObject.getString("ddmDataProviderInstanceOutput"), ddmFormField); setDDMFormFieldLocalizable( jsonObject.getBoolean("localizable", false), ddmFormField); setDDMFormFieldOptions( jsonObject.getJSONArray("options"), ddmFormField); setDDMFormFieldRepeatable( jsonObject.getBoolean("repeatable", false), ddmFormField); setDDMFormFieldValidation( jsonObject.getJSONObject("validation"), ddmFormField); setDDMFormFieldVisibilityExpression( jsonObject.getString("visibilityExpression"), ddmFormField); setDDMFormFieldNestedFields( jsonObject.getJSONArray("nestedFields"), ddmFormField); return ddmFormField; } protected DDMFormFieldOptions getDDMFormFieldOptions(JSONArray jsonArray) { DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String value = jsonObject.getString("value"); String label = jsonObject.getString("label"); ddmFormFieldOptions.addOptionLabel(value, _locale, label); } return ddmFormFieldOptions; } protected DDMFormFieldValue getDDMFormFieldValue(JSONObject jsonObject) { DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue(); ddmFormFieldValue.setName(jsonObject.getString("fieldName")); ddmFormFieldValue.setInstanceId(jsonObject.getString("instanceId")); setDDMFormFieldValueValue( jsonObject.getString("value"), jsonObject.getBoolean("localizable", false), ddmFormFieldValue); setDDMFormFieldValueNestedFieldValues( jsonObject.getJSONArray("nestedFields"), ddmFormFieldValue); return ddmFormFieldValue; } protected DDMFormRule getDDMFormRule(JSONObject jsonObject) { List<String> actions = getDDMFormRuleActions( jsonObject.getJSONArray("actions")); return new DDMFormRule(jsonObject.getString("condition"), actions); } protected List<String> getDDMFormRuleActions(JSONArray jsonArray) { List<String> actions = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { actions.add(jsonArray.getString(i)); } return actions; } protected List<DDMFormRule> getDDMFormRules(JSONArray jsonArray) { List<DDMFormRule> ddmFormRules = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { DDMFormRule ddmFormRule = getDDMFormRule( jsonArray.getJSONObject(i)); ddmFormRules.add(ddmFormRule); } return ddmFormRules; } protected LocalizedValue getLocalizedValue(String value) { LocalizedValue localizedValue = new LocalizedValue(_locale); localizedValue.addString(_locale, value); return localizedValue; } protected void initModels() { setDDMFormRules(); setDDMFormValuesDefaultLocale(); setDDMFormValuesAvailableLocales(); } protected void process() { traversePages(_jsonObject.getJSONArray("pages")); } protected void setDDMFormFieldDataProviderSettings( long ddmDataProviderInstanceId, String ddmDataProviderInstanceOutput, DDMFormField ddmFormField) { ddmFormField.setProperty( "ddmDataProviderInstanceId", ddmDataProviderInstanceId); ddmFormField.setProperty( "ddmDataProviderInstanceOutput", ddmDataProviderInstanceOutput); } protected void setDDMFormFieldLocalizable( boolean localizable, DDMFormField ddmFormField) { ddmFormField.setLocalizable(localizable); } protected void setDDMFormFieldNestedFields( JSONArray jsonArray, DDMFormField ddmFormField) { if (jsonArray == null) { return; } for (int i = 0; i < jsonArray.length(); i++) { DDMFormField nestedDDMFormField = getDDMFormField( jsonArray.getJSONObject(i)); ddmFormField.addNestedDDMFormField(nestedDDMFormField); } } protected void setDDMFormFieldOptions( JSONArray jsonArray, DDMFormField ddmFormField) { if (jsonArray == null) { return; } DDMFormFieldOptions ddmFormFieldOptions = getDDMFormFieldOptions( jsonArray); ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions); } protected void setDDMFormFieldRepeatable( boolean repeatable, DDMFormField ddmFormField) { ddmFormField.setRepeatable(repeatable); } protected void setDDMFormFieldValidation( JSONObject jsonObject, DDMFormField ddmFormField) { if (jsonObject == null) { return; } DDMFormFieldValidation ddmFormFieldValidation = new DDMFormFieldValidation(); ddmFormFieldValidation.setErrorMessage( jsonObject.getString("errorMessage")); ddmFormFieldValidation.setExpression( jsonObject.getString("expression")); ddmFormField.setDDMFormFieldValidation(ddmFormFieldValidation); } protected void setDDMFormFieldValueNestedFieldValues( JSONArray jsonArray, DDMFormFieldValue ddmFormFieldValue) { if (jsonArray == null) { return; } for (int i = 0; i < jsonArray.length(); i++) { DDMFormFieldValue nestedDDMFormFieldValue = getDDMFormFieldValue( jsonArray.getJSONObject(i)); ddmFormFieldValue.addNestedDDMFormFieldValue( nestedDDMFormFieldValue); } } protected void setDDMFormFieldValueValue( String value, boolean localizable, DDMFormFieldValue ddmFormFieldValue) { if (localizable) { LocalizedValue localizedValue = getLocalizedValue(value); ddmFormFieldValue.setValue(localizedValue); } else { ddmFormFieldValue.setValue(new UnlocalizedValue(value)); } } protected void setDDMFormFieldVisibilityExpression( String visibilityExpression, DDMFormField ddmFormField) { ddmFormField.setVisibilityExpression( GetterUtil.getString(visibilityExpression)); } protected void setDDMFormRules() { List<DDMFormRule> ddmFormRules = getDDMFormRules( _jsonObject.getJSONArray("rules")); _ddmForm.setDDMFormRules(ddmFormRules); } protected void setDDMFormValuesAvailableLocales() { _ddmFormValues.addAvailableLocale(_locale); } protected void setDDMFormValuesDefaultLocale() { _ddmFormValues.setDefaultLocale(_locale); } protected void traverseColumns( JSONArray jsonArray, DDMFormLayoutRow ddmFormLayoutRow) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); DDMFormLayoutColumn ddmFormLayoutColumn = new DDMFormLayoutColumn( jsonObject.getInt("size")); traverseFields( jsonObject.getJSONArray("fields"), ddmFormLayoutColumn); ddmFormLayoutRow.addDDMFormLayoutColumn(ddmFormLayoutColumn); } } protected void traverseFields( JSONArray jsonArray, DDMFormLayoutColumn ddmFormLayoutColumn) { Set<String> ddmFormFieldNames = new LinkedHashSet<>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); addDDMFormDDMFormField(jsonObject); addDDMFormValuesDDMFormFieldValue(jsonObject); ddmFormFieldNames.add(jsonObject.getString("fieldName")); } ddmFormLayoutColumn.setDDMFormFieldNames( ListUtil.fromCollection(ddmFormFieldNames)); } protected void traversePages(JSONArray jsonArray) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); DDMFormLayoutPage ddmFormLayoutPage = new DDMFormLayoutPage(); traverseRows(jsonObject.getJSONArray("rows"), ddmFormLayoutPage); _ddmFormLayout.addDDMFormLayoutPage(ddmFormLayoutPage); } } protected void traverseRows( JSONArray jsonArray, DDMFormLayoutPage ddmFormLayoutPage) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow(); traverseColumns( jsonObject.getJSONArray("columns"), ddmFormLayoutRow); ddmFormLayoutPage.addDDMFormLayoutRow(ddmFormLayoutRow); } } private final DDMForm _ddmForm; private final DDMFormLayout _ddmFormLayout; private final DDMFormValues _ddmFormValues; private final JSONObject _jsonObject; private final Locale _locale; }