1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.krad.datadictionary.validation.constraint;
17  
18  import org.kuali.rice.krad.datadictionary.DictionaryBeanBase;
19  import org.kuali.rice.krad.datadictionary.parse.BeanTag;
20  import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
21  import org.kuali.rice.krad.datadictionary.validator.ErrorReport;
22  import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
23  
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  @BeanTag(name = "constraint")
39  public class BaseConstraint extends DictionaryBeanBase implements Constraint {
40      private static final long serialVersionUID = -2891712660500311114L;
41  
42      protected String messageNamespaceCode;
43      protected String messageComponentCode;
44      protected String messageKey;
45  
46      protected Boolean applyClientSide;
47  
48      protected List<String> validationMessageParams;
49      protected List<String> states;
50      protected List<? extends BaseConstraint> constraintStateOverrides;
51  
52      public BaseConstraint() {
53          applyClientSide = Boolean.valueOf(true);
54      }
55  
56      
57  
58  
59  
60  
61  
62  
63  
64  
65  
66      @BeanTagAttribute(name = "messageNamespaceCode")
67      public String getMessageNamespaceCode() {
68          return messageNamespaceCode;
69      }
70  
71      
72  
73  
74  
75  
76      public void setMessageNamespaceCode(String messageNamespaceCode) {
77          this.messageNamespaceCode = messageNamespaceCode;
78      }
79  
80      
81  
82  
83  
84  
85  
86  
87  
88  
89  
90      @BeanTagAttribute(name = "messageComponentCode")
91      public String getMessageComponentCode() {
92          return messageComponentCode;
93      }
94  
95      
96  
97  
98  
99  
100     public void setMessageComponentCode(String messageComponentCode) {
101         this.messageComponentCode = messageComponentCode;
102     }
103 
104     
105 
106 
107 
108 
109 
110     @BeanTagAttribute(name = "messageKey")
111     public String getMessageKey() {
112         return messageKey;
113     }
114 
115     
116 
117 
118 
119 
120     public void setMessageKey(String messageKey) {
121         this.messageKey = messageKey;
122     }
123 
124     
125 
126 
127 
128 
129 
130     @BeanTagAttribute(name = "applyClientSide")
131     public Boolean getApplyClientSide() {
132         return this.applyClientSide;
133     }
134 
135     
136 
137 
138     public void setApplyClientSide(Boolean applyClientSide) {
139         this.applyClientSide = applyClientSide;
140     }
141 
142     
143 
144 
145 
146 
147 
148     @BeanTagAttribute(name = "validationMessageParams", type = BeanTagAttribute.AttributeType.LISTVALUE)
149     public List<String> getValidationMessageParams() {
150         return this.validationMessageParams;
151     }
152 
153     
154 
155 
156 
157 
158 
159     public String[] getValidationMessageParamsArray() {
160         if (this.getValidationMessageParams() != null) {
161             return this.getValidationMessageParams().toArray(new String[this.getValidationMessageParams().size()]);
162         } else {
163             return null;
164         }
165 
166     }
167 
168     
169 
170 
171     public void setValidationMessageParams(List<String> validationMessageParams) {
172         this.validationMessageParams = validationMessageParams;
173     }
174 
175     
176 
177 
178 
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197     @BeanTagAttribute(name = "states", type = BeanTagAttribute.AttributeType.LISTVALUE)
198     public List<String> getStates() {
199         if (states == null) {
200             states = new ArrayList<String>();
201         }
202         return states;
203     }
204 
205     
206 
207 
208 
209 
210     public void setStates(List<String> states) {
211         this.states = states;
212     }
213 
214     
215 
216 
217 
218 
219 
220 
221 
222 
223 
224 
225 
226     @BeanTagAttribute(name = "constraintStateOverrides", type = BeanTagAttribute.AttributeType.LISTBEAN)
227     public List<? extends BaseConstraint> getConstraintStateOverrides() {
228         return constraintStateOverrides;
229     }
230 
231     
232 
233 
234 
235 
236     public void setConstraintStateOverrides(List<? extends BaseConstraint> constraintStateOverrides) {
237         if (constraintStateOverrides != null) {
238             for (BaseConstraint bc : constraintStateOverrides) {
239                 if (!bc.getClass().equals(this.getClass())) {
240                     List<Class<?>> superClasses = new ArrayList<Class<?>>();
241                     Class<?> o = bc.getClass();
242                     while (o != null && !o.equals(BaseConstraint.class)) {
243                         superClasses.add(o);
244                         o = o.getSuperclass();
245                     }
246 
247                     List<Class<?>> thisSuperClasses = new ArrayList<Class<?>>();
248                     o = this.getClass();
249                     while (o != null && !o.equals(BaseConstraint.class)) {
250                         thisSuperClasses.add(o);
251                         o = o.getSuperclass();
252                     }
253                     superClasses.retainAll(thisSuperClasses);
254 
255                     if (superClasses.isEmpty()) {
256                         throw new RuntimeException("Constraint State Override is not a correct type, type should be " +
257                                 this.getClass().toString() + " (or child/parent of that constraint type)");
258                     }
259                 }
260                 if (bc.getStates().isEmpty()) {
261                     throw new RuntimeException(
262                             "Constraint State Overrides MUST declare the states they apply to.  No states"
263                                     + "were declared.");
264                 }
265             }
266         }
267         this.constraintStateOverrides = constraintStateOverrides;
268     }
269 
270 
271 
272     
273 
274 
275 
276 
277 
278     public void completeValidation(ValidationTrace tracer) {
279         tracer.addBean("BaseConstraint", getMessageKey());
280 
281         if (getConstraintStateOverrides() != null) {
282             for (int i = 0; i < constraintStateOverrides.size(); i++) {
283                 if (constraintStateOverrides.get(i).getStates() == null) {
284                     String currentValues[] =
285                             {"constraintStateOverrides(" + i + ").messageKey =" + constraintStateOverrides.get(i)
286                                     .getMessageKey()};
287                     tracer.createError("Constraints set in State Overrides must have there states property set",
288                             currentValues);
289                 }
290                 constraintStateOverrides.get(i).completeValidation(tracer.getCopy());
291             }
292         }
293 
294         if (getMessageKey() == null) {
295             String currentValues[] = {"messageKey =" + getMessageKey()};
296             tracer.createWarning("Message key is not set", currentValues);
297             ErrorReport error = new ErrorReport(ErrorReport.WARNING);
298         }
299     }
300 }