1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.validator;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Map;
21
22 import org.seasar.cubby.action.ActionErrors;
23 import org.seasar.cubby.action.FieldInfo;
24 import org.seasar.cubby.action.MessageInfo;
25
26
27
28
29
30
31
32 public class FieldValidationRule implements ValidationRule {
33
34
35 private static final Object[] EMPTY_VALUES = new Object[] { "" };
36
37
38 private final String fieldName;
39
40
41 private final String fieldNameKey;
42
43
44 private final List<ValidationInvoker> invokers = new ArrayList<ValidationInvoker>();
45
46
47
48
49
50
51
52
53
54 public FieldValidationRule(final String fieldName,
55 final Validator... validators) {
56 this(fieldName, fieldName, validators);
57 }
58
59
60
61
62
63
64
65
66
67
68
69 public FieldValidationRule(final String fieldName,
70 final String fieldNameKey, final Validator... validators) {
71 this.fieldName = fieldName;
72 this.fieldNameKey = fieldNameKey;
73 for (final Validator validator : validators) {
74 final ValidationInvoker invoker = createInvoker(validator);
75 this.invokers.add(invoker);
76 }
77 }
78
79
80
81
82
83
84
85 public void apply(final Map<String, Object[]> params, final Object form,
86 final ActionErrors errors) {
87 final Object[] values = getValues(params, this.fieldName);
88 for (final ValidationInvoker invoker : this.invokers) {
89 invoker.invoke(this, values, errors);
90 }
91 }
92
93
94
95
96
97
98
99
100
101
102 private Object[] getValues(final Map<String, Object[]> params,
103 final String fieldName) {
104 final Object[] values = params.get(fieldName);
105 if (values != null) {
106 return values;
107 }
108 return EMPTY_VALUES;
109 }
110
111
112
113
114
115
116 public String getFieldName() {
117 return fieldName;
118 }
119
120
121
122
123
124
125 public String getFieldNameKey() {
126 return fieldNameKey;
127 }
128
129
130
131
132
133
134
135
136 private ValidationInvoker createInvoker(final Validator validator) {
137 final ValidationInvoker invoker;
138 if (validator instanceof ArrayFieldValidator) {
139 invoker = new ArrayFieldValidationInvoker(
140 (ArrayFieldValidator) validator);
141 } else if (validator instanceof ScalarFieldValidator) {
142 invoker = new ScalarFieldValidationInvoker(
143 (ScalarFieldValidator) validator);
144 } else {
145 throw new UnsupportedOperationException();
146 }
147 return invoker;
148 }
149
150
151
152
153
154
155
156 private interface ValidationInvoker {
157
158
159
160
161
162
163
164
165
166
167
168 void invoke(FieldValidationRule validationRule, Object[] values,
169 ActionErrors errors);
170
171 }
172
173
174
175
176
177
178
179 private static class ArrayFieldValidationInvoker implements
180 ValidationInvoker {
181
182
183
184
185
186 private final ArrayFieldValidator validator;
187
188
189
190
191
192
193
194 public ArrayFieldValidationInvoker(final ArrayFieldValidator validator) {
195 this.validator = validator;
196 }
197
198
199
200
201 public void invoke(final FieldValidationRule validationRule,
202 final Object[] values, final ActionErrors errors) {
203 final ValidationContext context = new ValidationContext();
204 final FieldInfo fieldInfo = new FieldInfo(validationRule
205 .getFieldName());
206 this.validator.validate(context, values);
207 for (final MessageInfo messageInfo : context.getMessageInfos()) {
208 final String message = messageInfo.toMessage(validationRule
209 .getFieldNameKey());
210 errors.add(message, fieldInfo);
211 }
212 }
213
214 }
215
216
217
218
219
220
221
222 private static class ScalarFieldValidationInvoker implements
223 ValidationInvoker {
224
225
226
227
228
229 private final ScalarFieldValidator validator;
230
231
232
233
234
235
236
237 public ScalarFieldValidationInvoker(final ScalarFieldValidator validator) {
238 this.validator = validator;
239 }
240
241
242
243
244 public void invoke(final FieldValidationRule validationRule,
245 final Object[] values, final ActionErrors errors) {
246 for (int i = 0; i < values.length; i++) {
247 final ValidationContext context = new ValidationContext();
248 final FieldInfo fieldInfo = new FieldInfo(validationRule
249 .getFieldName(), i);
250 this.validator.validate(context, values[i]);
251 for (final MessageInfo messageInfo : context.getMessageInfos()) {
252 final String message = messageInfo.toMessage(validationRule
253 .getFieldNameKey());
254 errors.add(message, fieldInfo);
255 }
256 }
257 }
258
259 }
260
261 }