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 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 private interface ValidationInvoker {
155
156
157
158
159
160
161
162
163
164
165
166 void invoke(FieldValidationRule validationRule, Object[] values,
167 ActionErrors errors);
168
169 }
170
171
172
173
174
175
176 private static class ArrayFieldValidationInvoker implements
177 ValidationInvoker {
178
179
180
181
182
183 private final ArrayFieldValidator validator;
184
185
186
187
188
189
190
191 public ArrayFieldValidationInvoker(final ArrayFieldValidator validator) {
192 this.validator = validator;
193 }
194
195
196
197
198 public void invoke(final FieldValidationRule validationRule,
199 final Object[] values, final ActionErrors errors) {
200 final ValidationContext context = new ValidationContext();
201 final FieldInfo fieldInfo = new FieldInfo(validationRule
202 .getFieldName());
203 this.validator.validate(context, values);
204 for (final MessageInfo messageInfo : context.getMessageInfos()) {
205 final String message = messageInfo.toMessage(validationRule
206 .getFieldNameKey());
207 errors.add(message, fieldInfo);
208 }
209 }
210
211 }
212
213
214
215
216
217
218 private static class ScalarFieldValidationInvoker implements
219 ValidationInvoker {
220
221
222
223
224
225 private final ScalarFieldValidator validator;
226
227
228
229
230
231
232
233 public ScalarFieldValidationInvoker(final ScalarFieldValidator validator) {
234 this.validator = validator;
235 }
236
237
238
239
240 public void invoke(final FieldValidationRule validationRule,
241 final Object[] values, final ActionErrors errors) {
242 for (int i = 0; i < values.length; i++) {
243 final ValidationContext context = new ValidationContext();
244 final FieldInfo fieldInfo = new FieldInfo(validationRule
245 .getFieldName(), i);
246 this.validator.validate(context, values[i]);
247 for (final MessageInfo messageInfo : context.getMessageInfos()) {
248 final String message = messageInfo.toMessage(validationRule
249 .getFieldNameKey());
250 errors.add(message, fieldInfo);
251 }
252 }
253 }
254
255 }
256
257 }