1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.validator;
18
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.Map;
22
23 import org.seasar.cubby.action.ActionErrors;
24 import org.seasar.cubby.action.FieldInfo;
25 import org.seasar.cubby.action.MessageInfo;
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 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 private static class ArrayFieldValidationInvoker implements
178 ValidationInvoker {
179
180
181
182
183
184 private final ArrayFieldValidator validator;
185
186
187
188
189
190
191
192 public ArrayFieldValidationInvoker(final ArrayFieldValidator validator) {
193 this.validator = validator;
194 }
195
196
197
198
199 public void invoke(final FieldValidationRule validationRule,
200 final Object[] values, final ActionErrors errors) {
201 final ValidationContext context = new ValidationContext();
202 final FieldInfo fieldInfo = new FieldInfo(validationRule
203 .getFieldName());
204 this.validator.validate(context, values);
205 for (final MessageInfo messageInfo : context.getMessageInfos()) {
206 final String message = messageInfo.toMessage(validationRule
207 .getFieldNameKey());
208 errors.add(message, fieldInfo);
209 }
210 }
211
212 }
213
214
215
216
217
218
219 private static class ScalarFieldValidationInvoker implements
220 ValidationInvoker {
221
222
223
224
225
226 private final ScalarFieldValidator validator;
227
228
229
230
231
232
233
234 public ScalarFieldValidationInvoker(final ScalarFieldValidator validator) {
235 this.validator = validator;
236 }
237
238
239
240
241 public void invoke(final FieldValidationRule validationRule,
242 final Object[] values, final ActionErrors errors) {
243 for (int i = 0; i < values.length; i++) {
244 final ValidationContext context = new ValidationContext();
245 final FieldInfo fieldInfo = new FieldInfo(validationRule
246 .getFieldName(), i);
247 this.validator.validate(context, values[i]);
248 for (final MessageInfo messageInfo : context.getMessageInfos()) {
249 final String message = messageInfo.toMessage(validationRule
250 .getFieldNameKey());
251 errors.add(message, fieldInfo);
252 }
253 }
254 }
255
256 }
257
258 }