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