001
014
015 package com.liferay.portlet.dynamicdatamapping.util;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.util.ArrayUtil;
019 import com.liferay.portal.kernel.util.LocaleUtil;
020 import com.liferay.portal.kernel.util.StringPool;
021 import com.liferay.portal.kernel.util.StringUtil;
022 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
023 import com.liferay.portlet.dynamicdatamapping.model.Value;
024 import com.liferay.portlet.dynamicdatamapping.storage.DDMFormFieldValue;
025 import com.liferay.portlet.dynamicdatamapping.storage.DDMFormValues;
026 import com.liferay.portlet.dynamicdatamapping.storage.Field;
027 import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
028 import com.liferay.portlet.dynamicdatamapping.storage.Fields;
029
030 import java.io.Serializable;
031
032 import java.util.Locale;
033
034
037 public class DDMFormValuesToFieldsConverterImpl
038 implements DDMFormValuesToFieldsConverter {
039
040 @Override
041 public Fields convert(
042 DDMStructure ddmStructure, DDMFormValues ddmFormValues)
043 throws PortalException {
044
045 Fields ddmFields = createDDMFields(ddmStructure);
046
047 Locale defaultLocale = ddmFormValues.getDefaultLocale();
048
049 for (DDMFormFieldValue ddmFormFieldValue :
050 ddmFormValues.getDDMFormFieldValues()) {
051
052 addDDMFields(
053 ddmStructure, ddmFormFieldValue, ddmFields, defaultLocale);
054 }
055
056 return ddmFields;
057 }
058
059 protected void addDDMFields(
060 DDMStructure ddmStructure, DDMFormFieldValue ddmFormFieldValue,
061 Fields ddmFields, Locale defaultLocale)
062 throws PortalException {
063
064 String fieldName = ddmFormFieldValue.getName();
065
066 if (!ddmStructure.hasField(fieldName)) {
067 return;
068 }
069
070 if (!ddmStructure.isFieldTransient(fieldName)) {
071 Field ddmField = createDDMField(
072 ddmStructure, ddmFormFieldValue, defaultLocale);
073
074 Field existingDDMField = ddmFields.get(ddmField.getName());
075
076 if (existingDDMField == null) {
077 ddmFields.put(ddmField);
078 }
079 else {
080 addDDMFieldValues(existingDDMField, ddmField);
081 }
082 }
083
084 addFieldDisplayValue(
085 ddmFields.get(DDMImpl.FIELDS_DISPLAY_NAME),
086 getFieldDisplayValue(ddmFormFieldValue));
087
088 for (DDMFormFieldValue nestedDDMFormFieldValue :
089 ddmFormFieldValue.getNestedDDMFormFieldValues()) {
090
091 addDDMFields(
092 ddmStructure, nestedDDMFormFieldValue, ddmFields,
093 defaultLocale);
094 }
095 }
096
097 protected void addDDMFieldValues(
098 Field existingDDMField, Field newDDMField) {
099
100 for (Locale availableLocale : newDDMField.getAvailableLocales()) {
101 existingDDMField.addValues(
102 availableLocale, newDDMField.getValues(availableLocale));
103 }
104 }
105
106 protected void addFieldDisplayValue(
107 Field ddmFieldsDisplayField, String fieldDisplayValue) {
108
109 String[] fieldsDisplayValues = StringUtil.split(
110 (String)ddmFieldsDisplayField.getValue());
111
112 fieldsDisplayValues = ArrayUtil.append(
113 fieldsDisplayValues, fieldDisplayValue);
114
115 ddmFieldsDisplayField.setValue(StringUtil.merge(fieldsDisplayValues));
116 }
117
118 protected Field createDDMField(
119 DDMStructure ddmStructure, DDMFormFieldValue ddmFormFieldValue,
120 Locale defaultLocale)
121 throws PortalException {
122
123 Field ddmField = new Field();
124
125 ddmField.setDDMStructureId(ddmStructure.getStructureId());
126 ddmField.setDefaultLocale(defaultLocale);
127 ddmField.setName(ddmFormFieldValue.getName());
128
129 String type = ddmStructure.getFieldDataType(
130 ddmFormFieldValue.getName());
131
132 setDDMFieldValue(
133 ddmField, type, ddmFormFieldValue.getValue(), defaultLocale);
134
135 return ddmField;
136 }
137
138 protected Fields createDDMFields(DDMStructure ddmStructure) {
139 Fields ddmFields = new Fields();
140
141 Field fieldsDisplayField = new Field(
142 ddmStructure.getStructureId(), DDMImpl.FIELDS_DISPLAY_NAME,
143 StringPool.BLANK);
144
145 ddmFields.put(fieldsDisplayField);
146
147 return ddmFields;
148 }
149
150 protected String getFieldDisplayValue(DDMFormFieldValue ddmFormFieldValue) {
151 String fieldName = ddmFormFieldValue.getName();
152
153 String instanceId = ddmFormFieldValue.getInstanceId();
154
155 return fieldName.concat(DDMImpl.INSTANCE_SEPARATOR).concat(instanceId);
156 }
157
158 protected void setDDMFieldLocalizedValue(
159 Field ddmField, String type, Value value) {
160
161 for (Locale availableLocales : value.getAvailableLocales()) {
162 Serializable serializable = FieldConstants.getSerializable(
163 type, value.getString(availableLocales));
164
165 ddmField.addValue(availableLocales, serializable);
166 }
167 }
168
169 protected void setDDMFieldUnlocalizedValue(
170 Field ddmField, String type, Value value, Locale defaultLocale) {
171
172 Serializable serializable = FieldConstants.getSerializable(
173 type, value.getString(LocaleUtil.ROOT));
174
175 ddmField.addValue(defaultLocale, serializable);
176 }
177
178 protected void setDDMFieldValue(
179 Field ddmField, String type, Value value, Locale defaultLocale) {
180
181 if (value.isLocalized()) {
182 setDDMFieldLocalizedValue(ddmField, type, value);
183 }
184 else {
185 setDDMFieldUnlocalizedValue(ddmField, type, value, defaultLocale);
186 }
187 }
188
189 }