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.language.LanguageUtil;
023    import com.liferay.portal.kernel.util.LocaleUtil;
024    import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
025    import com.liferay.portlet.dynamicdatamapping.model.LocalizedValue;
026    import com.liferay.portlet.dynamicdatamapping.model.UnlocalizedValue;
027    import com.liferay.portlet.dynamicdatamapping.model.Value;
028    import com.liferay.portlet.dynamicdatamapping.storage.DDMFormFieldValue;
029    import com.liferay.portlet.dynamicdatamapping.storage.DDMFormValues;
030    
031    import java.util.ArrayList;
032    import java.util.HashSet;
033    import java.util.Iterator;
034    import java.util.List;
035    import java.util.Locale;
036    import java.util.Set;
037    
038    /**
039     * @author Marcellus Tavares
040     */
041    public class DDMFormValuesJSONDeserializerImpl
042            implements DDMFormValuesJSONDeserializer {
043    
044            @Override
045            public DDMFormValues deserialize(
046                            DDMForm ddmForm, String serializedDDMFormValues)
047                    throws PortalException {
048    
049                    try {
050                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
051                                    serializedDDMFormValues);
052    
053                            DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);
054    
055                            setDDMFormValuesAvailableLocales(
056                                    jsonObject.getJSONArray("availableLanguageIds"), ddmFormValues);
057                            setDDMFormValuesDefaultLocale(
058                                    jsonObject.getString("defaultLanguageId"), ddmFormValues);
059                            setDDMFormFieldValues(
060                                    jsonObject.getJSONArray("fieldValues"), ddmFormValues);
061                            setDDMFormLocalizedValuesDefaultLocale(ddmFormValues);
062    
063                            return ddmFormValues;
064                    }
065                    catch (JSONException jsone) {
066                            throw new PortalException(jsone);
067                    }
068            }
069    
070            protected Set<Locale> getAvailableLocales(JSONArray jsonArray) {
071                    Set<Locale> availableLocales = new HashSet<>();
072    
073                    for (int i = 0; i < jsonArray.length(); i++) {
074                            Locale availableLocale = LocaleUtil.fromLanguageId(
075                                    jsonArray.getString(i));
076    
077                            availableLocales.add(availableLocale);
078                    }
079    
080                    return availableLocales;
081            }
082    
083            protected DDMFormFieldValue getDDMFormFieldValue(JSONObject jsonObject) {
084                    DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
085    
086                    ddmFormFieldValue.setInstanceId(jsonObject.getString("instanceId"));
087                    ddmFormFieldValue.setName(jsonObject.getString("name"));
088    
089                    setDDMFormFieldValueValue(jsonObject, ddmFormFieldValue);
090    
091                    setNestedDDMFormFieldValues(
092                            jsonObject.getJSONArray("nestedFieldValues"), ddmFormFieldValue);
093    
094                    return ddmFormFieldValue;
095            }
096    
097            protected List<DDMFormFieldValue> getDDMFormFieldValues(
098                    JSONArray jsonArray) {
099    
100                    List<DDMFormFieldValue> ddmFormFieldValues = new ArrayList<>();
101    
102                    for (int i = 0; i < jsonArray.length(); i++) {
103                            DDMFormFieldValue ddmFormFieldValue = getDDMFormFieldValue(
104                                    jsonArray.getJSONObject(i));
105    
106                            ddmFormFieldValues.add(ddmFormFieldValue);
107                    }
108    
109                    return ddmFormFieldValues;
110            }
111    
112            protected LocalizedValue getLocalizedValue(JSONObject jsonObject) {
113                    LocalizedValue localizedValue = new LocalizedValue();
114    
115                    Iterator<String> itr = jsonObject.keys();
116    
117                    while (itr.hasNext()) {
118                            String languageId = itr.next();
119    
120                            localizedValue.addString(
121                                    LocaleUtil.fromLanguageId(languageId),
122                                    jsonObject.getString(languageId));
123                    }
124    
125                    return localizedValue;
126            }
127    
128            protected Value getValue(JSONObject jsonObject) {
129                    JSONObject valueJSONObject = jsonObject.getJSONObject("value");
130    
131                    if (isLocalized(valueJSONObject)) {
132                            return getLocalizedValue(valueJSONObject);
133                    }
134    
135                    return new UnlocalizedValue(jsonObject.getString("value"));
136            }
137    
138            protected boolean isLocalized(JSONObject jsonObject) {
139                    if (jsonObject == null) {
140                            return false;
141                    }
142    
143                    Iterator<String> keys = jsonObject.keys();
144    
145                    while (keys.hasNext()) {
146                            String key = keys.next();
147    
148                            if (!LanguageUtil.isAvailableLocale(key)) {
149                                    return false;
150                            }
151                    }
152    
153                    return true;
154            }
155    
156            protected void setDDMFormFieldValueLocalizedValueDefaultLocale(
157                    DDMFormFieldValue ddmFormFieldValue, Locale defaultLocale) {
158    
159                    Value value = ddmFormFieldValue.getValue();
160    
161                    if ((value != null) && value.isLocalized()) {
162                            value.setDefaultLocale(defaultLocale);
163                    }
164    
165                    for (DDMFormFieldValue nestedDDMFormFieldValue :
166                                    ddmFormFieldValue.getNestedDDMFormFieldValues()) {
167    
168                            setDDMFormFieldValueLocalizedValueDefaultLocale(
169                                    nestedDDMFormFieldValue, defaultLocale);
170                    }
171            }
172    
173            protected void setDDMFormFieldValues(
174                    JSONArray jsonArray, DDMFormValues ddmFormValues) {
175    
176                    List<DDMFormFieldValue> ddmFormFieldValues = getDDMFormFieldValues(
177                            jsonArray);
178    
179                    ddmFormValues.setDDMFormFieldValues(ddmFormFieldValues);
180            }
181    
182            protected void setDDMFormFieldValueValue(
183                    JSONObject jsonObject, DDMFormFieldValue ddmFormFieldValue) {
184    
185                    String valueString = jsonObject.getString("value", null);
186    
187                    if (valueString == null) {
188                            return;
189                    }
190    
191                    Value value = getValue(jsonObject);
192    
193                    ddmFormFieldValue.setValue(value);
194            }
195    
196            protected void setDDMFormLocalizedValuesDefaultLocale(
197                    DDMFormValues ddmFormValues) {
198    
199                    for (DDMFormFieldValue ddmFormFieldValue :
200                                    ddmFormValues.getDDMFormFieldValues()) {
201    
202                            setDDMFormFieldValueLocalizedValueDefaultLocale(
203                                    ddmFormFieldValue, ddmFormValues.getDefaultLocale());
204                    }
205            }
206    
207            protected void setDDMFormValuesAvailableLocales(
208                    JSONArray jsonArray, DDMFormValues ddmFormValues) {
209    
210                    Set<Locale> availableLocales = getAvailableLocales(jsonArray);
211    
212                    ddmFormValues.setAvailableLocales(availableLocales);
213            }
214    
215            protected void setDDMFormValuesDefaultLocale(
216                    String defaultLanguageId, DDMFormValues ddmFormValues) {
217    
218                    Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
219    
220                    ddmFormValues.setDefaultLocale(defaultLocale);
221            }
222    
223            protected void setNestedDDMFormFieldValues(
224                    JSONArray jsonArray, DDMFormFieldValue ddmFormFieldValue) {
225    
226                    if ((jsonArray == null) || (jsonArray.length() == 0)) {
227                            return;
228                    }
229    
230                    List<DDMFormFieldValue> nestedDDMFormFieldValues =
231                            getDDMFormFieldValues(jsonArray);
232    
233                    ddmFormFieldValue.setNestedDDMFormFields(nestedDDMFormFieldValues);
234            }
235    
236    }