001
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
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 }