com.liferay.dynamic.data.mapping.io.internal.DDMFormXSDDeserializerImpl Maven / Gradle / Ivy
/**
* 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.io.DDMFormXSDDeserializer;
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.LocalizedValue;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.DocumentException;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReader;
import com.liferay.portal.kernel.xml.XPath;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Pablo Carvalho
*/
@Component(immediate = true)
public class DDMFormXSDDeserializerImpl implements DDMFormXSDDeserializer {
@Override
public DDMForm deserialize(String serializedDDMForm)
throws PortalException {
try {
Document document = _saxReader.read(serializedDDMForm);
DDMForm ddmForm = new DDMForm();
setDDMFormAvailableLocales(document.getRootElement(), ddmForm);
setDDMFormDefaultLocale(document.getRootElement(), ddmForm);
setDDMFormFields(document.getRootElement(), ddmForm);
setDDMFormLocalizedValuesDefaultLocale(ddmForm);
return ddmForm;
}
catch (DocumentException de) {
throw new PortalException(de);
}
}
protected void addOptionValueLabels(
Element dynamicElementElement, DDMFormFieldOptions ddmFormFieldOptions,
String optionValue) {
List metadataElements = dynamicElementElement.elements(
"meta-data");
for (Element metadataElement : metadataElements) {
String languageId = metadataElement.attributeValue("locale");
Locale locale = LocaleUtil.fromLanguageId(languageId);
Element labelElement = fetchMetadataEntry(metadataElement, "label");
ddmFormFieldOptions.addOptionLabel(
optionValue, locale, labelElement.getText());
}
}
protected Element fetchMetadataEntry(
Element parentElement, String entryName) {
XPath xPathSelector = _saxReader.createXPath(
"entry[@name=" + HtmlUtil.escapeXPathAttribute(entryName) +
StringPool.CLOSE_BRACKET);
return (Element)xPathSelector.selectSingleNode(parentElement);
}
protected Set getAvailableLocales(Element rootElement) {
Set availableLocales = new HashSet<>();
String availableLanguageIds = rootElement.attributeValue(
"available-locales");
for (String availableLanguageId :
StringUtil.split(availableLanguageIds)) {
Locale availableLocale = LocaleUtil.fromLanguageId(
availableLanguageId);
availableLocales.add(availableLocale);
}
return availableLocales;
}
protected DDMFormField getDDMFormField(Element dynamicElementElement) {
String name = dynamicElementElement.attributeValue("name");
String type = dynamicElementElement.attributeValue("type");
DDMFormField ddmFormField = new DDMFormField(name, type);
setDDMFormFieldDataType(dynamicElementElement, ddmFormField);
setDDMFormFieldIndexType(dynamicElementElement, ddmFormField);
setDDMFormFieldLocalizable(dynamicElementElement, ddmFormField);
setDDMFormFieldMultiple(dynamicElementElement, ddmFormField);
setDDMFormFieldNamespace(dynamicElementElement, ddmFormField);
setDDMFormFieldReadOnly(dynamicElementElement, ddmFormField);
setDDMFormFieldRepeatable(dynamicElementElement, ddmFormField);
setDDMFormFieldRequired(dynamicElementElement, ddmFormField);
setDDMFormFieldShowLabel(dynamicElementElement, ddmFormField);
List metadataElements = dynamicElementElement.elements(
"meta-data");
for (Element metadataElement : metadataElements) {
setDDMFormFieldMetadata(metadataElement, ddmFormField);
}
if (type.equals("radio") || type.equals("select")) {
setDDMFormFieldOptions(dynamicElementElement, ddmFormField);
}
else {
setNestedDDMFormField(dynamicElementElement, ddmFormField);
}
return ddmFormField;
}
protected DDMFormFieldOptions getDDMFormFieldOptions(
List dynamicElementElements) {
DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
for (Element dynamicElementElement : dynamicElementElements) {
String value = dynamicElementElement.attributeValue("value");
ddmFormFieldOptions.addOption(value);
addOptionValueLabels(
dynamicElementElement, ddmFormFieldOptions, value);
}
return ddmFormFieldOptions;
}
protected List getDDMFormFields(Element rootElement) {
List ddmFormFields = new ArrayList<>();
for (Element dynamicElement : rootElement.elements("dynamic-element")) {
DDMFormField ddmFormField = getDDMFormField(dynamicElement);
ddmFormFields.add(ddmFormField);
}
return ddmFormFields;
}
protected Locale getDefaultLocale(Element rootElement) {
String defaultLanguageId = rootElement.attributeValue("default-locale");
return LocaleUtil.fromLanguageId(defaultLanguageId);
}
protected void setDDMFormAvailableLocales(
Element rootElement, DDMForm ddmForm) {
Set availableLocales = getAvailableLocales(rootElement);
ddmForm.setAvailableLocales(availableLocales);
}
protected void setDDMFormDefaultLocale(
Element rootElement, DDMForm ddmForm) {
Locale defaultLocale = getDefaultLocale(rootElement);
ddmForm.setDefaultLocale(defaultLocale);
}
protected void setDDMFormFieldDataType(
Element dynamicElementElement, DDMFormField ddmFormField) {
String dataType = dynamicElementElement.attributeValue("dataType");
ddmFormField.setDataType(dataType);
}
protected void setDDMFormFieldIndexType(
Element dynamicElementElement, DDMFormField ddmFormField) {
String indexType = dynamicElementElement.attributeValue("indexType");
ddmFormField.setIndexType(indexType);
}
protected void setDDMFormFieldLocalizable(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean localizable = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("localizable"), true);
ddmFormField.setLocalizable(localizable);
}
protected void setDDMFormFieldLocalizedValueDefaultLocale(
LocalizedValue localizedValue, Locale defaultLocale) {
if (localizedValue == null) {
return;
}
localizedValue.setDefaultLocale(defaultLocale);
}
protected void setDDMFormFieldLocalizedValuesDefaultLocale(
DDMFormField ddmFormField, Locale defaultLocale) {
setDDMFormFieldLocalizedValueDefaultLocale(
ddmFormField.getLabel(), defaultLocale);
setDDMFormFieldLocalizedValueDefaultLocale(
ddmFormField.getPredefinedValue(), defaultLocale);
setDDMFormFieldLocalizedValueDefaultLocale(
ddmFormField.getStyle(), defaultLocale);
setDDMFormFieldLocalizedValueDefaultLocale(
ddmFormField.getTip(), defaultLocale);
DDMFormFieldOptions ddmFormFieldOptions =
ddmFormField.getDDMFormFieldOptions();
if (ddmFormFieldOptions != null) {
ddmFormFieldOptions.setDefaultLocale(defaultLocale);
}
for (DDMFormField nestedDDMFormField :
ddmFormField.getNestedDDMFormFields()) {
setDDMFormFieldLocalizedValuesDefaultLocale(
nestedDDMFormField, defaultLocale);
}
}
protected void setDDMFormFieldMetadata(
Element metadataElement, DDMFormField ddmFormField) {
String languageId = metadataElement.attributeValue("locale");
Locale locale = LocaleUtil.fromLanguageId(languageId);
Element labelElement = fetchMetadataEntry(metadataElement, "label");
if (labelElement != null) {
LocalizedValue label = ddmFormField.getLabel();
label.addString(locale, labelElement.getText());
}
Element predefinedValueElement = fetchMetadataEntry(
metadataElement, "predefinedValue");
if (predefinedValueElement != null) {
LocalizedValue predefinedValue = ddmFormField.getPredefinedValue();
predefinedValue.addString(locale, predefinedValueElement.getText());
}
Element styleElement = fetchMetadataEntry(metadataElement, "style");
if (styleElement != null) {
LocalizedValue style = ddmFormField.getStyle();
style.addString(locale, styleElement.getText());
}
Element tipElement = fetchMetadataEntry(metadataElement, "tip");
if (tipElement != null) {
LocalizedValue tip = ddmFormField.getTip();
tip.addString(locale, tipElement.getText());
}
}
protected void setDDMFormFieldMultiple(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean multiple = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("multiple"));
ddmFormField.setMultiple(multiple);
}
protected void setDDMFormFieldNamespace(
Element dynamicElementElement, DDMFormField ddmFormField) {
String fieldNamespace = dynamicElementElement.attributeValue(
"fieldNamespace");
ddmFormField.setFieldNamespace(fieldNamespace);
}
protected void setDDMFormFieldOptions(
Element dynamicElementElement, DDMFormField ddmFormField) {
DDMFormFieldOptions ddmFormFieldOptions = getDDMFormFieldOptions(
dynamicElementElement.elements("dynamic-element"));
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
}
protected void setDDMFormFieldReadOnly(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean readOnly = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("readOnly"));
ddmFormField.setReadOnly(readOnly);
}
protected void setDDMFormFieldRepeatable(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean repeatable = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("repeatable"));
ddmFormField.setRepeatable(repeatable);
}
protected void setDDMFormFieldRequired(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean required = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("required"));
ddmFormField.setRequired(required);
}
protected void setDDMFormFields(Element rootElement, DDMForm ddmForm) {
List ddmFormFields = getDDMFormFields(rootElement);
ddmForm.setDDMFormFields(ddmFormFields);
}
protected void setDDMFormFieldShowLabel(
Element dynamicElementElement, DDMFormField ddmFormField) {
boolean showLabel = GetterUtil.getBoolean(
dynamicElementElement.attributeValue("showLabel"), true);
ddmFormField.setShowLabel(showLabel);
}
protected void setDDMFormLocalizedValuesDefaultLocale(DDMForm ddmForm) {
for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
setDDMFormFieldLocalizedValuesDefaultLocale(
ddmFormField, ddmForm.getDefaultLocale());
}
}
protected void setNestedDDMFormField(
Element dynamicElementElement, DDMFormField ddmFormField) {
List nestedDDMFormFields = getDDMFormFields(
dynamicElementElement);
ddmFormField.setNestedDDMFormFields(nestedDDMFormFields);
}
@Reference(unbind = "-")
protected void setSAXReader(SAXReader saxReader) {
_saxReader = saxReader;
}
private SAXReader _saxReader;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy