1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.trinidad.validator;
20
21 import javax.faces.application.FacesMessage;
22 import javax.faces.component.UIComponent;
23 import javax.faces.context.FacesContext;
24 import javax.faces.el.ValueBinding;
25
26 import javax.faces.validator.Validator;
27 import javax.faces.validator.ValidatorException;
28
29 import org.apache.myfaces.trinidad.bean.FacesBean;
30 import org.apache.myfaces.trinidad.bean.PropertyKey;
31 import org.apache.myfaces.trinidad.util.ComponentUtils;
32 import org.apache.myfaces.trinidad.util.IntegerUtils;
33 import org.apache.myfaces.trinidad.util.MessageFactory;
34
35
36
37
38
39 public class LongRangeValidator extends javax.faces.validator.LongRangeValidator
40 {
41
42 public static final String VALIDATOR_ID = "org.apache.myfaces.trinidad.LongRange";
43
44
45
46
47
48
49
50
51
52 public static final String MAXIMUM_MESSAGE_ID =
53 "org.apache.myfaces.trinidad.validator.LongRangeValidator.MAXIMUM";
54
55
56
57
58
59
60
61
62 public static final String MINIMUM_MESSAGE_ID =
63 "org.apache.myfaces.trinidad.validator.LongRangeValidator.MINIMUM";
64
65
66
67
68
69
70
71
72
73
74
75 public static final String NOT_IN_RANGE_MESSAGE_ID =
76 "org.apache.myfaces.trinidad.validator.LongRangeValidator.NOT_IN_RANGE";
77
78
79
80
81
82 public LongRangeValidator()
83 {
84 super();
85 }
86
87
88
89
90
91
92
93 public LongRangeValidator(long maximum)
94 {
95 super(maximum);
96 }
97
98
99
100
101
102
103
104
105
106 public LongRangeValidator(long maximum, long minimum)
107 {
108 super(maximum, minimum);
109 }
110
111
112
113
114
115
116 @Override
117 public long getMaximum()
118 {
119 Object maxLong = _facesBean.getProperty(_MAXIMUM_KEY);
120 if(maxLong == null)
121 maxLong = Long.MAX_VALUE;
122 return ComponentUtils.resolveLong(maxLong);
123 }
124
125
126
127
128
129
130
131 @Override
132 public void setMaximum(long maximum)
133 {
134 super.setMaximum(maximum);
135 _facesBean.setProperty(_MAXIMUM_KEY, Long.valueOf(maximum));
136 }
137
138
139
140
141
142
143
144 @Override
145 public long getMinimum()
146 {
147 Object minLong = _facesBean.getProperty(_MINIMUM_KEY);
148 if(minLong == null)
149 minLong = Long.MIN_VALUE;
150 return ComponentUtils.resolveLong(minLong);
151 }
152
153
154
155
156
157
158
159 @Override
160 public void setMinimum(long minimum)
161 {
162 super.setMinimum(minimum);
163 _facesBean.setProperty(_MINIMUM_KEY, Long.valueOf(minimum));
164 }
165
166
167
168
169
170
171
172 public void setMessageDetailMaximum(String maximumMessageDetail)
173 {
174 _facesBean.setProperty(_MAXIMUM_MESSAGE_DETAIL_KEY, maximumMessageDetail);
175 }
176
177
178
179
180
181
182
183 public String getMessageDetailMaximum()
184 {
185 Object maxMsgDet = _facesBean.getProperty(_MAXIMUM_MESSAGE_DETAIL_KEY);
186 return ComponentUtils.resolveString(maxMsgDet);
187 }
188
189
190
191
192
193
194
195
196 public void setMessageDetailMinimum(String minimumMessageDetail)
197 {
198 _facesBean.setProperty(_MINIMUM_MESSAGE_DETAIL_KEY, minimumMessageDetail);
199 }
200
201
202
203
204
205
206
207 public String getMessageDetailMinimum()
208 {
209 Object minMsgDet = _facesBean.getProperty(_MINIMUM_MESSAGE_DETAIL_KEY);
210 return ComponentUtils.resolveString(minMsgDet);
211 }
212
213
214
215
216
217
218
219
220 public void setMessageDetailNotInRange(String notInRangeMessageDetail)
221 {
222 _facesBean.setProperty(_NOT_IN_RANGE_MESSAGE_DETAIL_KEY, notInRangeMessageDetail);
223 }
224
225
226
227
228
229
230
231
232 public String getMessageDetailNotInRange()
233 {
234 Object notInRngMsg = _facesBean.getProperty(_NOT_IN_RANGE_MESSAGE_DETAIL_KEY);
235 return ComponentUtils.resolveString(notInRngMsg);
236 }
237
238
239
240
241
242
243 public void setHintMaximum(String hintMaximum)
244 {
245 _facesBean.setProperty(_HINT_MAXIMUM_KEY, hintMaximum);
246 }
247
248
249
250
251
252
253 public String getHintMaximum()
254 {
255 Object obj = _facesBean.getProperty(_HINT_MAXIMUM_KEY);
256 return ComponentUtils.resolveString(obj);
257 }
258
259
260
261
262
263
264 public void setHintMinimum(String hintMinimum)
265 {
266 _facesBean.setProperty(_HINT_MINIMUM_KEY, hintMinimum);
267 }
268
269
270
271
272
273
274 public String getHintMinimum()
275 {
276 Object obj = _facesBean.getProperty(_HINT_MINIMUM_KEY);
277 return ComponentUtils.resolveString(obj);
278 }
279
280
281
282
283
284
285 public void setHintNotInRange(String hintNotInRange)
286 {
287 _facesBean.setProperty(_HINT_NOT_IN_RANGE, hintNotInRange);
288 }
289
290
291
292
293
294
295 public String getHintNotInRange()
296 {
297 Object obj = _facesBean.getProperty(_HINT_NOT_IN_RANGE);
298 return ComponentUtils.resolveString(obj);
299 }
300
301 @Override
302 public void validate(
303 FacesContext context,
304 UIComponent component,
305 Object value
306 ) throws ValidatorException
307 {
308 try
309 {
310 super.validate(context, component, value);
311 }
312 catch (ValidatorException ve)
313 {
314
315 if (value != null && value instanceof Number)
316 {
317 long longValue = ((Number)value).longValue();
318
319 long min = getMinimum();
320 long max = getMaximum();
321
322 if (longValue > max)
323 {
324 if (min != Long.MIN_VALUE)
325 {
326 throw new ValidatorException
327 (_getNotInRangeMessage(context, component, value, IntegerUtils.getString(min), IntegerUtils.getString(max)));
328 }
329 else
330 {
331 throw new ValidatorException
332 (_getMaximumMessage(context, component, value, IntegerUtils.getString(max)));
333 }
334 }
335
336 if (longValue < min)
337 {
338 if (max != Long.MAX_VALUE)
339 {
340 throw new ValidatorException
341 (_getNotInRangeMessage(context, component, value, IntegerUtils.getString(min), IntegerUtils.getString(max)));
342 }
343 else
344 {
345 FacesMessage msg = _getMinimumMessage(context, component, value, IntegerUtils.getString(min));
346 throw new ValidatorException(msg);
347 }
348 }
349 }
350 else
351 {
352 throw ve;
353 }
354 }
355 }
356
357
358 @Override
359 public Object saveState(FacesContext context)
360 {
361 return _facesBean.saveState(context);
362 }
363
364
365 @Override
366 public void restoreState(FacesContext context, Object state)
367 {
368 _facesBean.restoreState(context, state);
369 }
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384 public void setValueBinding(String name, ValueBinding binding)
385 {
386 ValidatorUtils.setValueBinding(_facesBean, name, binding) ;
387 }
388
389
390
391
392
393
394
395
396
397
398
399
400
401 public ValueBinding getValueBinding(String name)
402 {
403 return ValidatorUtils.getValueBinding(_facesBean, name);
404 }
405
406 @Override
407 public boolean isTransient()
408 {
409 return (_transientValue);
410 }
411
412
413 @Override
414 public void setTransient(boolean transientValue)
415 {
416 _transientValue = transientValue;
417 }
418
419 private FacesMessage _getNotInRangeMessage(
420 FacesContext context,
421 UIComponent component,
422 Object value,
423 Object min,
424 Object max)
425 {
426 Object msg = _getRawNotInRangeMessageDetail();
427 Object label = ValidatorUtils.getComponentLabel(component);
428
429 Object[] params = {label, value, min, max};
430
431 return MessageFactory.getMessage(context, NOT_IN_RANGE_MESSAGE_ID,
432 msg, params, component);
433 }
434
435
436
437 private Object _getRawNotInRangeMessageDetail()
438 {
439 return _facesBean.getRawProperty(_NOT_IN_RANGE_MESSAGE_DETAIL_KEY);
440 }
441
442
443 private FacesMessage _getMaximumMessage(
444 FacesContext context,
445 UIComponent component,
446 Object value,
447 Object max)
448 {
449
450 Object msg = _getRawMaximumMessageDetail();
451 Object label = ValidatorUtils.getComponentLabel(component);
452
453 Object[] params = {label, value, max};
454
455 return MessageFactory.getMessage(context,
456 MAXIMUM_MESSAGE_ID,
457 msg,
458 params,
459 component);
460 }
461
462 private Object _getRawMaximumMessageDetail()
463 {
464 return _facesBean.getRawProperty(_MAXIMUM_MESSAGE_DETAIL_KEY);
465 }
466
467 private FacesMessage _getMinimumMessage(
468 FacesContext context,
469 UIComponent component,
470 Object value,
471 Object min)
472 {
473 Object msg = _getRawMinimumMessageDetail();
474 Object label = ValidatorUtils.getComponentLabel(component);
475
476 Object[] params = {label, value, min};
477
478 return MessageFactory.getMessage(context, MINIMUM_MESSAGE_ID,
479 msg, params, component);
480 }
481
482 private Object _getRawMinimumMessageDetail()
483 {
484 return _facesBean.getRawProperty(_MINIMUM_MESSAGE_DETAIL_KEY);
485 }
486
487 private static final FacesBean.Type _TYPE = new FacesBean.Type();
488
489 private static final PropertyKey _MINIMUM_KEY =
490 _TYPE.registerKey("minimum", Long.class);
491
492 private static final PropertyKey _MAXIMUM_KEY =
493 _TYPE.registerKey("maximum", Long.class);
494
495 private static final PropertyKey _MAXIMUM_MESSAGE_DETAIL_KEY =
496 _TYPE.registerKey("messageDetailMaximum", String.class);
497
498 private static final PropertyKey _MINIMUM_MESSAGE_DETAIL_KEY =
499 _TYPE.registerKey("messageDetailMinimum", String.class);
500
501 private static final PropertyKey _NOT_IN_RANGE_MESSAGE_DETAIL_KEY =
502 _TYPE.registerKey("messageDetailNotInRange", String.class);
503
504 private static final PropertyKey _HINT_MAXIMUM_KEY =
505 _TYPE.registerKey("hintMaximum", String.class);
506
507 private static final PropertyKey _HINT_MINIMUM_KEY =
508 _TYPE.registerKey("hintMinimum", String.class);
509
510 private static final PropertyKey _HINT_NOT_IN_RANGE =
511 _TYPE.registerKey("hintNotInRange", String.class);
512
513 private FacesBean _facesBean = ValidatorUtils.getFacesBean(_TYPE);
514
515 private boolean _transientValue = false;
516 }