-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
BaseCustomizableValidator.java
75 lines (68 loc) · 2.65 KB
/
BaseCustomizableValidator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.validator;
import java.util.Collection;
import org.openmrs.api.APIException;
import org.openmrs.attribute.Attribute;
import org.openmrs.attribute.AttributeType;
import org.openmrs.customdatatype.Customizable;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
/**
* This abstract class provides utilities for validators for Customizable subclasses.
* @since 1.9
*/
public abstract class BaseCustomizableValidator implements Validator {
/**
* Validate the attributes of the given Customizable, given the list of relevant attribute types
*/
@SuppressWarnings("rawtypes")
public <T extends AttributeType, A extends Attribute> void validateAttributes(Customizable<A> customizable,
Errors errors, Collection<T> attributeTypes) {
// check to make sure that the target has the right number of each type of attribute
for (T at : attributeTypes) {
if ((at.getMinOccurs() > 0 || at.getMaxOccurs() != null) && !at.getRetired()) {
int numFound = 0;
for (A attr : customizable.getActiveAttributes()) {
if (attr.getAttributeType().equals(at)) {
++numFound;
}
}
if (at.getMinOccurs() > 0 && numFound < at.getMinOccurs()) {
// report an error
if (at.getMinOccurs() == 1) {
errors.rejectValue("activeAttributes", "error.required", new Object[] { at.getName() }, null);
} else {
errors.rejectValue("activeAttributes", "attribute.error.minOccurs", new Object[] { at.getName(),
at.getMinOccurs() }, null);
}
}
if (at.getMaxOccurs() != null && numFound > at.getMaxOccurs()) {
errors.rejectValue("activeAttributes", "attribute.error.maxOccurs", new Object[] { at.getName(),
at.getMaxOccurs() }, null);
}
}
}
// validate all non-voided attributes for their values (we already checked minOccurs and maxOccurs for the types)
boolean errorsInAttributes = false;
for (Attribute attr : customizable.getActiveAttributes()) {
try {
ValidateUtil.validate(attr);
}
catch (APIException ex) {
errorsInAttributes = true;
break;
}
}
if (errorsInAttributes) {
errors.rejectValue("attributes", "Customizable.error.inAttributes");
}
}
}