1 package org.xmlfield.validation.handlers;
2
3 import java.lang.annotation.Annotation;
4 import java.lang.reflect.InvocationTargetException;
5 import java.lang.reflect.Method;
6 import java.util.HashSet;
7 import java.util.Set;
8
9 import org.apache.commons.lang.ArrayUtils;
10 import org.apache.commons.lang.StringUtils;
11 import org.xmlfield.validation.annotations.Values;
12
13 public class ValuesHandler implements IHandler {
14
15 @Override
16 public boolean handles(Annotation a) {
17 return a instanceof Values;
18 }
19
20 @Override
21 public Set<ConstraintViolation<Object>> validate(Annotation a, Method m, Object xmlFieldObject, Class<?> group)
22 throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
23
24 Values av = (Values) a;
25 if ((group == null && av.groups().length == 0) || ArrayUtils.contains(av.groups(), group)) {
26
27 Object o = m.invoke(xmlFieldObject, new Object[] {});
28
29 if (o == null)
30 return null;
31
32 boolean ok = false;
33 if (av.string().length > 0) {
34 Object[] acceptedValues = av.string();
35 for (Object ao : acceptedValues) {
36 if (ao.equals(o)) {
37 ok = true;
38 break;
39 }
40 }
41 if (!ok)
42 return createResultFromViolation(new ConstraintViolation<Object>(m.getName(), StringUtils.join(
43 acceptedValues, ","), o == null ? "null" : o.toString()));
44
45 }
46
47 else if (av.integer().length > 0) {
48 int[] acceptedValues = av.integer();
49
50 for (int ao : acceptedValues) {
51 if (o != null && o.equals(ao)) {
52 ok = true;
53 break;
54 }
55 }
56
57 if (!ok)
58 return createResultFromViolation(new ConstraintViolation<Object>(m.getName(),
59 ArrayUtils.toString(acceptedValues), o == null ? "null" : o.toString()));
60
61 }
62 }
63
64 return null;
65 }
66
67 private <T> Set<ConstraintViolation<T>> createResultFromViolation(ConstraintViolation<T> c) {
68
69 Set<ConstraintViolation<T>> result = new HashSet<ConstraintViolation<T>>();
70
71 result.add(c);
72 return result;
73
74 }
75
76 }