001
014
015 package com.liferay.portlet.dynamicdatamapping.io;
016
017 import com.liferay.portal.kernel.json.JSONArray;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
020 import com.liferay.portal.kernel.util.GetterUtil;
021 import com.liferay.portal.kernel.util.LocaleUtil;
022 import com.liferay.portal.kernel.util.Validator;
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 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFactory;
028 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldType;
029 import com.liferay.portlet.dynamicdatamapping.registry.DDMFormFieldTypeRegistryUtil;
030
031 import java.util.List;
032 import java.util.Locale;
033 import java.util.Map;
034 import java.util.Set;
035
036
039 public class DDMFormJSONSerializerImpl implements DDMFormJSONSerializer {
040
041 @Override
042 public String serialize(DDMForm ddmForm) {
043 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
044
045 addAvailableLanguageIds(jsonObject, ddmForm.getAvailableLocales());
046 addDefaultLanguageId(jsonObject, ddmForm.getDefaultLocale());
047 addFields(jsonObject, ddmForm.getDDMFormFields());
048
049 return jsonObject.toString();
050 }
051
052 protected void addAvailableLanguageIds(
053 JSONObject jsonObject, Set<Locale> availableLocales) {
054
055 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
056
057 for (Locale availableLocale : availableLocales) {
058 jsonArray.put(LocaleUtil.toLanguageId(availableLocale));
059 }
060
061 jsonObject.put("availableLanguageIds", jsonArray);
062 }
063
064 protected void addDefaultLanguageId(
065 JSONObject jsonObject, Locale defaultLocale) {
066
067 jsonObject.put(
068 "defaultLanguageId", LocaleUtil.toLanguageId(defaultLocale));
069 }
070
071 protected void addFields(
072 JSONObject jsonObject, List<DDMFormField> ddmFormFields) {
073
074 jsonObject.put("fields", toJSONArray(ddmFormFields));
075 }
076
077 protected void addNestedFields(
078 JSONObject jsonObject, List<DDMFormField> nestedDDMFormFields) {
079
080 if (nestedDDMFormFields.isEmpty()) {
081 return;
082 }
083
084 jsonObject.put("nestedFields", toJSONArray(nestedDDMFormFields));
085 }
086
087 protected void addProperties(
088 JSONObject jsonObject, DDMFormField ddmFormField) {
089
090 DDMForm ddmFormFieldTypeSettingsDDMForm =
091 getDDMFormFieldTypeSettingsDDMForm(ddmFormField.getType());
092
093 for (DDMFormField ddmFormFieldTypeSetting :
094 ddmFormFieldTypeSettingsDDMForm.getDDMFormFields()) {
095
096 addProperty(jsonObject, ddmFormField, ddmFormFieldTypeSetting);
097 }
098 }
099
100 protected void addProperty(
101 JSONObject jsonObject, DDMFormField ddmFormField,
102 DDMFormField ddmFormFieldTypeSetting) {
103
104 Object property = ddmFormField.getProperty(
105 ddmFormFieldTypeSetting.getName());
106
107 if (property == null) {
108 return;
109 }
110
111 addProperty(
112 jsonObject, ddmFormFieldTypeSetting.getName(),
113 serializeDDMFormFieldProperty(property, ddmFormFieldTypeSetting));
114 }
115
116 protected void addProperty(
117 JSONObject jsonObject, String propertyName, Object propertyValue) {
118
119 if (propertyValue == null) {
120 return;
121 }
122
123 jsonObject.put(propertyName, propertyValue);
124 }
125
126 protected DDMForm getDDMFormFieldTypeSettingsDDMForm(String type) {
127 DDMFormFieldType ddmFormFieldType =
128 DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(type);
129
130 if (ddmFormFieldType == null) {
131 ddmFormFieldType = DDMFormFieldTypeRegistryUtil.getDDMFormFieldType(
132 "text");
133 }
134
135 return DDMFormFactory.create(
136 ddmFormFieldType.getDDMFormFieldTypeSettings());
137 }
138
139 protected Object serializeDDMFormFieldProperty(
140 Object property, DDMFormField ddmFormFieldTypeSetting) {
141
142 if (ddmFormFieldTypeSetting.isLocalizable()) {
143 return toJSONObject((LocalizedValue)property);
144 }
145
146 String dataType = ddmFormFieldTypeSetting.getDataType();
147
148 if (Validator.equals(dataType, "boolean")) {
149 return GetterUtil.getBoolean(property);
150 }
151 else if (Validator.equals(dataType, "ddm-options")) {
152 return toJSONArray((DDMFormFieldOptions)property);
153 }
154 else {
155 return String.valueOf(property);
156 }
157 }
158
159 protected JSONArray toJSONArray(DDMFormFieldOptions ddmFormFieldOptions) {
160 Set<String> optionValues = ddmFormFieldOptions.getOptionsValues();
161
162 if (optionValues.isEmpty()) {
163 return null;
164 }
165
166 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
167
168 for (String optionValue : optionValues) {
169 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
170
171 jsonObject.put("value", optionValue);
172 jsonObject.put(
173 "label",
174 toJSONObject(ddmFormFieldOptions.getOptionLabels(optionValue)));
175
176 jsonArray.put(jsonObject);
177 }
178
179 return jsonArray;
180 }
181
182 protected JSONArray toJSONArray(List<DDMFormField> ddmFormFields) {
183 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
184
185 for (DDMFormField ddmFormField : ddmFormFields) {
186 jsonArray.put(toJSONObject(ddmFormField));
187 }
188
189 return jsonArray;
190 }
191
192 protected JSONObject toJSONObject(DDMFormField ddmFormField) {
193 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
194
195 addProperties(jsonObject, ddmFormField);
196
197 addNestedFields(jsonObject, ddmFormField.getNestedDDMFormFields());
198
199 return jsonObject;
200 }
201
202 protected JSONObject toJSONObject(LocalizedValue localizedValue) {
203 Map<Locale, String> values = localizedValue.getValues();
204
205 if (values.isEmpty()) {
206 return null;
207 }
208
209 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
210
211 for (Locale availableLocale : localizedValue.getAvailableLocales()) {
212 jsonObject.put(
213 LocaleUtil.toLanguageId(availableLocale),
214 localizedValue.getString(availableLocale));
215 }
216
217 return jsonObject;
218 }
219
220 }