/** * 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.io.internal; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldType; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeSettings; import com.liferay.dynamic.data.mapping.form.field.type.DefaultDDMFormFieldTypeSettings; import com.liferay.dynamic.data.mapping.io.DDMFormJSONSerializer; 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.DDMFormRule; import com.liferay.dynamic.data.mapping.model.DDMFormSuccessPageSettings; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.util.DDMFormFactory; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.json.JSONFactory; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Marcellus Tavares */ @Component(immediate = true) public class DDMFormJSONSerializerImpl implements DDMFormJSONSerializer { @Override public String serialize(DDMForm ddmForm) { JSONObject jsonObject = _jsonFactory.createJSONObject(); addAvailableLanguageIds(jsonObject, ddmForm.getAvailableLocales()); addDefaultLanguageId(jsonObject, ddmForm.getDefaultLocale()); addFields(jsonObject, ddmForm.getDDMFormFields()); addRules(jsonObject, ddmForm.getDDMFormRules()); addSuccessPageSettings( jsonObject, ddmForm.getDDMFormSuccessPageSettings()); return jsonObject.toString(); } protected void addAvailableLanguageIds( JSONObject jsonObject, Set<Locale> availableLocales) { JSONArray jsonArray = _jsonFactory.createJSONArray(); for (Locale availableLocale : availableLocales) { jsonArray.put(LocaleUtil.toLanguageId(availableLocale)); } jsonObject.put("availableLanguageIds", jsonArray); } protected void addDefaultLanguageId( JSONObject jsonObject, Locale defaultLocale) { jsonObject.put( "defaultLanguageId", LocaleUtil.toLanguageId(defaultLocale)); } protected void addFields( JSONObject jsonObject, List<DDMFormField> ddmFormFields) { jsonObject.put("fields", fieldsToJSONArray(ddmFormFields)); } protected void addNestedFields( JSONObject jsonObject, List<DDMFormField> nestedDDMFormFields) { if (nestedDDMFormFields.isEmpty()) { return; } jsonObject.put("nestedFields", fieldsToJSONArray(nestedDDMFormFields)); } protected void addProperties( JSONObject jsonObject, DDMFormField ddmFormField) { DDMForm ddmFormFieldTypeSettingsDDMForm = getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType()); for (DDMFormField ddmFormFieldTypeSetting : ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) { addProperty(jsonObject, ddmFormField, ddmFormFieldTypeSetting); } } protected void addProperty( JSONObject jsonObject, DDMFormField ddmFormField, DDMFormField ddmFormFieldTypeSetting) { Object property = ddmFormField.getProperty( ddmFormFieldTypeSetting.getName()); if (property == null) { return; } addProperty( jsonObject, ddmFormFieldTypeSetting.getName(), serializeDDMFormFieldProperty(property, ddmFormFieldTypeSetting)); } protected void addProperty( JSONObject jsonObject, String propertyName, Object propertyValue) { if (propertyValue == null) { return; } jsonObject.put(propertyName, propertyValue); } protected void addRules( JSONObject jsonObject, List<DDMFormRule> ddmFormRules) { if (ddmFormRules.isEmpty()) { return; } jsonObject.put("rules", rulesToJSONArray(ddmFormRules)); } protected void addSuccessPageSettings( JSONObject jsonObject, DDMFormSuccessPageSettings ddmFormSuccessPageSettings) { jsonObject.put("successPage", toJSONObject(ddmFormSuccessPageSettings)); } protected JSONArray fieldsToJSONArray(List<DDMFormField> ddmFormFields) { JSONArray jsonArray = _jsonFactory.createJSONArray(); for (DDMFormField ddmFormField : ddmFormFields) { jsonArray.put(toJSONObject(ddmFormField)); } return jsonArray; } protected DDMForm getDDMFormFieldTypeSettingsDDMForm(String type) { DDMFormFieldType ddmFormFieldType = _ddmFormFieldTypeServicesTracker.getDDMFormFieldType(type); Class<? extends DDMFormFieldTypeSettings> ddmFormFieldTypeSettings = DefaultDDMFormFieldTypeSettings.class; if (ddmFormFieldType != null) { ddmFormFieldTypeSettings = ddmFormFieldType.getDDMFormFieldTypeSettings(); } return DDMFormFactory.create(ddmFormFieldTypeSettings); } protected JSONArray optionsToJSONArray( DDMFormFieldOptions ddmFormFieldOptions) { Set<String> optionValues = ddmFormFieldOptions.getOptionsValues(); if (optionValues.isEmpty()) { return null; } JSONArray jsonArray = _jsonFactory.createJSONArray(); for (String optionValue : optionValues) { JSONObject jsonObject = _jsonFactory.createJSONObject(); jsonObject.put( "label", toJSONObject(ddmFormFieldOptions.getOptionLabels(optionValue))); jsonObject.put("value", optionValue); jsonArray.put(jsonObject); } return jsonArray; } protected JSONArray ruleActionsToJSONArray(List<String> ruleActions) { JSONArray jsonArray = _jsonFactory.createJSONArray(); for (String ruleAction : ruleActions) { jsonArray.put(ruleAction); } return jsonArray; } protected JSONArray rulesToJSONArray(List<DDMFormRule> ddmFormRules) { JSONArray jsonArray = _jsonFactory.createJSONArray(); for (DDMFormRule ddmFormRule : ddmFormRules) { jsonArray.put(toJSONObject(ddmFormRule)); } return jsonArray; } protected Object serializeDDMFormFieldProperty( Object property, DDMFormField ddmFormFieldTypeSetting) { if (ddmFormFieldTypeSetting.isLocalizable()) { return toJSONObject((LocalizedValue)property); } String dataType = ddmFormFieldTypeSetting.getDataType(); if (Objects.equals(dataType, "boolean")) { return GetterUtil.getBoolean(property); } else if (Objects.equals(dataType, "ddm-options")) { return optionsToJSONArray((DDMFormFieldOptions)property); } else if (Objects.equals( ddmFormFieldTypeSetting.getType(), "validation")) { return toJSONObject((DDMFormFieldValidation)property); } else { return String.valueOf(property); } } @Reference(unbind = "-") protected void setDDMFormFieldTypeServicesTracker( DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker) { _ddmFormFieldTypeServicesTracker = ddmFormFieldTypeServicesTracker; } @Reference(unbind = "-") protected void setJSONFactory(JSONFactory jsonFactory) { _jsonFactory = jsonFactory; } protected JSONObject toJSONObject(DDMFormField ddmFormField) { JSONObject jsonObject = _jsonFactory.createJSONObject(); addProperties(jsonObject, ddmFormField); addNestedFields(jsonObject, ddmFormField.getNestedDDMFormFields()); return jsonObject; } protected JSONObject toJSONObject( DDMFormFieldValidation ddmFormFieldValidation) { if (ddmFormFieldValidation == null) { return null; } JSONObject jsonObject = _jsonFactory.createJSONObject(); jsonObject.put( "errorMessage", ddmFormFieldValidation.getErrorMessage()); jsonObject.put("expression", ddmFormFieldValidation.getExpression()); return jsonObject; } protected JSONObject toJSONObject(DDMFormRule ddmFormRule) { JSONObject jsonObject = _jsonFactory.createJSONObject(); jsonObject.put( "actions", ruleActionsToJSONArray(ddmFormRule.getActions())); jsonObject.put("condition", ddmFormRule.getCondition()); jsonObject.put("enabled", ddmFormRule.isEnabled()); return jsonObject; } protected JSONObject toJSONObject( DDMFormSuccessPageSettings ddmFormSuccessPageSettings) { JSONObject jsonObject = _jsonFactory.createJSONObject(); jsonObject.put("body", ddmFormSuccessPageSettings.getBody()); jsonObject.put("enabled", ddmFormSuccessPageSettings.isEnabled()); jsonObject.put("title", ddmFormSuccessPageSettings.getTitle()); return jsonObject; } protected JSONObject toJSONObject(LocalizedValue localizedValue) { Map<Locale, String> values = localizedValue.getValues(); if (values.isEmpty()) { return null; } JSONObject jsonObject = _jsonFactory.createJSONObject(); for (Locale availableLocale : localizedValue.getAvailableLocales()) { jsonObject.put( LocaleUtil.toLanguageId(availableLocale), localizedValue.getString(availableLocale)); } return jsonObject; } private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker; private JSONFactory _jsonFactory; }