/** * 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.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.LocalizedValue; import com.liferay.dynamic.data.mapping.util.DDMFormFactory; import com.liferay.portal.kernel.exception.PortalException; 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.LocaleUtil; import com.liferay.portal.kernel.util.Validator; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; /** * @author Marcellus Tavares */ public class JSONObjectToDDMFormFieldTransformer { public JSONObjectToDDMFormFieldTransformer( DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker, JSONFactory jsonFactory) { _ddmFormFieldTypeServicesTracker = ddmFormFieldTypeServicesTracker; _jsonFactory = jsonFactory; } public DDMFormField transform(JSONObject jsonObject) throws PortalException { DDMFormField ddmFormField = getDDMFormField(jsonObject); return ddmFormField; } protected void addOptionValueLabels( JSONObject jsonObject, DDMFormFieldOptions ddmFormFieldOptions, String optionValue) { Iterator<String> itr = jsonObject.keys(); while (itr.hasNext()) { String languageId = itr.next(); ddmFormFieldOptions.addOptionLabel( optionValue, LocaleUtil.fromLanguageId(languageId), jsonObject.getString(languageId)); } } protected DDMFormFieldOptions deserializeDDMFormFieldOptions( String serializedDDMFormFieldProperty) throws PortalException { if (Validator.isNull(serializedDDMFormFieldProperty)) { return new DDMFormFieldOptions(); } JSONArray jsonArray = _jsonFactory.createJSONArray( serializedDDMFormFieldProperty); return getDDMFormFieldOptions(jsonArray); } protected Object deserializeDDMFormFieldProperty( String serializedDDMFormFieldProperty, DDMFormField ddmFormFieldTypeSetting) throws PortalException { if (ddmFormFieldTypeSetting.isLocalizable()) { return deserializeLocalizedValue(serializedDDMFormFieldProperty); } String dataType = ddmFormFieldTypeSetting.getDataType(); if (Objects.equals(dataType, "boolean")) { return Boolean.valueOf(serializedDDMFormFieldProperty); } else if (Objects.equals(dataType, "ddm-options")) { return deserializeDDMFormFieldOptions( serializedDDMFormFieldProperty); } else if (Objects.equals( ddmFormFieldTypeSetting.getType(), "validation")) { return deserializeDDMFormFieldValidation( serializedDDMFormFieldProperty); } else { return serializedDDMFormFieldProperty; } } protected DDMFormFieldValidation deserializeDDMFormFieldValidation( String serializedDDMFormFieldProperty) throws PortalException { DDMFormFieldValidation ddmFormFieldValidation = new DDMFormFieldValidation(); if (Validator.isNull(serializedDDMFormFieldProperty)) { return ddmFormFieldValidation; } JSONObject jsonObject = _jsonFactory.createJSONObject( serializedDDMFormFieldProperty); ddmFormFieldValidation.setExpression( jsonObject.getString("expression")); ddmFormFieldValidation.setErrorMessage( jsonObject.getString("errorMessage")); return ddmFormFieldValidation; } protected LocalizedValue deserializeLocalizedValue( String serializedDDMFormFieldProperty) throws PortalException { LocalizedValue localizedValue = new LocalizedValue(); if (Validator.isNull(serializedDDMFormFieldProperty)) { return localizedValue; } JSONObject jsonObject = _jsonFactory.createJSONObject( serializedDDMFormFieldProperty); Iterator<String> itr = jsonObject.keys(); while (itr.hasNext()) { String languageId = itr.next(); localizedValue.addString( LocaleUtil.fromLanguageId(languageId), jsonObject.getString(languageId)); } return localizedValue; } protected DDMFormField getDDMFormField(JSONObject jsonObject) throws PortalException { String name = jsonObject.getString("name"); String type = jsonObject.getString("type"); DDMFormField ddmFormField = new DDMFormField(name, type); setDDMFormFieldProperties(jsonObject, ddmFormField); setNestedDDMFormField( 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"); ddmFormFieldOptions.addOption(value); addOptionValueLabels( jsonObject.getJSONObject("label"), ddmFormFieldOptions, value); } return ddmFormFieldOptions; } protected List<DDMFormField> getDDMFormFields(JSONArray jsonArray) throws PortalException { List<DDMFormField> ddmFormFields = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { DDMFormField ddmFormField = getDDMFormField( jsonArray.getJSONObject(i)); ddmFormFields.add(ddmFormField); } return ddmFormFields; } 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 void setDDMFormFieldProperties( JSONObject jsonObject, DDMFormField ddmFormField) throws PortalException { DDMForm ddmFormFieldTypeSettingsDDMForm = getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType()); for (DDMFormField ddmFormFieldTypeSetting : ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) { setDDMFormFieldProperty( jsonObject, ddmFormField, ddmFormFieldTypeSetting); } } protected void setDDMFormFieldProperty( JSONObject jsonObject, DDMFormField ddmFormField, DDMFormField ddmFormFieldTypeSetting) throws PortalException { String settingName = ddmFormFieldTypeSetting.getName(); if (jsonObject.has(settingName)) { Object deserializedDDMFormFieldProperty = deserializeDDMFormFieldProperty( jsonObject.getString(settingName), ddmFormFieldTypeSetting); ddmFormField.setProperty( settingName, deserializedDDMFormFieldProperty); } } protected void setNestedDDMFormField( JSONArray jsonArray, DDMFormField ddmFormField) throws PortalException { if ((jsonArray == null) || (jsonArray.length() == 0)) { return; } List<DDMFormField> nestedDDMFormFields = getDDMFormFields(jsonArray); ddmFormField.setNestedDDMFormFields(nestedDDMFormFields); } private final DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker; private final JSONFactory _jsonFactory; }