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.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    
028    import java.util.ArrayList;
029    import java.util.HashSet;
030    import java.util.Iterator;
031    import java.util.List;
032    import java.util.Locale;
033    import java.util.Set;
034    
035    /**
036     * @author Marcellus Tavares
037     */
038    public class DDMFormJSONDeserializerImpl implements DDMFormJSONDeserializer {
039    
040            @Override
041            public DDMForm deserialize(String serializedDDMForm)
042                    throws PortalException {
043    
044                    try {
045                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
046                                    serializedDDMForm);
047    
048                            DDMForm ddmForm = new DDMForm();
049    
050                            setDDMFormAvailableLocales(
051                                    jsonObject.getJSONArray("availableLanguageIds"), ddmForm);
052                            setDDMFormDefaultLocale(
053                                    jsonObject.getString("defaultLanguageId"), ddmForm);
054                            setDDMFormFields(jsonObject.getJSONArray("fields"), ddmForm);
055                            setDDMFormLocalizedValuesDefaultLocale(ddmForm);
056    
057                            return ddmForm;
058                    }
059                    catch (JSONException jsone) {
060                            throw new PortalException(jsone);
061                    }
062            }
063    
064            protected void addOptionValueLabels(
065                    JSONObject jsonObject, DDMFormFieldOptions ddmFormFieldOptions,
066                    String optionValue) {
067    
068                    Iterator<String> itr = jsonObject.keys();
069    
070                    while (itr.hasNext()) {
071                            String languageId = itr.next();
072    
073                            ddmFormFieldOptions.addOptionLabel(
074                                    optionValue, LocaleUtil.fromLanguageId(languageId),
075                                    jsonObject.getString(languageId));
076                    }
077            }
078    
079            protected Set<Locale> getAvailableLocales(JSONArray jsonArray) {
080                    Set<Locale> availableLocales = new HashSet<Locale>();
081    
082                    for (int i = 0; i < jsonArray.length(); i++) {
083                            Locale availableLocale = LocaleUtil.fromLanguageId(
084                                    jsonArray.getString(i));
085    
086                            availableLocales.add(availableLocale);
087                    }
088    
089                    return availableLocales;
090            }
091    
092            protected DDMFormField getDDMFormField(JSONObject jsonObject) {
093                    String name = jsonObject.getString("name");
094                    String type = jsonObject.getString("type");
095    
096                    DDMFormField ddmFormField = new DDMFormField(name, type);
097    
098                    ddmFormField.setDataType(jsonObject.getString("dataType"));
099                    ddmFormField.setIndexType(jsonObject.getString("indexType"));
100                    ddmFormField.setLocalizable(jsonObject.getBoolean("localizable", true));
101                    ddmFormField.setMultiple(jsonObject.getBoolean("multiple"));
102                    ddmFormField.setNamespace(jsonObject.getString("fieldNamespace"));
103                    ddmFormField.setReadOnly(jsonObject.getBoolean("readOnly"));
104                    ddmFormField.setRepeatable(jsonObject.getBoolean("repeatable"));
105                    ddmFormField.setRequired(jsonObject.getBoolean("required"));
106                    ddmFormField.setShowLabel(jsonObject.getBoolean("showLabel", true));
107    
108                    setDDMFormFieldLocalizedValue(
109                            jsonObject.getJSONObject("label"), ddmFormField.getLabel());
110                    setDDMFormFieldLocalizedValue(
111                            jsonObject.getJSONObject("predefinedValue"),
112                            ddmFormField.getPredefinedValue());
113                    setDDMFormFieldLocalizedValue(
114                            jsonObject.getJSONObject("style"), ddmFormField.getStyle());
115                    setDDMFormFieldLocalizedValue(
116                            jsonObject.getJSONObject("tip"), ddmFormField.getTip());
117    
118                    if (type.equals("radio") || type.equals("select")) {
119                            setDDMFormFieldOptions(
120                                    jsonObject.getJSONArray("options"), ddmFormField);
121                    }
122                    else {
123                            setNestedDDMFormField(
124                                    jsonObject.getJSONArray("nestedFields"), ddmFormField);
125                    }
126    
127                    return ddmFormField;
128            }
129    
130            protected DDMFormFieldOptions getDDMFormFieldOptions(JSONArray jsonArray) {
131                    DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
132    
133                    for (int i = 0; i < jsonArray.length(); i++) {
134                            JSONObject jsonObject = jsonArray.getJSONObject(i);
135    
136                            String value = jsonObject.getString("value");
137    
138                            ddmFormFieldOptions.addOption(value);
139    
140                            addOptionValueLabels(
141                                    jsonObject.getJSONObject("label"), ddmFormFieldOptions, value);
142                    }
143    
144                    return ddmFormFieldOptions;
145            }
146    
147            protected List<DDMFormField> getDDMFormFields(JSONArray jsonArray) {
148                    List<DDMFormField> ddmFormFields = new ArrayList<DDMFormField>();
149    
150                    for (int i = 0; i < jsonArray.length(); i++) {
151                            DDMFormField ddmFormField = getDDMFormField(
152                                    jsonArray.getJSONObject(i));
153    
154                            ddmFormFields.add(ddmFormField);
155                    }
156    
157                    return ddmFormFields;
158            }
159    
160            protected void setDDMFormAvailableLocales(
161                    JSONArray jsonArray, DDMForm ddmForm) {
162    
163                    Set<Locale> availableLocales = getAvailableLocales(jsonArray);
164    
165                    ddmForm.setAvailableLocales(availableLocales);
166            }
167    
168            protected void setDDMFormDefaultLocale(
169                    String defaultLanguageId, DDMForm ddmForm) {
170    
171                    Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
172    
173                    ddmForm.setDefaultLocale(defaultLocale);
174            }
175    
176            protected void setDDMFormFieldLocalizedValue(
177                    JSONObject jsonObject, LocalizedValue localizedValue) {
178    
179                    if (jsonObject == null) {
180                            return;
181                    }
182    
183                    Iterator<String> itr = jsonObject.keys();
184    
185                    while (itr.hasNext()) {
186                            String languageId = itr.next();
187    
188                            localizedValue.addString(
189                                    LocaleUtil.fromLanguageId(languageId),
190                                    jsonObject.getString(languageId));
191                    }
192            }
193    
194            protected void setDDMFormFieldLocalizedValuesDefaultLocale(
195                    DDMFormField ddmFormField, Locale defaultLocale) {
196    
197                    LocalizedValue label = ddmFormField.getLabel();
198    
199                    label.setDefaultLocale(defaultLocale);
200    
201                    LocalizedValue predefinedValue = ddmFormField.getPredefinedValue();
202    
203                    predefinedValue.setDefaultLocale(defaultLocale);
204    
205                    LocalizedValue style = ddmFormField.getStyle();
206    
207                    style.setDefaultLocale(defaultLocale);
208    
209                    LocalizedValue tip = ddmFormField.getTip();
210    
211                    tip.setDefaultLocale(defaultLocale);
212    
213                    DDMFormFieldOptions ddmFormFieldOptions =
214                            ddmFormField.getDDMFormFieldOptions();
215    
216                    ddmFormFieldOptions.setDefaultLocale(defaultLocale);
217    
218                    for (DDMFormField nestedDDMFormField :
219                                    ddmFormField.getNestedDDMFormFields()) {
220    
221                            setDDMFormFieldLocalizedValuesDefaultLocale(
222                                    nestedDDMFormField, defaultLocale);
223                    }
224            }
225    
226            protected void setDDMFormFieldOptions(
227                    JSONArray jsonArray, DDMFormField ddmFormField) {
228    
229                    DDMFormFieldOptions ddmFormFieldOptions = getDDMFormFieldOptions(
230                            jsonArray);
231    
232                    ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
233            }
234    
235            protected void setDDMFormFields(JSONArray jsonArray, DDMForm ddmForm) {
236                    List<DDMFormField> ddmFormFields = getDDMFormFields(jsonArray);
237    
238                    ddmForm.setDDMFormFields(ddmFormFields);
239            }
240    
241            protected void setDDMFormLocalizedValuesDefaultLocale(DDMForm ddmForm) {
242                    for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
243                            setDDMFormFieldLocalizedValuesDefaultLocale(
244                                    ddmFormField, ddmForm.getDefaultLocale());
245                    }
246            }
247    
248            protected void setNestedDDMFormField(
249                    JSONArray jsonArray, DDMFormField ddmFormField) {
250    
251                    if ((jsonArray == null) || (jsonArray.length() == 0)) {
252                            return;
253                    }
254    
255                    List<DDMFormField> nestedDDMFormFields = getDDMFormFields(jsonArray);
256    
257                    ddmFormField.setNestedDDMFormFields(nestedDDMFormFields);
258            }
259    
260    }