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