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.storage;
016    
017    import com.liferay.portal.kernel.util.MapUtil;
018    import com.liferay.portal.kernel.util.Validator;
019    import com.liferay.portlet.dynamicdatamapping.StorageException;
020    import com.liferay.portlet.dynamicdatamapping.StorageFieldNameException;
021    import com.liferay.portlet.dynamicdatamapping.StorageFieldRequiredException;
022    import com.liferay.portlet.dynamicdatamapping.StorageFieldValueException;
023    import com.liferay.portlet.dynamicdatamapping.model.DDMForm;
024    import com.liferay.portlet.dynamicdatamapping.model.DDMFormField;
025    import com.liferay.portlet.dynamicdatamapping.model.Value;
026    
027    import java.util.Collections;
028    import java.util.List;
029    import java.util.Locale;
030    import java.util.Map;
031    import java.util.Set;
032    
033    /**
034     * @author Marcellus Tavares
035     */
036    public class DDMFormValuesValidatorImpl implements DDMFormValuesValidator {
037    
038            @Override
039            public void validate(DDMFormValues ddmFormValues) throws StorageException {
040                    DDMForm ddmForm = ddmFormValues.getDDMForm();
041    
042                    if (ddmForm == null) {
043                            throw new NullPointerException("A DDM Form instance was never set");
044                    }
045    
046                    traverseDDMFormFields(
047                            ddmForm.getDDMFormFields(),
048                            ddmFormValues.getDDMFormFieldValuesMap());
049    
050                    traverseDDMFormFieldValues(
051                            ddmFormValues.getDDMFormFieldValues(),
052                            ddmForm.getDDMFormFieldsMap(false));
053            }
054    
055            protected List<DDMFormFieldValue> getDDMFormFieldValuesByFieldName(
056                    Map<String, List<DDMFormFieldValue>> ddmFormFieldValuesMap,
057                    String fieldName) {
058    
059                    List<DDMFormFieldValue> ddmFormFieldValues = ddmFormFieldValuesMap.get(
060                            fieldName);
061    
062                    if (ddmFormFieldValues == null) {
063                            return Collections.emptyList();
064                    }
065    
066                    return ddmFormFieldValues;
067            }
068    
069            protected boolean isNull(Value value) {
070                    if ((value == null) || MapUtil.isEmpty(value.getValues())) {
071                            return true;
072                    }
073    
074                    return false;
075            }
076    
077            protected void traverseDDMFormFields(
078                            List<DDMFormField> ddmFormFields,
079                            Map<String, List<DDMFormFieldValue>> ddmFormFieldValuesMap)
080                    throws StorageException {
081    
082                    for (DDMFormField ddmFormField : ddmFormFields) {
083                            List<DDMFormFieldValue> ddmFormFieldValues =
084                                    getDDMFormFieldValuesByFieldName(
085                                            ddmFormFieldValuesMap, ddmFormField.getName());
086    
087                            validateDDMFormFieldValues(ddmFormField, ddmFormFieldValues);
088    
089                            for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) {
090                                    traverseDDMFormFields(
091                                            ddmFormField.getNestedDDMFormFields(),
092                                            ddmFormFieldValue.getNestedDDMFormFieldValuesMap());
093                            }
094                    }
095            }
096    
097            protected void traverseDDMFormFieldValues(
098                            List<DDMFormFieldValue> ddmFormFieldValues,
099                            Map<String, DDMFormField> ddmFormFieldsMap)
100                    throws StorageException {
101    
102                    for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) {
103                            validateDDMFormFieldValue(
104                                    ddmFormFieldsMap.get(ddmFormFieldValue.getName()),
105                                    ddmFormFieldValue);
106                    }
107            }
108    
109            protected void validateDDMFormFieldValue(
110                            DDMFormField ddmFormField, DDMFormFieldValue ddmFormFieldValue)
111                    throws StorageException {
112    
113                    if (ddmFormField == null) {
114                            throw new StorageFieldNameException(
115                                    "There is no such field name defined on DDM Form " +
116                                            ddmFormFieldValue.getName());
117                    }
118    
119                    DDMFormValues ddmFormValues = ddmFormFieldValue.getDDMFormValues();
120    
121                    validateDDMFormFieldValue(
122                            ddmFormField, ddmFormValues.getAvailableLocales(),
123                            ddmFormValues.getDefaultLocale(), ddmFormFieldValue.getValue());
124    
125                    traverseDDMFormFieldValues(
126                            ddmFormFieldValue.getNestedDDMFormFieldValues(),
127                            ddmFormField.getNestedDDMFormFieldsMap());
128            }
129    
130            protected void validateDDMFormFieldValue(
131                            DDMFormField ddmFormField, Set<Locale> availableLocales,
132                            Locale defaultLocale, Value value)
133                    throws StorageException {
134    
135                    if (isNull(value)) {
136                            throw new StorageFieldValueException(
137                                    "No value defined for field " + ddmFormField.getName());
138                    }
139    
140                    if (Validator.isNull(ddmFormField.getDataType())) {
141                            throw new StorageFieldValueException(
142                                    "Value should not be set for field " +
143                                            ddmFormField.getName());
144                    }
145    
146                    if ((ddmFormField.isLocalizable() && !value.isLocalized()) ||
147                            (!ddmFormField.isLocalizable() && value.isLocalized())) {
148    
149                            throw new StorageFieldValueException(
150                                    "Invalid value set for field " + ddmFormField.getName());
151                    }
152    
153                    validateDDMFormFieldValueLocales(
154                            ddmFormField, availableLocales, defaultLocale, value);
155            }
156    
157            protected void validateDDMFormFieldValueLocales(
158                            DDMFormField ddmFormField, Set<Locale> availableLocales,
159                            Locale defaultLocale, Value value)
160                    throws StorageException {
161    
162                    if (!value.isLocalized()) {
163                            return;
164                    }
165    
166                    if (!availableLocales.equals(value.getAvailableLocales())) {
167                            throw new StorageFieldValueException(
168                                    "Invalid available locales set for field " +
169                                            ddmFormField.getName());
170                    }
171    
172                    if (!defaultLocale.equals(value.getDefaultLocale())) {
173                            throw new StorageFieldValueException(
174                                    "Invalid default locale set for field " +
175                                            ddmFormField.getName());
176                    }
177            }
178    
179            protected void validateDDMFormFieldValues(
180                            DDMFormField ddmFormField,
181                            List<DDMFormFieldValue> ddmFormFieldValues)
182                    throws StorageException {
183    
184                    if (ddmFormField.isRequired() && (ddmFormFieldValues.size() == 0)) {
185                            throw new StorageFieldRequiredException(
186                                    "No value defined for field " + ddmFormField.getName());
187                    }
188    
189                    if (!ddmFormField.isRepeatable() && (ddmFormFieldValues.size() > 1)) {
190                            throw new StorageFieldValueException(
191                                    "Incorrect number of values set for field " +
192                                            ddmFormField.getName());
193                    }
194            }
195    
196    }