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.portlet.dynamicdatamapping.model.DDMForm;
024 import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
025 import com.liferay.portlet.dynamicdatamapping.model.DDMFormFieldOptions;
026 import com.liferay.portlet.dynamicdatamapping.model.LocalizedValue;
027
028 import java.util.ArrayList;
029 import java.util.HashSet;
030 import java.util.Iterator;
031 import java.util.List;
032 import java.util.Locale;
033 import java.util.Set;
034
035
038 public class DDMFormJSONDeserializerImpl implements DDMFormJSONDeserializer {
039
040 @Override
041 public DDMForm deserialize(String serializedDDMForm)
042 throws PortalException {
043
044 try {
045 JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
046 serializedDDMForm);
047
048 DDMForm ddmForm = new DDMForm();
049
050 setDDMFormAvailableLocales(
051 jsonObject.getJSONArray("availableLanguageIds"), ddmForm);
052 setDDMFormDefaultLocale(
053 jsonObject.getString("defaultLanguageId"), ddmForm);
054 setDDMFormFields(jsonObject.getJSONArray("fields"), ddmForm);
055 setDDMFormLocalizedValuesDefaultLocale(ddmForm);
056
057 return ddmForm;
058 }
059 catch (JSONException jsone) {
060 throw new PortalException(jsone);
061 }
062 }
063
064 protected void addOptionValueLabels(
065 JSONObject jsonObject, DDMFormFieldOptions ddmFormFieldOptions,
066 String optionValue) {
067
068 Iterator<String> itr = jsonObject.keys();
069
070 while (itr.hasNext()) {
071 String languageId = itr.next();
072
073 ddmFormFieldOptions.addOptionLabel(
074 optionValue, LocaleUtil.fromLanguageId(languageId),
075 jsonObject.getString(languageId));
076 }
077 }
078
079 protected Set<Locale> getAvailableLocales(JSONArray jsonArray) {
080 Set<Locale> availableLocales = new HashSet<Locale>();
081
082 for (int i = 0; i < jsonArray.length(); i++) {
083 Locale availableLocale = LocaleUtil.fromLanguageId(
084 jsonArray.getString(i));
085
086 availableLocales.add(availableLocale);
087 }
088
089 return availableLocales;
090 }
091
092 protected DDMFormField getDDMFormField(JSONObject jsonObject) {
093 String name = jsonObject.getString("name");
094 String type = jsonObject.getString("type");
095
096 DDMFormField ddmFormField = new DDMFormField(name, type);
097
098 ddmFormField.setDataType(jsonObject.getString("dataType"));
099 ddmFormField.setIndexType(jsonObject.getString("indexType"));
100 ddmFormField.setLocalizable(jsonObject.getBoolean("localizable", true));
101 ddmFormField.setMultiple(jsonObject.getBoolean("multiple"));
102 ddmFormField.setNamespace(jsonObject.getString("fieldNamespace"));
103 ddmFormField.setReadOnly(jsonObject.getBoolean("readOnly"));
104 ddmFormField.setRepeatable(jsonObject.getBoolean("repeatable"));
105 ddmFormField.setRequired(jsonObject.getBoolean("required"));
106 ddmFormField.setShowLabel(jsonObject.getBoolean("showLabel", true));
107
108 setDDMFormFieldLocalizedValue(
109 jsonObject.getJSONObject("label"), ddmFormField.getLabel());
110 setDDMFormFieldLocalizedValue(
111 jsonObject.getJSONObject("predefinedValue"),
112 ddmFormField.getPredefinedValue());
113 setDDMFormFieldLocalizedValue(
114 jsonObject.getJSONObject("style"), ddmFormField.getStyle());
115 setDDMFormFieldLocalizedValue(
116 jsonObject.getJSONObject("tip"), ddmFormField.getTip());
117
118 if (type.equals("radio") || type.equals("select")) {
119 setDDMFormFieldOptions(
120 jsonObject.getJSONArray("options"), ddmFormField);
121 }
122 else {
123 setNestedDDMFormField(
124 jsonObject.getJSONArray("nestedFields"), ddmFormField);
125 }
126
127 return ddmFormField;
128 }
129
130 protected DDMFormFieldOptions getDDMFormFieldOptions(JSONArray jsonArray) {
131 DDMFormFieldOptions ddmFormFieldOptions = new DDMFormFieldOptions();
132
133 for (int i = 0; i < jsonArray.length(); i++) {
134 JSONObject jsonObject = jsonArray.getJSONObject(i);
135
136 String value = jsonObject.getString("value");
137
138 ddmFormFieldOptions.addOption(value);
139
140 addOptionValueLabels(
141 jsonObject.getJSONObject("label"), ddmFormFieldOptions, value);
142 }
143
144 return ddmFormFieldOptions;
145 }
146
147 protected List<DDMFormField> getDDMFormFields(JSONArray jsonArray) {
148 List<DDMFormField> ddmFormFields = new ArrayList<DDMFormField>();
149
150 for (int i = 0; i < jsonArray.length(); i++) {
151 DDMFormField ddmFormField = getDDMFormField(
152 jsonArray.getJSONObject(i));
153
154 ddmFormFields.add(ddmFormField);
155 }
156
157 return ddmFormFields;
158 }
159
160 protected void setDDMFormAvailableLocales(
161 JSONArray jsonArray, DDMForm ddmForm) {
162
163 Set<Locale> availableLocales = getAvailableLocales(jsonArray);
164
165 ddmForm.setAvailableLocales(availableLocales);
166 }
167
168 protected void setDDMFormDefaultLocale(
169 String defaultLanguageId, DDMForm ddmForm) {
170
171 Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
172
173 ddmForm.setDefaultLocale(defaultLocale);
174 }
175
176 protected void setDDMFormFieldLocalizedValue(
177 JSONObject jsonObject, LocalizedValue localizedValue) {
178
179 if (jsonObject == null) {
180 return;
181 }
182
183 Iterator<String> itr = jsonObject.keys();
184
185 while (itr.hasNext()) {
186 String languageId = itr.next();
187
188 localizedValue.addString(
189 LocaleUtil.fromLanguageId(languageId),
190 jsonObject.getString(languageId));
191 }
192 }
193
194 protected void setDDMFormFieldLocalizedValuesDefaultLocale(
195 DDMFormField ddmFormField, Locale defaultLocale) {
196
197 LocalizedValue label = ddmFormField.getLabel();
198
199 label.setDefaultLocale(defaultLocale);
200
201 LocalizedValue predefinedValue = ddmFormField.getPredefinedValue();
202
203 predefinedValue.setDefaultLocale(defaultLocale);
204
205 LocalizedValue style = ddmFormField.getStyle();
206
207 style.setDefaultLocale(defaultLocale);
208
209 LocalizedValue tip = ddmFormField.getTip();
210
211 tip.setDefaultLocale(defaultLocale);
212
213 DDMFormFieldOptions ddmFormFieldOptions =
214 ddmFormField.getDDMFormFieldOptions();
215
216 ddmFormFieldOptions.setDefaultLocale(defaultLocale);
217
218 for (DDMFormField nestedDDMFormField :
219 ddmFormField.getNestedDDMFormFields()) {
220
221 setDDMFormFieldLocalizedValuesDefaultLocale(
222 nestedDDMFormField, defaultLocale);
223 }
224 }
225
226 protected void setDDMFormFieldOptions(
227 JSONArray jsonArray, DDMFormField ddmFormField) {
228
229 DDMFormFieldOptions ddmFormFieldOptions = getDDMFormFieldOptions(
230 jsonArray);
231
232 ddmFormField.setDDMFormFieldOptions(ddmFormFieldOptions);
233 }
234
235 protected void setDDMFormFields(JSONArray jsonArray, DDMForm ddmForm) {
236 List<DDMFormField> ddmFormFields = getDDMFormFields(jsonArray);
237
238 ddmForm.setDDMFormFields(ddmFormFields);
239 }
240
241 protected void setDDMFormLocalizedValuesDefaultLocale(DDMForm ddmForm) {
242 for (DDMFormField ddmFormField : ddmForm.getDDMFormFields()) {
243 setDDMFormFieldLocalizedValuesDefaultLocale(
244 ddmFormField, ddmForm.getDefaultLocale());
245 }
246 }
247
248 protected void setNestedDDMFormField(
249 JSONArray jsonArray, DDMFormField ddmFormField) {
250
251 if ((jsonArray == null) || (jsonArray.length() == 0)) {
252 return;
253 }
254
255 List<DDMFormField> nestedDDMFormFields = getDDMFormFields(jsonArray);
256
257 ddmFormField.setNestedDDMFormFields(nestedDDMFormFields);
258 }
259
260 }