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.util.LocaleUtil;
023 import com.liferay.portal.kernel.util.Validator;
024 import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
025 import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
026 import com.liferay.portlet.dynamicdatamapping.model.DDMFormFieldOptions;
027 import com.liferay.portlet.dynamicdatamapping.model.LocalizedValue;
028 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFactory;
029 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldType;
030 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldTypeRegistryUtil;
031
032 import java.util.ArrayList;
033 import java.util.HashSet;
034 import java.util.Iterator;
035 import java.util.List;
036 import java.util.Locale;
037 import java.util.Set;
038
039
042 public class DDMFormJSONDeserializerImpl implements DDMFormJSONDeserializer {
043
044 @Override
045 public DDMForm deserialize(String serializedDDMForm)
046 throws PortalException {
047
048 try {
049 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
050 serializedDDMForm);
051
052 DDMForm ddmForm = new DDMForm();
053
054 setDDMFormAvailableLocales(
055 jsonObject.getJSONArray("availableLanguageIds"), ddmForm);
056 setDDMFormDefaultLocale(
057 jsonObject.getString("defaultLanguageId"), ddmForm);
058 setDDMFormFields(jsonObject.getJSONArray("fields"), ddmForm);
059 setDDMFormLocalizedValuesDefaultLocale(ddmForm);
060
061 return ddmForm;
062 }
063 catch (JSONException jsone) {
064 throw new PortalException(jsone);
065 }
066 }
067
068 protected void addOptionValueLabels(
069 JSONObject jsonObject, DDMFormFieldOptions ddmFormFieldOptions,
070 String optionValue) {
071
072 Iterator<String> itr = jsonObject.keys();
073
074 while (itr.hasNext()) {
075 String languageId = itr.next();
076
077 ddmFormFieldOptions.addOptionLabel(
078 optionValue, LocaleUtil.fromLanguageId(languageId),
079 jsonObject.getString(languageId));
080 }
081 }
082
083 protected DDMFormFieldOptions deserializeDDMFormFieldOptions(
084 String serializedDDMFormFieldProperty)
085 throws PortalException {
086
087 if (Validator.isNull(serializedDDMFormFieldProperty)) {
088 return new DDMFormFieldOptions();
089 }
090
091 JSONArray jsonArray = JSONFactoryUtil.createJSONArray(
092 serializedDDMFormFieldProperty);
093
094 return getDDMFormFieldOptions(jsonArray);
095 }
096
097 protected Object deserializeDDMFormFieldProperty(
098 String serializedDDMFormFieldProperty,
099 DDMFormField ddmFormFieldTypeSetting)
100 throws PortalException {
101
102 if (ddmFormFieldTypeSetting.isLocalizable()) {
103 return deserializeLocalizedValue(serializedDDMFormFieldProperty);
104 }
105
106 String dataType = ddmFormFieldTypeSetting.getDataType();
107
108 if (Validator.equals(dataType, "boolean")) {
109 return Boolean.valueOf(serializedDDMFormFieldProperty);
110 }
111 else if (Validator.equals(dataType, "ddm-options")) {
112 return deserializeDDMFormFieldOptions(
113 serializedDDMFormFieldProperty);
114 }
115 else {
116 return serializedDDMFormFieldProperty;
117 }
118 }
119
120 protected LocalizedValue deserializeLocalizedValue(
121 String serializedDDMFormFieldProperty)
122 throws PortalException {
123
124 LocalizedValue localizedValue = new LocalizedValue();
125
126 if (Validator.isNull(serializedDDMFormFieldProperty)) {
127 return localizedValue;
128 }
129
130 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
131 serializedDDMFormFieldProperty);
132
133 Iterator<String> itr = jsonObject.keys();
134
135 while (itr.hasNext()) {
136 String languageId = itr.next();
137
138 localizedValue.addString(
139 LocaleUtil.fromLanguageId(languageId),
140 jsonObject.getString(languageId));
141 }
142
143 return localizedValue;
144 }
145
146 protected Set<Locale> getAvailableLocales(JSONArray jsonArray) {
147 Set<Locale> availableLocales = new HashSet<>();
148
149 for (int i = 0; i < jsonArray.length(); i++) {
150 Locale availableLocale = LocaleUtil.fromLanguageId(
151 jsonArray.getString(i));
152
153 availableLocales.add(availableLocale);
154 }
155
156 return availableLocales;
157 }
158
159 protected DDMFormField getDDMFormField(JSONObject jsonObject)
160 throws PortalException {
161
162 String name = jsonObject.getString("name");
163 String type = jsonObject.getString("type");
164
165 DDMFormField ddmFormField = new DDMFormField(name, type);
166
167 setDDMFormFieldProperties(jsonObject, ddmFormField);
168
169 setNestedDDMFormField(
170 jsonObject.getJSONArray("nestedFields"), ddmFormField);
171
172 return ddmFormField;
173 }
174
175 protected DDMFormFieldOptions getDDMFormFieldOptions(JSONArray jsonArray) {
176 DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
177
178 for (int i = 0; i < jsonArray.length(); i++) {
179 JSONObject jsonObject = jsonArray.getJSONObject(i);
180
181 String value = jsonObject.getString("value");
182
183 ddmFormFieldOptions.addOption(value);
184
185 addOptionValueLabels(
186 jsonObject.getJSONObject("label"), ddmFormFieldOptions, value);
187 }
188
189 return ddmFormFieldOptions;
190 }
191
192 protected List<DDMFormField> getDDMFormFields(JSONArray jsonArray)
193 throws PortalException {
194
195 List<DDMFormField> ddmFormFields = new ArrayList<>();
196
197 for (int i = 0; i < jsonArray.length(); i++) {
198 DDMFormField ddmFormField = getDDMFormField(
199 jsonArray.getJSONObject(i));
200
201 ddmFormFields.add(ddmFormField);
202 }
203
204 return ddmFormFields;
205 }
206
207 protected DDMForm getDDMFormFieldTypeSettingsDDMForm(String type) {
208 DDMFormFieldType ddmFormFieldType =
209 DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(type);
210
211 if (ddmFormFieldType == null) {
212 ddmFormFieldType = DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(
213 "text");
214 }
215
216 return DDMFormFactory.create(
217 ddmFormFieldType.getDDMFormFieldTypeSettings());
218 }
219
220 protected void setDDMFormAvailableLocales(
221 JSONArray jsonArray, DDMForm ddmForm) {
222
223 Set<Locale> availableLocales = getAvailableLocales(jsonArray);
224
225 ddmForm.setAvailableLocales(availableLocales);
226 }
227
228 protected void setDDMFormDefaultLocale(
229 String defaultLanguageId, DDMForm ddmForm) {
230
231 Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
232
233 ddmForm.setDefaultLocale(defaultLocale);
234 }
235
236 protected void setDDMFormFieldLocalizedValueDefaultLocale(
237 LocalizedValue localizedValue, Locale defaultLocale) {
238
239 if (localizedValue == null) {
240 return;
241 }
242
243 localizedValue.setDefaultLocale(defaultLocale);
244 }
245
246 protected void setDDMFormFieldLocalizedValuesDefaultLocale(
247 DDMFormField ddmFormField, Locale defaultLocale) {
248
249 setDDMFormFieldLocalizedValueDefaultLocale(
250 ddmFormField.getLabel(), defaultLocale);
251
252 setDDMFormFieldLocalizedValueDefaultLocale(
253 ddmFormField.getPredefinedValue(), defaultLocale);
254
255 setDDMFormFieldLocalizedValueDefaultLocale(
256 ddmFormField.getStyle(), defaultLocale);
257
258 setDDMFormFieldLocalizedValueDefaultLocale(
259 ddmFormField.getTip(), defaultLocale);
260
261 DDMFormFieldOptions ddmFormFieldOptions =
262 ddmFormField.getDDMFormFieldOptions();
263
264 if (ddmFormFieldOptions != null) {
265 ddmFormFieldOptions.setDefaultLocale(defaultLocale);
266 }
267
268 for (DDMFormField nestedDDMFormField :
269 ddmFormField.getNestedDDMFormFields()) {
270
271 setDDMFormFieldLocalizedValuesDefaultLocale(
272 nestedDDMFormField, defaultLocale);
273 }
274 }
275
276 protected void setDDMFormFieldProperties(
277 JSONObject jsonObject, DDMFormField ddmFormField)
278 throws PortalException {
279
280 DDMForm ddmFormFieldTypeSettingsDDMForm =
281 getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType());
282
283 for (DDMFormField ddmFormFieldTypeSetting :
284 ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) {
285
286 setDDMFormFieldProperty(
287 jsonObject, ddmFormField, ddmFormFieldTypeSetting);
288 }
289 }
290
291 protected void setDDMFormFieldProperty(
292 JSONObject jsonObject, DDMFormField ddmFormField,
293 DDMFormField ddmFormFieldTypeSetting)
294 throws PortalException {
295
296 String settingName = ddmFormFieldTypeSetting.getName();
297
298 Object deserializedDDMFormFieldProperty =
299 deserializeDDMFormFieldProperty(
300 jsonObject.getString(settingName), ddmFormFieldTypeSetting);
301
302 ddmFormField.setProperty(settingName, deserializedDDMFormFieldProperty);
303 }
304
305 protected void setDDMFormFields(JSONArray jsonArray, DDMForm ddmForm)
306 throws PortalException {
307
308 List<DDMFormField> ddmFormFields = getDDMFormFields(jsonArray);
309
310 ddmForm.setDDMFormFields(ddmFormFields);
311 }
312
313 protected void setDDMFormLocalizedValuesDefaultLocale(DDMForm ddmForm) {
314 for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
315 setDDMFormFieldLocalizedValuesDefaultLocale(
316 ddmFormField, ddmForm.getDefaultLocale());
317 }
318 }
319
320 protected void setNestedDDMFormField(
321 JSONArray jsonArray, DDMFormField ddmFormField)
322 throws PortalException {
323
324 if ((jsonArray == null) || (jsonArray.length() == 0)) {
325 return;
326 }
327
328 List<DDMFormField> nestedDDMFormFields = getDDMFormFields(jsonArray);
329
330 ddmFormField.setNestedDDMFormFields(nestedDDMFormFields);
331 }
332
333 }