1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.validator;
17
18 import static org.seasar.cubby.CubbyConstants.ATTR_CONVERSION_ERRORS;
19
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Map.Entry;
24
25 import javax.servlet.http.HttpServletRequest;
26
27 import org.seasar.cubby.action.ActionErrors;
28 import org.seasar.cubby.action.FieldInfo;
29 import org.seasar.cubby.internal.controller.ThreadContext;
30 import org.seasar.cubby.internal.util.RequestUtils;
31 import org.seasar.cubby.util.Messages;
32
33
34
35
36
37
38
39 public class ConversionValidationRule implements ValidationRule {
40
41
42 private final Map<FieldInfo, MessageInfo> messages = new HashMap<FieldInfo, MessageInfo>();
43
44
45
46
47 public void apply(final Map<String, Object[]> params, final Object form,
48 final ActionErrors errors) throws ValidationException {
49 final HttpServletRequest request = ThreadContext.getRequest();
50 final ActionErrors conversionErrors = RequestUtils.getAttribute(
51 request, ATTR_CONVERSION_ERRORS);
52 if (conversionErrors != null) {
53 merge(conversionErrors, errors);
54 }
55 }
56
57
58
59
60
61
62
63
64
65
66
67
68 public ConversionValidationRule add(final String fieldName,
69 final String messageKey, final Object... arguments) {
70 final FieldInfo fieldInfo = new FieldInfo(fieldName);
71 putToMessages(fieldInfo, messageKey, arguments);
72 return this;
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public ConversionValidationRule add(final String fieldName,
89 final int index, final String messageKey, final Object... arguments) {
90 final FieldInfo fieldInfo = new FieldInfo(fieldName, index);
91 putToMessages(fieldInfo, messageKey, arguments);
92 return this;
93 }
94
95 private void putToMessages(final FieldInfo fieldInfo,
96 final String messageKey, final Object... arguments) {
97 final MessageInfo messageInfo = new MessageInfo();
98 messageInfo.setKey(messageKey);
99 messageInfo.setArguments(arguments);
100 this.messages.put(fieldInfo, messageInfo);
101 }
102
103 private void merge(final ActionErrors from, final ActionErrors to) {
104 for (final Entry<String, Map<Integer, List<String>>> indexedField : from
105 .getIndexedFields().entrySet()) {
106 final String fieldName = indexedField.getKey();
107 for (final Entry<Integer, List<String>> field : indexedField
108 .getValue().entrySet()) {
109 final Integer index = field.getKey();
110 for (final String message : field.getValue()) {
111 final FieldInfo fieldInfo;
112 if (index == null) {
113 fieldInfo = new FieldInfo(fieldName);
114 } else {
115 fieldInfo = new FieldInfo(fieldName, index);
116 }
117 to.add(message(message, fieldInfo), fieldInfo);
118 }
119 }
120 }
121 }
122
123 private String message(final String message, final FieldInfo fieldInfo) {
124 if (messages.containsKey(fieldInfo)) {
125 final MessageInfo messageInfo = messages.get(fieldInfo);
126 return messageInfo.builder().fieldNameKey(fieldInfo.getName())
127 .toString();
128 } else {
129 return message;
130 }
131 }
132
133 }