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
25
26
27
28
29
30
31 public class FieldValidationRule implements ValidationRule {
32
33
34 private static final Object[] EMPTY_VALUES = new Object[] { "" };
35
36
37 private final String fieldName;
38
39
40 private final String fieldNameKey;
41
42
43 private final List<ValidationInvoker> invokers = new ArrayList<ValidationInvoker>();
44
45
46
47
48
49
50
51
52
53 public FieldValidationRule(final String fieldName,
54 final Validator... validators) {
55 this(fieldName, fieldName, validators);
56 }
57
58
59
60
61
62
63
64
65
66
67
68 public FieldValidationRule(final String fieldName,
69 final String fieldNameKey, final Validator... validators) {
70 this.fieldName = fieldName;
71 this.fieldNameKey = fieldNameKey;
72 for (final Validator validator : validators) {
73 final ValidationInvoker invoker = createInvoker(validator);
74 this.invokers.add(invoker);
75 }
76 }
77
78
79
80
81
82
83
84 public void apply(final Map<String, Object[]> params, final Object form,
85 final ActionErrors errors) {
86 final Object[] values = getValues(params, this.fieldName);
87 for (final ValidationInvoker invoker : this.invokers) {
88 invoker.invoke(this, values, errors);
89 }
90 }
91
92
93
94
95
96
97
98
99
100
101 private Object[] getValues(final Map<String, Object[]> params,
102 final String fieldName) {
103 final Object[] values = params.get(fieldName);
104 if (values != null) {
105 return values;
106 }
107 return EMPTY_VALUES;
108 }
109
110
111
112
113
114
115 public String getFieldName() {
116 return fieldName;
117 }
118
119
120
121
122
123
124 public String getFieldNameKey() {
125 return fieldNameKey;
126 }
127
128
129
130
131
132
133
134
135 private ValidationInvoker createInvoker(final Validator validator) {
136 final ValidationInvoker invoker;
137 if (validator instanceof ArrayFieldValidator) {
138 invoker = new ArrayFieldValidationInvoker(
139 (ArrayFieldValidator) validator);
140 } else if (validator instanceof ScalarFieldValidator) {
141 invoker = new ScalarFieldValidationInvoker(
142 (ScalarFieldValidator) validator);
143 } else {
144 throw new UnsupportedOperationException();
145 }
146 return invoker;
147 }
148
149
150
151
152
153
154
155 private interface ValidationInvoker {
156
157
158
159
160
161
162
163
164
165
166
167 void invoke(FieldValidationRule validationRule, Object[] values,
168 ActionErrors errors);
169
170 }
171
172
173
174
175
176
177
178 private static class ArrayFieldValidationInvoker implements
179 ValidationInvoker {
180
181
182
183
184
185 private final ArrayFieldValidator validator;
186
187
188
189
190
191
192
193 public ArrayFieldValidationInvoker(final ArrayFieldValidator validator) {
194 this.validator = validator;
195 }
196
197
198
199
200 public void invoke(final FieldValidationRule validationRule,
201 final Object[] values, final ActionErrors errors) {
202 final ValidationContext context = new ValidationContext();
203 final FieldInfo fieldInfo = new FieldInfo(validationRule
204 .getFieldName());
205 this.validator.validate(context, values);
206 for (final MessageInfo message : context.getMessageInfos()) {
207 errors
208 .add(message.builder().fieldNameKey(
209 validationRule.getFieldNameKey()).toString(),
210 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.builder().fieldNameKey(
253 validationRule.getFieldNameKey()).toString();
254 errors.add(message, fieldInfo);
255 }
256 }
257 }
258
259 }
260
261 }