/**
* 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.DDMFormFieldOptions;
import com.liferay.dynamic.data.mapping.model.DDMFormFieldType;
import com.liferay.dynamic.data.mapping.model.LocalizedValue;
import com.liferay.dynamic.data.mapping.storage.FieldConstants;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.StringPool;
import java.util.Locale;
import java.util.Objects;
import java.util.ResourceBundle;
import org.osgi.service.metatype.AttributeDefinition;
import org.osgi.service.metatype.ObjectClassDefinition;
/**
* @author Kamesh Sampath
* @author Raymond Augé
* @author Marcellus Tavares
*/
public class ConfigurationModelToDDMFormConverter {
public ConfigurationModelToDDMFormConverter(
ConfigurationModel configurationModel, Locale locale,
ResourceBundle resourceBundle) {
_configurationModel = configurationModel;
_locale = locale;
_resourceBundle = resourceBundle;
}
public DDMForm getDDMForm() {
DDMForm ddmForm = new DDMForm();
ddmForm.addAvailableLocale(_locale);
ddmForm.setDefaultLocale(_locale);
addRequiredDDMFormFields(ddmForm);
addOptionalDDMFormFields(ddmForm);
return ddmForm;
}
protected void addDDMFormFields(
AttributeDefinition[] attributeDefinitions, DDMForm ddmForm,
boolean required) {
if (attributeDefinitions == null) {
return;
}
for (AttributeDefinition attributeDefinition : attributeDefinitions) {
DDMFormField ddmFormField = getDDMFormField(
attributeDefinition, required);
ddmForm.addDDMFormField(ddmFormField);
}
}
protected void addOptionalDDMFormFields(DDMForm ddmForm) {
AttributeDefinition[] optionalAttributeDefinitions =
_configurationModel.getAttributeDefinitions(
ObjectClassDefinition.OPTIONAL);
addDDMFormFields(optionalAttributeDefinitions, ddmForm, false);
}
protected void addRequiredDDMFormFields(DDMForm ddmForm) {
AttributeDefinition[] requiredAttributeDefinitions =
_configurationModel.getAttributeDefinitions(
ObjectClassDefinition.REQUIRED);
addDDMFormFields(requiredAttributeDefinitions, ddmForm, true);
}
protected DDMFormFieldOptions getDDMFieldOptions(
AttributeDefinition attributeDefinition) {
DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
String[] optionLabels = attributeDefinition.getOptionLabels();
String[] optionValues = attributeDefinition.getOptionValues();
if ((optionLabels == null) || (optionValues == null)) {
return ddmFormFieldOptions;
}
for (int i = 0; i < optionLabels.length; i++) {
ddmFormFieldOptions.addOptionLabel(
optionValues[i], _locale, translate(optionLabels[i]));
}
return ddmFormFieldOptions;
}
protected DDMFormField getDDMFormField(
AttributeDefinition attributeDefinition, boolean required) {
String type = getDDMFormFieldType(attributeDefinition);
DDMFormField ddmFormField = new DDMFormField(
attributeDefinition.getID(), type);
setDDMFormFieldDataType(attributeDefinition, ddmFormField);
setDDMFormFieldLabel(attributeDefinition, ddmFormField);
setDDMFormFieldOptions(attributeDefinition, ddmFormField);
setDDMFormFieldPredefinedValue(attributeDefinition, ddmFormField);
setDDMFormFieldRequired(attributeDefinition, ddmFormField, required);
setDDMFormFieldTip(attributeDefinition, ddmFormField);
ddmFormField.setLocalizable(true);
ddmFormField.setShowLabel(true);
setDDMFormFieldRepeatable(attributeDefinition, ddmFormField);
setDDMFormFieldDisplayStyle(ddmFormField);
return ddmFormField;
}
protected String getDDMFormFieldDataType(
AttributeDefinition attributeDefinition) {
int type = attributeDefinition.getType();
if (type == AttributeDefinition.BOOLEAN) {
return FieldConstants.BOOLEAN;
}
else if (type == AttributeDefinition.DOUBLE) {
return FieldConstants.DOUBLE;
}
else if (type == AttributeDefinition.FLOAT) {
return FieldConstants.FLOAT;
}
else if (type == AttributeDefinition.INTEGER) {
return FieldConstants.INTEGER;
}
else if (type == AttributeDefinition.LONG) {
return FieldConstants.LONG;
}
else if (type == AttributeDefinition.SHORT) {
return FieldConstants.SHORT;
}
return FieldConstants.STRING;
}
protected String getDDMFormFieldPredefinedValue(
AttributeDefinition attributeDefinition) {
String dataType = getDDMFormFieldDataType(attributeDefinition);
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 getDDMFormFieldType(
AttributeDefinition attributeDefinition) {
int type = attributeDefinition.getType();
if (type == AttributeDefinition.BOOLEAN) {
String[] optionLabels = attributeDefinition.getOptionLabels();
if (ArrayUtil.isEmpty(optionLabels)) {
return DDMFormFieldType.CHECKBOX;
}
return DDMFormFieldType.RADIO;
}
if (ArrayUtil.isNotEmpty(attributeDefinition.getOptionLabels()) ||
ArrayUtil.isNotEmpty(attributeDefinition.getOptionValues())) {
return DDMFormFieldType.SELECT;
}
return DDMFormFieldType.TEXT;
}
protected void setDDMFormFieldDataType(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
String dataType = getDDMFormFieldDataType(attributeDefinition);
ddmFormField.setDataType(dataType);
}
protected void setDDMFormFieldDisplayStyle(DDMFormField ddmFormField) {
String dataType = ddmFormField.getDataType();
if (Objects.equals(dataType, FieldConstants.STRING)) {
ddmFormField.setProperty("displayStyle", "multiline");
}
}
protected void setDDMFormFieldLabel(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
LocalizedValue label = new LocalizedValue(_locale);
label.addString(_locale, translate(attributeDefinition.getName()));
ddmFormField.setLabel(label);
}
protected void setDDMFormFieldOptions(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
DDMFormFieldOptions ddmFormFieldOptions = getDDMFieldOptions(
attributeDefinition);
ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
}
protected void setDDMFormFieldPredefinedValue(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
String type = ddmFormField.getType();
String predefinedValueString = getDDMFormFieldPredefinedValue(
attributeDefinition);
if (type.equals(DDMFormFieldType.SELECT)) {
predefinedValueString = "[\"" + predefinedValueString + "\"]";
}
LocalizedValue predefinedValue = new LocalizedValue(_locale);
predefinedValue.addString(_locale, predefinedValueString);
ddmFormField.setPredefinedValue(predefinedValue);
}
protected void setDDMFormFieldRepeatable(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
if (attributeDefinition.getCardinality() == 0) {
return;
}
ddmFormField.setRepeatable(true);
}
protected void setDDMFormFieldRequired(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField,
boolean required) {
if (DDMFormFieldType.CHECKBOX.equals(ddmFormField.getType())) {
return;
}
ddmFormField.setRequired(required);
}
protected void setDDMFormFieldTip(
AttributeDefinition attributeDefinition, DDMFormField ddmFormField) {
LocalizedValue tip = new LocalizedValue(_locale);
tip.addString(_locale, translate(attributeDefinition.getDescription()));
ddmFormField.setTip(tip);
}
protected String translate(String key) {
if ((_resourceBundle == null) || (key == null)) {
return key;
}
String value = LanguageUtil.get(_resourceBundle, key);
if (value == null) {
return key;
}
return value;
}
private final ConfigurationModel _configurationModel;
private final Locale _locale;
private final ResourceBundle _resourceBundle;
}