/**
* 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.configuration.admin.web.internal.util;
import com.liferay.configuration.admin.web.internal.model.ConfigurationModel;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldType;
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.dynamic.data.mapping.storage.FieldConstants;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONException;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.util.ReflectionUtil;
import com.liferay.portal.kernel.util.StringPool;
import java.io.Serializable;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Vector;
import org.osgi.service.metatype.AttributeDefinition;
/**
* @author Kamesh Sampath
* @author Raymond Augé
* @author Marcellus Tavares
*/
public class DDMFormValuesToPropertiesConverter {
public DDMFormValuesToPropertiesConverter(
ConfigurationModel configurationModel, DDMFormValues ddmFormValues,
JSONFactory jsonFactory, Locale locale) {
DDMForm ddmForm = ddmFormValues.getDDMForm();
_configurationModel = configurationModel;
_ddmFormFieldsMap = ddmForm.getDDMFormFieldsMap(false);
_ddmFormFieldValuesMap = ddmFormValues.getDDMFormFieldValuesMap();
_jsonFactory = jsonFactory;
_locale = locale;
}
public Dictionary<String, Object> getProperties() {
Dictionary<String, Object> properties = new Hashtable<>();
AttributeDefinition[] attributeDefinitions =
_configurationModel.getAttributeDefinitions(ConfigurationModel.ALL);
for (AttributeDefinition attributeDefinition : attributeDefinitions) {
Object value = null;
List<DDMFormFieldValue> ddmFormFieldValues =
_ddmFormFieldValuesMap.get(attributeDefinition.getID());
if (attributeDefinition.getCardinality() == 0) {
value = toSimpleValue(ddmFormFieldValues.get(0));
}
else if (attributeDefinition.getCardinality() > 0) {
value = toArrayValue(ddmFormFieldValues);
}
else if (attributeDefinition.getCardinality() < 0) {
value = toVectorValue(ddmFormFieldValues);
}
properties.put(attributeDefinition.getID(), value);
}
return properties;
}
protected String getDataTypeDefaultValue(String dataType) {
if (dataType.equals(FieldConstants.BOOLEAN)) {
return "false";
}
else if (dataType.equals(FieldConstants.DOUBLE) ||
dataType.equals(FieldConstants.FLOAT)) {
return "0.0";
}
else if (dataType.equals(FieldConstants.INTEGER) ||
dataType.equals(FieldConstants.LONG) ||
dataType.equals(FieldConstants.SHORT)) {
return "0";
}
return StringPool.BLANK;
}
protected String getDDMFormFieldDataType(String fieldName) {
DDMFormField ddmFormField = _ddmFormFieldsMap.get(fieldName);
return ddmFormField.getDataType();
}
protected String getDDMFormFieldType(String fieldName) {
DDMFormField ddmFormField = _ddmFormFieldsMap.get(fieldName);
return ddmFormField.getType();
}
protected String getDDMFormFieldValueString(
DDMFormFieldValue ddmFormFieldValue) {
Value value = ddmFormFieldValue.getValue();
String valueString = value.getString(_locale);
String type = getDDMFormFieldType(ddmFormFieldValue.getName());
if (type.equals(DDMFormFieldType.SELECT)) {
try {
JSONArray jsonArray = _jsonFactory.createJSONArray(valueString);
if (jsonArray.length() == 1) {
valueString = jsonArray.getString(0);
}
}
catch (JSONException jsone) {
ReflectionUtil.throwException(jsone);
}
}
String dataType = getDDMFormFieldDataType(ddmFormFieldValue.getName());
if (valueString.equals(StringPool.BLANK)) {
valueString = getDataTypeDefaultValue(dataType);
}
return valueString;
}
protected Serializable toArrayValue(
List<DDMFormFieldValue> ddmFormFieldValues) {
DDMFormFieldValue ddmFormFieldValue = ddmFormFieldValues.get(0);
String dataType = getDDMFormFieldDataType(ddmFormFieldValue.getName());
Vector<Serializable> values = toVectorValue(ddmFormFieldValues);
return FieldConstants.getSerializable(dataType, values);
}
protected Serializable toSimpleValue(DDMFormFieldValue ddmFormFieldValue) {
String dataType = getDDMFormFieldDataType(ddmFormFieldValue.getName());
String valueString = getDDMFormFieldValueString(ddmFormFieldValue);
return FieldConstants.getSerializable(dataType, valueString);
}
protected Vector<Serializable> toVectorValue(
List<DDMFormFieldValue> ddmFormFieldValues) {
Vector<Serializable> values = new Vector<>();
for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) {
values.add(toSimpleValue(ddmFormFieldValue));
}
return values;
}
private final ConfigurationModel _configurationModel;
private final Map<String, DDMFormField> _ddmFormFieldsMap;
private final Map<String, List<DDMFormFieldValue>> _ddmFormFieldValuesMap;
private final JSONFactory _jsonFactory;
private final Locale _locale;
}