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.exception.PortalException;
018    import com.liferay.portal.kernel.json.JSONArray;
019    import com.liferay.portal.kernel.json.JSONException;
020    import com.liferay.portal.kernel.json.JSONFactoryUtil;
021    import com.liferay.portal.kernel.json.JSONObject;
022    import com.liferay.portal.kernel.util.LocaleUtil;
023    import com.liferay.portal.kernel.util.Validator;
024    import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
025    import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
026    import com.liferay.portlet.dynamicdatamapping.model.DDMFormFieldOptions;
027    import com.liferay.portlet.dynamicdatamapping.model.LocalizedValue;
028    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFactory;
029    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldType;
030    import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldTypeRegistryUtil;
031    
032    import java.util.ArrayList;
033    import java.util.HashSet;
034    import java.util.Iterator;
035    import java.util.List;
036    import java.util.Locale;
037    import java.util.Set;
038    
039    /**
040     * @author Marcellus Tavares
041     */
042    public class DDMFormJSONDeserializerImpl implements DDMFormJSONDeserializer {
043    
044            @Override
045            public DDMForm deserialize(String serializedDDMForm)
046                    throws PortalException {
047    
048                    try {
049                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
050                                    serializedDDMForm);
051    
052                            DDMForm ddmForm = new DDMForm();
053    
054                            setDDMFormAvailableLocales(
055                                    jsonObject.getJSONArray("availableLanguageIds"), ddmForm);
056                            setDDMFormDefaultLocale(
057                                    jsonObject.getString("defaultLanguageId"), ddmForm);
058                            setDDMFormFields(jsonObject.getJSONArray("fields"), ddmForm);
059                            setDDMFormLocalizedValuesDefaultLocale(ddmForm);
060    
061                            return ddmForm;
062                    }
063                    catch (JSONException jsone) {
064                            throw new PortalException(jsone);
065                    }
066            }
067    
068            protected void addOptionValueLabels(
069                    JSONObject jsonObject, DDMFormFieldOptions ddmFormFieldOptions,
070                    String optionValue) {
071    
072                    Iterator<String> itr = jsonObject.keys();
073    
074                    while (itr.hasNext()) {
075                            String languageId = itr.next();
076    
077                            ddmFormFieldOptions.addOptionLabel(
078                                    optionValue, LocaleUtil.fromLanguageId(languageId),
079                                    jsonObject.getString(languageId));
080                    }
081            }
082    
083            protected DDMFormFieldOptions deserializeDDMFormFieldOptions(
084                            String serializedDDMFormFieldProperty)
085                    throws PortalException {
086    
087                    if (Validator.isNull(serializedDDMFormFieldProperty)) {
088                            return new DDMFormFieldOptions();
089                    }
090    
091                    JSONArray jsonArray = JSONFactoryUtil.createJSONArray(
092                            serializedDDMFormFieldProperty);
093    
094                    return getDDMFormFieldOptions(jsonArray);
095            }
096    
097            protected Object deserializeDDMFormFieldProperty(
098                            String serializedDDMFormFieldProperty,
099                            DDMFormField ddmFormFieldTypeSetting)
100                    throws PortalException {
101    
102                    if (ddmFormFieldTypeSetting.isLocalizable()) {
103                            return deserializeLocalizedValue(serializedDDMFormFieldProperty);
104                    }
105    
106                    String dataType = ddmFormFieldTypeSetting.getDataType();
107    
108                    if (Validator.equals(dataType, "boolean")) {
109                            return Boolean.valueOf(serializedDDMFormFieldProperty);
110                    }
111                    else if (Validator.equals(dataType, "ddm-options")) {
112                            return deserializeDDMFormFieldOptions(
113                                    serializedDDMFormFieldProperty);
114                    }
115                    else {
116                            return serializedDDMFormFieldProperty;
117                    }
118            }
119    
120            protected LocalizedValue deserializeLocalizedValue(
121                            String serializedDDMFormFieldProperty)
122                    throws PortalException {
123    
124                    LocalizedValue localizedValue = new LocalizedValue();
125    
126                    if (Validator.isNull(serializedDDMFormFieldProperty)) {
127                            return localizedValue;
128                    }
129    
130                    JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
131                            serializedDDMFormFieldProperty);
132    
133                    Iterator<String> itr = jsonObject.keys();
134    
135                    while (itr.hasNext()) {
136                            String languageId = itr.next();
137    
138                            localizedValue.addString(
139                                    LocaleUtil.fromLanguageId(languageId),
140                                    jsonObject.getString(languageId));
141                    }
142    
143                    return localizedValue;
144            }
145    
146            protected Set<Locale> getAvailableLocales(JSONArray jsonArray) {
147                    Set<Locale> availableLocales = new HashSet<>();
148    
149                    for (int i = 0; i < jsonArray.length(); i++) {
150                            Locale availableLocale = LocaleUtil.fromLanguageId(
151                                    jsonArray.getString(i));
152    
153                            availableLocales.add(availableLocale);
154                    }
155    
156                    return availableLocales;
157            }
158    
159            protected DDMFormField getDDMFormField(JSONObject jsonObject)
160                    throws PortalException {
161    
162                    String name = jsonObject.getString("name");
163                    String type = jsonObject.getString("type");
164    
165                    DDMFormField ddmFormField = new DDMFormField(name, type);
166    
167                    setDDMFormFieldProperties(jsonObject, ddmFormField);
168    
169                    setNestedDDMFormField(
170                            jsonObject.getJSONArray("nestedFields"), ddmFormField);
171    
172                    return ddmFormField;
173            }
174    
175            protected DDMFormFieldOptions getDDMFormFieldOptions(JSONArray jsonArray) {
176                    DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
177    
178                    for (int i = 0; i < jsonArray.length(); i++) {
179                            JSONObject jsonObject = jsonArray.getJSONObject(i);
180    
181                            String value = jsonObject.getString("value");
182    
183                            ddmFormFieldOptions.addOption(value);
184    
185                            addOptionValueLabels(
186                                    jsonObject.getJSONObject("label"), ddmFormFieldOptions, value);
187                    }
188    
189                    return ddmFormFieldOptions;
190            }
191    
192            protected List<DDMFormField> getDDMFormFields(JSONArray jsonArray)
193                    throws PortalException {
194    
195                    List<DDMFormField> ddmFormFields = new ArrayList<>();
196    
197                    for (int i = 0; i < jsonArray.length(); i++) {
198                            DDMFormField ddmFormField = getDDMFormField(
199                                    jsonArray.getJSONObject(i));
200    
201                            ddmFormFields.add(ddmFormField);
202                    }
203    
204                    return ddmFormFields;
205            }
206    
207            protected DDMForm getDDMFormFieldTypeSettingsDDMForm(String type) {
208                    DDMFormFieldType ddmFormFieldType =
209                            DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(type);
210    
211                    if (ddmFormFieldType == null) {
212                            ddmFormFieldType = DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(
213                                    "text");
214                    }
215    
216                    return DDMFormFactory.create(
217                            ddmFormFieldType.getDDMFormFieldTypeSettings());
218            }
219    
220            protected void setDDMFormAvailableLocales(
221                    JSONArray jsonArray, DDMForm ddmForm) {
222    
223                    Set<Locale> availableLocales = getAvailableLocales(jsonArray);
224    
225                    ddmForm.setAvailableLocales(availableLocales);
226            }
227    
228            protected void setDDMFormDefaultLocale(
229                    String defaultLanguageId, DDMForm ddmForm) {
230    
231                    Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
232    
233                    ddmForm.setDefaultLocale(defaultLocale);
234            }
235    
236            protected void setDDMFormFieldLocalizedValueDefaultLocale(
237                    LocalizedValue localizedValue, Locale defaultLocale) {
238    
239                    if (localizedValue == null) {
240                            return;
241                    }
242    
243                    localizedValue.setDefaultLocale(defaultLocale);
244            }
245    
246            protected void setDDMFormFieldLocalizedValuesDefaultLocale(
247                    DDMFormField ddmFormField, Locale defaultLocale) {
248    
249                    setDDMFormFieldLocalizedValueDefaultLocale(
250                            ddmFormField.getLabel(), defaultLocale);
251    
252                    setDDMFormFieldLocalizedValueDefaultLocale(
253                            ddmFormField.getPredefinedValue(), defaultLocale);
254    
255                    setDDMFormFieldLocalizedValueDefaultLocale(
256                            ddmFormField.getStyle(), defaultLocale);
257    
258                    setDDMFormFieldLocalizedValueDefaultLocale(
259                            ddmFormField.getTip(), defaultLocale);
260    
261                    DDMFormFieldOptions ddmFormFieldOptions =
262                            ddmFormField.getDDMFormFieldOptions();
263    
264                    if (ddmFormFieldOptions != null) {
265                            ddmFormFieldOptions.setDefaultLocale(defaultLocale);
266                    }
267    
268                    for (DDMFormField nestedDDMFormField :
269                                    ddmFormField.getNestedDDMFormFields()) {
270    
271                            setDDMFormFieldLocalizedValuesDefaultLocale(
272                                    nestedDDMFormField, defaultLocale);
273                    }
274            }
275    
276            protected void setDDMFormFieldProperties(
277                            JSONObject jsonObject, DDMFormField ddmFormField)
278                    throws PortalException {
279    
280                    DDMForm ddmFormFieldTypeSettingsDDMForm =
281                            getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType());
282    
283                    for (DDMFormField ddmFormFieldTypeSetting :
284                                    ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) {
285    
286                            setDDMFormFieldProperty(
287                                    jsonObject, ddmFormField, ddmFormFieldTypeSetting);
288                    }
289            }
290    
291            protected void setDDMFormFieldProperty(
292                            JSONObject jsonObject, DDMFormField ddmFormField,
293                            DDMFormField ddmFormFieldTypeSetting)
294                    throws PortalException {
295    
296                    String settingName = ddmFormFieldTypeSetting.getName();
297    
298                    Object deserializedDDMFormFieldProperty =
299                            deserializeDDMFormFieldProperty(
300                                    jsonObject.getString(settingName), ddmFormFieldTypeSetting);
301    
302                    ddmFormField.setProperty(settingName, deserializedDDMFormFieldProperty);
303            }
304    
305            protected void setDDMFormFields(JSONArray jsonArray, DDMForm ddmForm)
306                    throws PortalException {
307    
308                    List<DDMFormField> ddmFormFields = getDDMFormFields(jsonArray);
309    
310                    ddmForm.setDDMFormFields(ddmFormFields);
311            }
312    
313            protected void setDDMFormLocalizedValuesDefaultLocale(DDMForm ddmForm) {
314                    for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
315                            setDDMFormFieldLocalizedValuesDefaultLocale(
316                                    ddmFormField, ddmForm.getDefaultLocale());
317                    }
318            }
319    
320            protected void setNestedDDMFormField(
321                            JSONArray jsonArray, DDMFormField ddmFormField)
322                    throws PortalException {
323    
324                    if ((jsonArray == null) || (jsonArray.length() == 0)) {
325                            return;
326                    }
327    
328                    List<DDMFormField> nestedDDMFormFields = getDDMFormFields(jsonArray);
329    
330                    ddmFormField.setNestedDDMFormFields(nestedDDMFormFields);
331            }
332    
333    }