1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.uif.element;
17
18 import com.google.common.collect.Lists;
19 import com.google.common.collect.Maps;
20 import org.apache.commons.lang.StringUtils;
21 import org.kuali.rice.krad.datadictionary.parse.BeanTag;
22 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
23 import org.kuali.rice.krad.uif.UifConstants;
24 import org.kuali.rice.krad.uif.component.Component;
25 import org.kuali.rice.krad.uif.container.Container;
26 import org.kuali.rice.krad.uif.container.ContainerBase;
27 import org.kuali.rice.krad.uif.container.PageGroup;
28 import org.kuali.rice.krad.uif.field.FieldGroup;
29 import org.kuali.rice.krad.uif.field.InputField;
30 import org.kuali.rice.krad.uif.util.MessageStructureUtils;
31 import org.kuali.rice.krad.uif.view.View;
32 import org.kuali.rice.krad.util.ErrorMessage;
33 import org.kuali.rice.krad.util.GlobalVariables;
34 import org.kuali.rice.krad.util.KRADUtils;
35 import org.kuali.rice.krad.util.MessageMap;
36 import org.springframework.util.AutoPopulatingList;
37
38 import java.beans.PropertyEditor;
39 import java.util.ArrayList;
40 import java.util.Arrays;
41 import java.util.Collection;
42 import java.util.HashSet;
43 import java.util.List;
44 import java.util.Map;
45 import java.util.Set;
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 @BeanTag(name = "validationMessages-bean", parent = "Uif-ValidationMessagesBase")
61 public class ValidationMessages extends ContentElementBase {
62 private static final long serialVersionUID = 780940788435330077L;
63
64 private List<String> additionalKeysToMatch;
65
66 private boolean displayMessages;
67
68
69 private List<String> errors;
70 private List<String> warnings;
71 private List<String> infos;
72
73 private Map<String, String> validationDataDefaults;
74
75
76
77
78
79
80
81
82
83
84
85 @Override
86 public void performFinalize(View view, Object model, Component parent) {
87 super.performFinalize(view, model, parent);
88
89 generateMessages(true, view, model, parent);
90 }
91
92
93
94
95
96
97
98
99
100 public void generateMessages(boolean reset, View view, Object model, Component parent) {
101 if (reset) {
102 errors = new ArrayList<String>();
103 warnings = new ArrayList<String>();
104 infos = new ArrayList<String>();
105 }
106
107 List<String> masterKeyList = getKeys(parent);
108 MessageMap messageMap = GlobalVariables.getMessageMap();
109
110 String parentContainerId = "";
111 Object parentContainer = parent.getContext().get("parent");
112
113 if (parentContainer != null && (parentContainer instanceof Container
114 || parentContainer instanceof FieldGroup)) {
115 parentContainerId = ((Component) parentContainer).getId();
116 }
117
118
119 if (parentContainer != null && parentContainer instanceof Message && ((Message) parentContainer)
120 .isGenerateSpan()) {
121 parentContainerId = ((Component) parentContainer).getId();
122 }
123
124
125 if (parentContainer != null && parentContainer instanceof Component && StringUtils.isBlank(parentContainerId)) {
126 parentContainer = ((Component) parentContainer).getContext().get("parent");
127 if (parentContainer != null && (parentContainer instanceof Container
128 || parentContainer instanceof FieldGroup)) {
129 parentContainerId = ((Component) parentContainer).getId();
130 }
131 }
132
133
134 this.addDataAttribute(UifConstants.DataAttributes.MESSAGES_FOR, parent.getId());
135
136 if (parent.getDataAttributes().get(UifConstants.DataAttributes.PARENT) == null) {
137 parent.addDataAttribute(UifConstants.DataAttributes.PARENT, parentContainerId);
138 }
139
140
141
142 if (parentContainer != null && parentContainer instanceof FieldGroup) {
143 masterKeyList.add(parentContainerId);
144 }
145
146
147
148 if (parent instanceof PageGroup) {
149 Map<String, PropertyEditor> propertyEditors = view.getViewIndex().getFieldPropertyEditors();
150 Map<String, PropertyEditor> securePropertyEditors = view.getViewIndex().getSecureFieldPropertyEditors();
151 List<String> allPossibleKeys = new ArrayList<String>(propertyEditors.keySet());
152 allPossibleKeys.addAll(securePropertyEditors.keySet());
153
154 this.addNestedGroupKeys(allPossibleKeys, parent);
155 if (additionalKeysToMatch != null) {
156 allPossibleKeys.addAll(additionalKeysToMatch);
157 }
158 if (StringUtils.isNotBlank(parent.getId())) {
159 allPossibleKeys.add(parent.getId());
160 }
161
162 Set<String> messageKeys = new HashSet<String>();
163 messageKeys.addAll(messageMap.getAllPropertiesWithErrors());
164 messageKeys.addAll(messageMap.getAllPropertiesWithWarnings());
165 messageKeys.addAll(messageMap.getAllPropertiesWithInfo());
166
167 messageKeys.removeAll(allPossibleKeys);
168
169 masterKeyList.addAll(messageKeys);
170 }
171
172 for (String key : masterKeyList) {
173 errors.addAll(getMessages(view, key, messageMap.getErrorMessagesForProperty(key, true)));
174 warnings.addAll(getMessages(view, key, messageMap.getWarningMessagesForProperty(key, true)));
175 infos.addAll(getMessages(view, key, messageMap.getInfoMessagesForProperty(key, true)));
176 }
177 }
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192 private List<String> getMessages(View view, String key, List<AutoPopulatingList<ErrorMessage>> lists) {
193 List<String> result = new ArrayList<String>();
194 for (List<ErrorMessage> errorList : lists) {
195 if (errorList != null && StringUtils.isNotBlank(key)) {
196 for (ErrorMessage e : errorList) {
197 String message = KRADUtils.getMessageText(e, true);
198 message = MessageStructureUtils.translateStringMessage(message);
199
200 result.add(message);
201 }
202 }
203 }
204
205 return result;
206 }
207
208
209
210
211
212
213
214
215
216
217 protected List<String> getKeys(Component parent) {
218 List<String> keyList = new ArrayList<String>();
219 if (additionalKeysToMatch != null) {
220 keyList.addAll(additionalKeysToMatch);
221 }
222 if (StringUtils.isNotBlank(parent.getId())) {
223 keyList.add(parent.getId());
224 }
225 if (parent instanceof InputField) {
226 if (((InputField) parent).getBindingInfo() != null && StringUtils.isNotEmpty(
227 ((InputField) parent).getBindingInfo().getBindingPath())) {
228 keyList.add(((InputField) parent).getBindingInfo().getBindingPath());
229 }
230 }
231
232 return keyList;
233 }
234
235
236
237
238
239
240
241
242 private void addNestedGroupKeys(Collection<String> keyList, Component component) {
243 for (Component c : component.getComponentsForLifecycle()) {
244 ValidationMessages ef = null;
245 if (c instanceof ContainerBase) {
246 ef = ((ContainerBase) c).getValidationMessages();
247 } else if (c instanceof FieldGroup) {
248 ef = ((FieldGroup) c).getGroup().getValidationMessages();
249 }
250 if (ef != null) {
251 keyList.addAll(ef.getKeys(c));
252 addNestedGroupKeys(keyList, c);
253 }
254 }
255 }
256
257
258
259
260
261
262
263
264
265 @BeanTagAttribute(name = "additionalKeysToMatch", type = BeanTagAttribute.AttributeType.LISTVALUE)
266 public List<String> getAdditionalKeysToMatch() {
267 return this.additionalKeysToMatch;
268 }
269
270
271
272
273
274
275
276 public void setAdditionalKeysToMatch(String additionalKeysToMatch) {
277 if (StringUtils.isNotBlank(additionalKeysToMatch)) {
278 this.additionalKeysToMatch = Arrays.asList(StringUtils.split(additionalKeysToMatch, ","));
279 }
280 }
281
282
283
284
285 public void setAdditionalKeysToMatch(List<String> additionalKeysToMatch) {
286 this.additionalKeysToMatch = additionalKeysToMatch;
287 }
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302 @BeanTagAttribute(name = "displayMessages")
303 public boolean isDisplayMessages() {
304 return this.displayMessages;
305 }
306
307
308
309
310 public void setDisplayMessages(boolean displayMessages) {
311 this.displayMessages = displayMessages;
312 }
313
314
315
316
317
318
319
320 @BeanTagAttribute(name = "errors", type = BeanTagAttribute.AttributeType.LISTVALUE)
321 public List<String> getErrors() {
322 return this.errors;
323 }
324
325
326
327
328
329
330
331 @BeanTagAttribute(name = "warnings", type = BeanTagAttribute.AttributeType.LISTVALUE)
332 public List<String> getWarnings() {
333 return this.warnings;
334 }
335
336
337
338
339
340
341
342 @BeanTagAttribute(name = "infos", type = BeanTagAttribute.AttributeType.LISTVALUE)
343 public List<String> getInfos() {
344 return this.infos;
345 }
346
347 public Map<String, String> getValidationDataDefaults() {
348 return validationDataDefaults;
349 }
350
351 public void setValidationDataDefaults(Map<String, String> validationDataDefaults) {
352 this.validationDataDefaults = validationDataDefaults;
353 }
354
355 protected void addValidationDataSettingsValue(Map<String, Object> valueMap, Map<String, String> defaults,
356 String key, Object value) {
357 String defaultValue = defaults.get(key);
358 if ((defaultValue != null && !value.toString().equals(defaultValue)) || (defaultValue != null && defaultValue
359 .equals("[]") && value instanceof List && !((List) value).isEmpty()) || defaultValue == null) {
360 valueMap.put(key, value);
361 }
362 }
363
364 public void setErrors(List<String> errors) {
365 this.errors = errors;
366 }
367
368 public void setWarnings(List<String> warnings) {
369 this.warnings = warnings;
370 }
371
372 public void setInfos(List<String> infos) {
373 this.infos = infos;
374 }
375
376
377
378
379 @Override
380 protected <T> void copyProperties(T component) {
381 super.copyProperties(component);
382 ValidationMessages validationMessagesCopy = (ValidationMessages) component;
383
384 if (additionalKeysToMatch != null) {
385 List<String> additionalKeysToMatchCopy = Lists.newArrayListWithExpectedSize(additionalKeysToMatch.size());
386 for (String additionalKeyToMatch : additionalKeysToMatch) {
387 additionalKeysToMatchCopy.add(additionalKeyToMatch);
388 }
389
390 validationMessagesCopy.setAdditionalKeysToMatch(additionalKeysToMatchCopy);
391 }
392
393 validationMessagesCopy.setDisplayMessages(this.isDisplayMessages());
394
395 if (warnings != null) {
396
397 List<String> warningsCopy = Lists.newArrayListWithExpectedSize(warnings.size());
398 for (String warning : warnings) {
399 warningsCopy.add(warning);
400 }
401
402 validationMessagesCopy.setWarnings(warningsCopy);
403 }
404
405 if (errors != null) {
406 List<String> errorsCopy = Lists.newArrayListWithExpectedSize(errors.size());
407 for (String error : errors) {
408 errorsCopy.add(error);
409 }
410
411 validationMessagesCopy.setErrors(errorsCopy);
412 }
413
414 if (infos != null) {
415 List<String> infosCopy = Lists.newArrayListWithExpectedSize(infos.size());
416 for (String info : infos) {
417 infosCopy.add(info);
418 }
419
420 validationMessagesCopy.setInfos(infosCopy);
421 }
422
423 if (this.getValidationDataDefaults() != null) {
424 Map<String, String> validationDataDefaultsCopy = Maps.newHashMapWithExpectedSize(
425 this.getValidationDataDefaults().size());
426 for (Map.Entry validationDataDefault : getValidationDataDefaults().entrySet()) {
427 validationDataDefaultsCopy.put(validationDataDefault.getKey().toString(),
428 validationDataDefault.getValue().toString());
429 }
430
431 validationMessagesCopy.setValidationDataDefaults(validationDataDefaultsCopy);
432 }
433 }
434
435 }