001
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
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 }