001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
035     * @author Marcellus Tavares
036     */
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    }