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