001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.dynamicdatamapping.io;
016    
017    import com.liferay.portal.kernel.json.JSONArray;
018    import com.liferay.portal.kernel.json.JSONFactoryUtil;
019    import com.liferay.portal.kernel.json.JSONObject;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.LocaleUtil;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
024    import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
025    import com.liferay.portlet.dynamicdatamapping.model.DDMFormFieldOptions;
026    import com.liferay.portlet.dynamicdatamapping.model.LocalizedValue;
027    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFactory;
028    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldType;
029    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldTypeRegistryUtil;
030    
031    import java.util.List;
032    import java.util.Locale;
033    import java.util.Map;
034    import java.util.Set;
035    
036    /**
037     * @author Marcellus Tavares
038     */
039    public class DDMFormJSONSerializerImpl implements DDMFormJSONSerializer {
040    
041            @Override
042            public String serialize(DDMForm ddmForm) {
043                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
044    
045                    addAvailableLanguageIds(jsonObject, ddmForm.getAvailableLocales());
046                    addDefaultLanguageId(jsonObject, ddmForm.getDefaultLocale());
047                    addFields(jsonObject, ddmForm.getDDMFormFields());
048    
049                    return jsonObject.toString();
050            }
051    
052            protected void addAvailableLanguageIds(
053                    JSONObject jsonObject, Set<Locale> availableLocales) {
054    
055                    JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
056    
057                    for (Locale availableLocale : availableLocales) {
058                            jsonArray.put(LocaleUtil.toLanguageId(availableLocale));
059                    }
060    
061                    jsonObject.put("availableLanguageIds", jsonArray);
062            }
063    
064            protected void addDefaultLanguageId(
065                    JSONObject jsonObject, Locale defaultLocale) {
066    
067                    jsonObject.put(
068                            "defaultLanguageId", LocaleUtil.toLanguageId(defaultLocale));
069            }
070    
071            protected void addFields(
072                    JSONObject jsonObject, List<DDMFormField> ddmFormFields) {
073    
074                    jsonObject.put("fields", toJSONArray(ddmFormFields));
075            }
076    
077            protected void addNestedFields(
078                    JSONObject jsonObject, List<DDMFormField> nestedDDMFormFields) {
079    
080                    if (nestedDDMFormFields.isEmpty()) {
081                            return;
082                    }
083    
084                    jsonObject.put("nestedFields", toJSONArray(nestedDDMFormFields));
085            }
086    
087            protected void addProperties(
088                    JSONObject jsonObject, DDMFormField ddmFormField) {
089    
090                    DDMForm ddmFormFieldTypeSettingsDDMForm =
091                            getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType());
092    
093                    for (DDMFormField ddmFormFieldTypeSetting :
094                                    ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) {
095    
096                            addProperty(jsonObject, ddmFormField, ddmFormFieldTypeSetting);
097                    }
098            }
099    
100            protected void addProperty(
101                    JSONObject jsonObject, DDMFormField ddmFormField,
102                    DDMFormField ddmFormFieldTypeSetting) {
103    
104                    Object property = ddmFormField.getProperty(
105                            ddmFormFieldTypeSetting.getName());
106    
107                    if (property == null) {
108                            return;
109                    }
110    
111                    addProperty(
112                            jsonObject, ddmFormFieldTypeSetting.getName(),
113                            serializeDDMFormFieldProperty(property, ddmFormFieldTypeSetting));
114            }
115    
116            protected void addProperty(
117                    JSONObject jsonObject, String propertyName, Object propertyValue) {
118    
119                    if (propertyValue == null) {
120                            return;
121                    }
122    
123                    jsonObject.put(propertyName, propertyValue);
124            }
125    
126            protected DDMForm getDDMFormFieldTypeSettingsDDMForm(String type) {
127                    DDMFormFieldType ddmFormFieldType =
128                            DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(type);
129    
130                    if (ddmFormFieldType == null) {
131                            ddmFormFieldType = DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(
132                                    "text");
133                    }
134    
135                    return DDMFormFactory.create(
136                            ddmFormFieldType.getDDMFormFieldTypeSettings());
137            }
138    
139            protected Object serializeDDMFormFieldProperty(
140                    Object property, DDMFormField ddmFormFieldTypeSetting) {
141    
142                    if (ddmFormFieldTypeSetting.isLocalizable()) {
143                            return toJSONObject((LocalizedValue)property);
144                    }
145    
146                    String dataType = ddmFormFieldTypeSetting.getDataType();
147    
148                    if (Validator.equals(dataType, "boolean")) {
149                            return GetterUtil.getBoolean(property);
150                    }
151                    else if (Validator.equals(dataType, "ddm-options")) {
152                            return toJSONArray((DDMFormFieldOptions)property);
153                    }
154                    else {
155                            return String.valueOf(property);
156                    }
157            }
158    
159            protected JSONArray toJSONArray(DDMFormFieldOptions ddmFormFieldOptions) {
160                    Set<String> optionValues = ddmFormFieldOptions.getOptionsValues();
161    
162                    if (optionValues.isEmpty()) {
163                            return null;
164                    }
165    
166                    JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
167    
168                    for (String optionValue : optionValues) {
169                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
170    
171                            jsonObject.put("value", optionValue);
172                            jsonObject.put(
173                                    "label",
174                                    toJSONObject(ddmFormFieldOptions.getOptionLabels(optionValue)));
175    
176                            jsonArray.put(jsonObject);
177                    }
178    
179                    return jsonArray;
180            }
181    
182            protected JSONArray toJSONArray(List<DDMFormField> ddmFormFields) {
183                    JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
184    
185                    for (DDMFormField ddmFormField : ddmFormFields) {
186                            jsonArray.put(toJSONObject(ddmFormField));
187                    }
188    
189                    return jsonArray;
190            }
191    
192            protected JSONObject toJSONObject(DDMFormField ddmFormField) {
193                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
194    
195                    addProperties(jsonObject, ddmFormField);
196    
197                    addNestedFields(jsonObject, ddmFormField.getNestedDDMFormFields());
198    
199                    return jsonObject;
200            }
201    
202            protected JSONObject toJSONObject(LocalizedValue localizedValue) {
203                    Map<Locale, String> values = localizedValue.getValues();
204    
205                    if (values.isEmpty()) {
206                            return null;
207                    }
208    
209                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
210    
211                    for (Locale availableLocale : localizedValue.getAvailableLocales()) {
212                            jsonObject.put(
213                                    LocaleUtil.toLanguageId(availableLocale),
214                                    localizedValue.getString(availableLocale));
215                    }
216    
217                    return jsonObject;
218            }
219    
220    }