
com.liferay.dynamic.data.mapping.io.internal.DDMFormValuesJSONDeserializerImpl Maven / Gradle / Ivy
/**
* SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/
package com.liferay.dynamic.data.mapping.io.internal;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldValueJSONDeserializer;
import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONDeserializer;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.model.UnlocalizedValue;
import com.liferay.dynamic.data.mapping.model.Value;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMap;
import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMapFactory;
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.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
/**
* @author Marcellus Tavares
*/
@Component(immediate = true, service = DDMFormValuesJSONDeserializer.class)
public class DDMFormValuesJSONDeserializerImpl
implements DDMFormValuesJSONDeserializer {
@Override
public DDMFormValues deserialize(
DDMForm ddmForm, String serializedDDMFormValues) {
DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);
try {
JSONObject jsonObject = _jsonFactory.createJSONObject(
serializedDDMFormValues);
setDDMFormValuesAvailableLocales(
jsonObject.getJSONArray("availableLanguageIds"), ddmFormValues);
setDDMFormValuesDefaultLocale(
jsonObject.getString("defaultLanguageId"), ddmFormValues);
setDDMFormFieldValues(
jsonObject.getJSONArray("fieldValues"), ddmForm, ddmFormValues);
setDDMFormLocalizedValuesDefaultLocale(ddmFormValues);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
}
return ddmFormValues;
}
@Activate
protected void activate(BundleContext bundleContext) {
_serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
bundleContext, DDMFormFieldValueJSONDeserializer.class,
"ddm.form.field.type.name");
}
@Deactivate
protected void deactivate() {
_serviceTrackerMap.close();
}
protected Set getAvailableLocales(JSONArray jsonArray) {
Set availableLocales = new HashSet<>();
if (jsonArray == null) {
return availableLocales;
}
for (int i = 0; i < jsonArray.length(); i++) {
Locale availableLocale = LocaleUtil.fromLanguageId(
jsonArray.getString(i));
availableLocales.add(availableLocale);
}
return availableLocales;
}
protected DDMFormFieldValue getDDMFormFieldValue(
JSONObject jsonObject, Map ddmFormFieldsMap) {
DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
String instanceId = jsonObject.getString("instanceId");
if (instanceId.matches("[a-zA-Z0-9]*")) {
ddmFormFieldValue.setInstanceId(instanceId);
}
ddmFormFieldValue.setName(jsonObject.getString("name"));
setDDMFormFieldValueValue(
jsonObject, ddmFormFieldsMap.get(jsonObject.getString("name")),
ddmFormFieldValue);
setNestedDDMFormFieldValues(
jsonObject.getJSONArray("nestedFieldValues"), ddmFormFieldsMap,
ddmFormFieldValue);
return ddmFormFieldValue;
}
protected DDMFormFieldValueJSONDeserializer
getDDMFormFieldValueJSONDeserializer(DDMFormField ddmFormField) {
if (ddmFormField == null) {
return null;
}
return _serviceTrackerMap.getService(ddmFormField.getType());
}
protected List getDDMFormFieldValues(
JSONArray jsonArray, Map ddmFormFieldsMap) {
List ddmFormFieldValues = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
DDMFormFieldValue ddmFormFieldValue = getDDMFormFieldValue(
jsonArray.getJSONObject(i), ddmFormFieldsMap);
ddmFormFieldValues.add(ddmFormFieldValue);
}
return ddmFormFieldValues;
}
protected LocalizedValue getLocalizedValue(JSONObject jsonObject) {
LocalizedValue localizedValue = new LocalizedValue();
Iterator itr = jsonObject.keys();
while (itr.hasNext()) {
String languageId = itr.next();
if (!isInvalidLocale(languageId)) {
localizedValue.addString(
LocaleUtil.fromLanguageId(languageId),
jsonObject.getString(languageId));
}
}
return localizedValue;
}
protected Value getValue(DDMFormField ddmFormField, JSONObject jsonObject) {
DDMFormFieldValueJSONDeserializer ddmFormFieldValueJSONDeserializer =
getDDMFormFieldValueJSONDeserializer(ddmFormField);
if (ddmFormFieldValueJSONDeserializer != null) {
return ddmFormFieldValueJSONDeserializer.deserialize(
ddmFormField, String.valueOf(jsonObject.get("value")));
}
JSONObject valueJSONObject = jsonObject.getJSONObject("value");
if (isLocalized(valueJSONObject)) {
return getLocalizedValue(valueJSONObject);
}
return new UnlocalizedValue(jsonObject.getString("value"));
}
protected boolean isInvalidLocale(String languageId) {
if (LocaleUtil.fromLanguageId(languageId, true, false) == null) {
return true;
}
return false;
}
protected boolean isLocalized(JSONObject jsonObject) {
if (jsonObject == null) {
return false;
}
Iterator keys = jsonObject.keys();
while (keys.hasNext()) {
String key = keys.next();
if (isInvalidLocale(key)) {
return false;
}
}
return true;
}
protected void setDDMFormFieldValueLocalizedValueDefaultLocale(
DDMFormFieldValue ddmFormFieldValue, Locale defaultLocale) {
Value value = ddmFormFieldValue.getValue();
if ((value != null) && value.isLocalized()) {
value.setDefaultLocale(defaultLocale);
}
for (DDMFormFieldValue nestedDDMFormFieldValue :
ddmFormFieldValue.getNestedDDMFormFieldValues()) {
setDDMFormFieldValueLocalizedValueDefaultLocale(
nestedDDMFormFieldValue, defaultLocale);
}
}
protected void setDDMFormFieldValues(
JSONArray jsonArray, DDMForm ddmForm, DDMFormValues ddmFormValues) {
List ddmFormFieldValues = getDDMFormFieldValues(
jsonArray, ddmForm.getDDMFormFieldsMap(true));
ddmFormValues.setDDMFormFieldValues(ddmFormFieldValues);
}
protected void setDDMFormFieldValueValue(
JSONObject jsonObject, DDMFormField ddmFormField,
DDMFormFieldValue ddmFormFieldValue) {
String valueString = jsonObject.getString("value", null);
if (valueString == null) {
return;
}
Value value = getValue(ddmFormField, jsonObject);
ddmFormFieldValue.setValue(value);
}
protected void setDDMFormLocalizedValuesDefaultLocale(
DDMFormValues ddmFormValues) {
for (DDMFormFieldValue ddmFormFieldValue :
ddmFormValues.getDDMFormFieldValues()) {
setDDMFormFieldValueLocalizedValueDefaultLocale(
ddmFormFieldValue, ddmFormValues.getDefaultLocale());
}
}
protected void setDDMFormValuesAvailableLocales(
JSONArray jsonArray, DDMFormValues ddmFormValues) {
Set availableLocales = getAvailableLocales(jsonArray);
ddmFormValues.setAvailableLocales(availableLocales);
}
protected void setDDMFormValuesDefaultLocale(
String defaultLanguageId, DDMFormValues ddmFormValues) {
Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
ddmFormValues.setDefaultLocale(defaultLocale);
Set availableLocales = ddmFormValues.getAvailableLocales();
if ((availableLocales != null) &&
!availableLocales.contains(defaultLocale)) {
availableLocales.add(defaultLocale);
}
}
@Reference(unbind = "-")
protected void setJSONFactory(JSONFactory jsonFactory) {
_jsonFactory = jsonFactory;
}
protected void setNestedDDMFormFieldValues(
JSONArray jsonArray, Map ddmFormFieldsMap,
DDMFormFieldValue ddmFormFieldValue) {
if ((jsonArray == null) || (jsonArray.length() == 0)) {
return;
}
List nestedDDMFormFieldValues =
getDDMFormFieldValues(jsonArray, ddmFormFieldsMap);
ddmFormFieldValue.setNestedDDMFormFields(nestedDDMFormFieldValues);
}
private static final Log _log = LogFactoryUtil.getLog(
DDMFormValuesJSONDeserializerImpl.class);
private JSONFactory _jsonFactory;
private ServiceTrackerMap
_serviceTrackerMap;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy