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<Locale>();
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 =
101 new ArrayList<DDMFormFieldValue>();
102
103 for (int i = 0; i < jsonArray.length(); i++) {
104 DDMFormFieldValue ddmFormFieldValue = getDDMFormFieldValue(
105 jsonArray.getJSONObject(i));
106
107 ddmFormFieldValues.add(ddmFormFieldValue);
108 }
109
110 return ddmFormFieldValues;
111 }
112
113 protected LocalizedValue getLocalizedValue(JSONObject jsonObject) {
114 LocalizedValue localizedValue = new LocalizedValue();
115
116 Iterator<String> itr = jsonObject.keys();
117
118 while (itr.hasNext()) {
119 String languageId = itr.next();
120
121 localizedValue.addString(
122 LocaleUtil.fromLanguageId(languageId),
123 jsonObject.getString(languageId));
124 }
125
126 return localizedValue;
127 }
128
129 protected Value getValue(JSONObject jsonObject) {
130 JSONObject valueJSONObject = jsonObject.getJSONObject("value");
131
132 if (isLocalized(valueJSONObject)) {
133 return getLocalizedValue(valueJSONObject);
134 }
135
136 return new UnlocalizedValue(jsonObject.getString("value"));
137 }
138
139 protected boolean isLocalized(JSONObject jsonObject) {
140 if (jsonObject == null) {
141 return false;
142 }
143
144 Iterator<String> keys = jsonObject.keys();
145
146 while (keys.hasNext()) {
147 String key = keys.next();
148
149 if (!LanguageUtil.isAvailableLocale(key)) {
150 return false;
151 }
152 }
153
154 return true;
155 }
156
157 protected void setDDMFormFieldValueLocalizedValueDefaultLocale(
158 DDMFormFieldValue ddmFormFieldValue, Locale defaultLocale) {
159
160 Value value = ddmFormFieldValue.getValue();
161
162 if ((value != null) && value.isLocalized()) {
163 value.setDefaultLocale(defaultLocale);
164 }
165
166 for (DDMFormFieldValue nestedDDMFormFieldValue :
167 ddmFormFieldValue.getNestedDDMFormFieldValues()) {
168
169 setDDMFormFieldValueLocalizedValueDefaultLocale(
170 nestedDDMFormFieldValue, defaultLocale);
171 }
172 }
173
174 protected void setDDMFormFieldValues(
175 JSONArray jsonArray, DDMFormValues ddmFormValues) {
176
177 List<DDMFormFieldValue> ddmFormFieldValues = getDDMFormFieldValues(
178 jsonArray);
179
180 ddmFormValues.setDDMFormFieldValues(ddmFormFieldValues);
181 }
182
183 protected void setDDMFormFieldValueValue(
184 JSONObject jsonObject, DDMFormFieldValue ddmFormFieldValue) {
185
186 String valueString = jsonObject.getString("value", null);
187
188 if (valueString == null) {
189 return;
190 }
191
192 Value value = getValue(jsonObject);
193
194 ddmFormFieldValue.setValue(value);
195 }
196
197 protected void setDDMFormLocalizedValuesDefaultLocale(
198 DDMFormValues ddmFormValues) {
199
200 for (DDMFormFieldValue ddmFormFieldValue :
201 ddmFormValues.getDDMFormFieldValues()) {
202
203 setDDMFormFieldValueLocalizedValueDefaultLocale(
204 ddmFormFieldValue, ddmFormValues.getDefaultLocale());
205 }
206 }
207
208 protected void setDDMFormValuesAvailableLocales(
209 JSONArray jsonArray, DDMFormValues ddmFormValues) {
210
211 Set<Locale> availableLocales = getAvailableLocales(jsonArray);
212
213 ddmFormValues.setAvailableLocales(availableLocales);
214 }
215
216 protected void setDDMFormValuesDefaultLocale(
217 String defaultLanguageId, DDMFormValues ddmFormValues) {
218
219 Locale defaultLocale = LocaleUtil.fromLanguageId(defaultLanguageId);
220
221 ddmFormValues.setDefaultLocale(defaultLocale);
222 }
223
224 protected void setNestedDDMFormFieldValues(
225 JSONArray jsonArray, DDMFormFieldValue ddmFormFieldValue) {
226
227 if ((jsonArray == null) || (jsonArray.length() == 0)) {
228 return;
229 }
230
231 List<DDMFormFieldValue> nestedDDMFormFieldValues =
232 getDDMFormFieldValues(jsonArray);
233
234 ddmFormFieldValue.setNestedDDMFormFields(nestedDDMFormFieldValues);
235 }
236
237 }