1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.datadictionary.validation.processor;
17
18 import org.kuali.rice.core.api.util.RiceKeyConstants;
19 import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
20 import org.kuali.rice.krad.datadictionary.validation.AttributeValueReader;
21 import org.kuali.rice.krad.datadictionary.validation.ErrorLevel;
22 import org.kuali.rice.krad.datadictionary.validation.ValidationUtils;
23 import org.kuali.rice.krad.datadictionary.validation.constraint.Constraint;
24 import org.kuali.rice.krad.datadictionary.validation.constraint.MustOccurConstraint;
25 import org.kuali.rice.krad.datadictionary.validation.constraint.PrerequisiteConstraint;
26 import org.kuali.rice.krad.datadictionary.validation.result.ConstraintValidationResult;
27 import org.kuali.rice.krad.datadictionary.validation.result.DictionaryValidationResult;
28 import org.kuali.rice.krad.datadictionary.validation.result.ProcessorResult;
29
30 import java.util.List;
31
32
33
34
35
36 public class MustOccurConstraintProcessor extends BasePrerequisiteConstraintProcessor<MustOccurConstraint> {
37
38 private static final String CONSTRAINT_NAME = "must occur constraint";
39
40
41
42
43 @Override
44 public ProcessorResult process(DictionaryValidationResult result,
45 Object value, MustOccurConstraint constraint, AttributeValueReader attributeValueReader)
46 throws AttributeValidationException {
47
48 if (ValidationUtils.isNullOrEmpty(value))
49 return new ProcessorResult(result.addSkipped(attributeValueReader, CONSTRAINT_NAME));
50
51
52 ConstraintValidationResult constraintValidationResult = new ConstraintValidationResult(CONSTRAINT_NAME);
53
54 if (!processMustOccurConstraint(constraintValidationResult, constraint, attributeValueReader)) {
55
56 if (attributeValueReader.getAttributeName() == null){
57 constraintValidationResult.setAttributeName(attributeValueReader.getPath());
58 } else{
59 constraintValidationResult.setAttributeName(attributeValueReader.getAttributeName());
60 constraintValidationResult.setAttributePath(attributeValueReader.getPath());
61 }
62 constraintValidationResult.setError(RiceKeyConstants.ERROR_OCCURS);
63 }
64
65
66 constraintValidationResult.setConstraintLabelKey(constraint.getLabelKey());
67
68 result.addConstraintValidationResult(attributeValueReader, constraintValidationResult);
69
70 return new ProcessorResult(constraintValidationResult);
71
72 }
73
74 @Override
75 public String getName() {
76 return CONSTRAINT_NAME;
77 }
78
79
80
81
82 @Override
83 public Class<? extends Constraint> getConstraintType() {
84 return MustOccurConstraint.class;
85 }
86
87 protected boolean processMustOccurConstraint(ConstraintValidationResult topLevelResult, MustOccurConstraint constraint, AttributeValueReader attributeValueReader) throws AttributeValidationException {
88
89 boolean isSuccessful = false;
90 int trueCount = 0;
91
92 List<PrerequisiteConstraint> prerequisiteConstraints = constraint.getPrerequisiteConstraints();
93 if (prerequisiteConstraints != null) {
94 for (PrerequisiteConstraint prerequisiteConstraint : prerequisiteConstraints) {
95 ConstraintValidationResult constraintValidationResult = processPrerequisiteConstraint(prerequisiteConstraint, attributeValueReader);
96
97 topLevelResult.addChild(constraintValidationResult);
98 trueCount += (constraintValidationResult.getStatus().getLevel() <= ErrorLevel.WARN.getLevel()) ? 1 : 0;
99 }
100 }
101
102 List<MustOccurConstraint> mustOccurConstraints = constraint.getMustOccurConstraints();
103 if (mustOccurConstraints != null) {
104 for (MustOccurConstraint mustOccurConstraint : mustOccurConstraints) {
105
106
107 ConstraintValidationResult constraintValidationResult = new ConstraintValidationResult(CONSTRAINT_NAME);
108 topLevelResult.addChild(constraintValidationResult);
109 trueCount += (processMustOccurConstraint(constraintValidationResult, mustOccurConstraint, attributeValueReader)) ? 1 : 0;
110 }
111 }
112
113 int minimum = constraint.getMin() != null ? constraint.getMin().intValue() : 0;
114 int maximum = constraint.getMax() != null ? constraint.getMax().intValue() : 0;
115
116 isSuccessful = (trueCount >= minimum && trueCount <= maximum) ? true : false;
117
118 return isSuccessful;
119 }
120
121 }