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<Locale>();
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 =
101                            new ArrayList<DDMFormFieldValue>();
102    
103                    for (int i = 0; i < jsonArray.length(); i++) {
104                            DDMFormFieldValue ddmFormFieldValue = getDDMFormFieldValue(
105                                    jsonArray.getJSONObject(i));
106    
107                            ddmFormFieldValues.add(ddmFormFieldValue);
108                    }
109    
110                    return ddmFormFieldValues;
111            }
112    
113            protected LocalizedValue getLocalizedValue(JSONObject jsonObject) {
114                    LocalizedValue localizedValue = new LocalizedValue();
115    
116                    Iterator<String> itr = jsonObject.keys();
117    
118                    while (itr.hasNext()) {
119                            String languageId = itr.next();
120    
121                            localizedValue.addString(
122                                    LocaleUtil.fromLanguageId(languageId),
123                                    jsonObject.getString(languageId));
124                    }
125    
126                    return localizedValue;
127            }
128    
129            protected Value getValue(JSONObject jsonObject) {
130                    JSONObject valueJSONObject = jsonObject.getJSONObject("value");
131    
132                    if (isLocalized(valueJSONObject)) {
133                            return getLocalizedValue(valueJSONObject);
134                    }
135    
136                    return new UnlocalizedValue(jsonObject.getString("value"));
137            }
138    
139            protected boolean isLocalized(JSONObject jsonObject) {
140                    if (jsonObject == null) {
141                            return false;
142                    }
143    
144                    Iterator<String> keys = jsonObject.keys();
145    
146                    while (keys.hasNext()) {
147                            String key = keys.next();
148    
149                            if (!LanguageUtil.isAvailableLocale(key)) {
150                                    return false;
151                            }
152                    }
153    
154                    return true;
155            }
156    
157            protected void setDDMFormFieldValueLocalizedValueDefaultLocale(
158                    DDMFormFieldValue ddmFormFieldValue, Locale defaultLocale) {
159    
160                    Value value = ddmFormFieldValue.getValue();
161    
162                    if ((value != null) && value.isLocalized()) {
163                            value.setDefaultLocale(defaultLocale);
164                    }
165    
166                    for (DDMFormFieldValue nestedDDMFormFieldValue :
167                                    ddmFormFieldValue.getNestedDDMFormFieldValues()) {
168    
169                            setDDMFormFieldValueLocalizedValueDefaultLocale(
170                                    nestedDDMFormFieldValue, defaultLocale);
171                    }
172            }
173    
174            protected void setDDMFormFieldValues(
175                    JSONArray jsonArray, DDMFormValues ddmFormValues) {
176    
177                    List<DDMFormFieldValue> ddmFormFieldValues = getDDMFormFieldValues(
178                            jsonArray);
179    
180                    ddmFormValues.setDDMFormFieldValues(ddmFormFieldValues);
181            }
182    
183            protected void setDDMFormFieldValueValue(
184                    JSONObject jsonObject, DDMFormFieldValue ddmFormFieldValue) {
185    
186                    String valueString = jsonObject.getString("value", null);
187    
188                    if (valueString == null) {
189                            return;
190                    }
191    
192                    Value value = getValue(jsonObject);
193    
194                    ddmFormFieldValue.setValue(value);
195            }
196    
197            protected void setDDMFormLocalizedValuesDefaultLocale(
198                    DDMFormValues ddmFormValues) {
199    
200                    for (DDMFormFieldValue ddmFormFieldValue :
201                                    ddmFormValues.getDDMFormFieldValues()) {
202    
203                            setDDMFormFieldValueLocalizedValueDefaultLocale(
204                                    ddmFormFieldValue, ddmFormValues.getDefaultLocale());
205                    }
206            }
207    
208            protected void setDDMFormValuesAvailableLocales(
209                    JSONArray jsonArray, DDMFormValues ddmFormValues) {
210    
211                    Set<Locale> availableLocales = getAvailableLocales(jsonArray);
212    
213                    ddmFormValues.setAvailableLocales(availableLocales);
214            }
215    
216            protected void setDDMFormValuesDefaultLocale(
217                    String defaultLanguageId, DDMFormValues ddmFormValues) {
218    
219                    Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
220    
221                    ddmFormValues.setDefaultLocale(defaultLocale);
222            }
223    
224            protected void setNestedDDMFormFieldValues(
225                    JSONArray jsonArray, DDMFormFieldValue ddmFormFieldValue) {
226    
227                    if ((jsonArray == null) || (jsonArray.length() == 0)) {
228                            return;
229                    }
230    
231                    List<DDMFormFieldValue> nestedDDMFormFieldValues =
232                            getDDMFormFieldValues(jsonArray);
233    
234                    ddmFormFieldValue.setNestedDDMFormFields(nestedDDMFormFieldValues);
235            }
236    
237    }