1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds.rest;
20
21 import static com.google.common.base.Preconditions.checkNotNull;
22
23 import java.lang.annotation.Annotation;
24 import java.lang.reflect.Method;
25 import java.util.Arrays;
26 import java.util.List;
27
28 import javax.inject.Inject;
29
30 import org.jclouds.predicates.Validator;
31 import org.jclouds.rest.annotations.ParamValidators;
32
33 import com.google.common.collect.Iterables;
34 import com.google.common.collect.Lists;
35 import com.google.inject.Injector;
36
37
38
39
40
41
42
43
44
45
46 public class InputParamValidator {
47
48 private final Injector injector;
49
50 @Inject
51 public InputParamValidator(Injector injector) {
52 this.injector = injector;
53 }
54
55 public InputParamValidator() {
56 injector = null;
57 }
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 public void validateMethodParametersOrThrow(Method method, Object... args) {
73
74 try {
75 performMethodValidation(method, args);
76 performParameterValidation(method.getParameterAnnotations(), args);
77 } catch(IllegalArgumentException e) {
78 String argsString = Iterables.toString(Arrays.asList(args));
79 throw new IllegalArgumentException(String.format("Validation on '%s#%s' didn't pass for arguments: " +
80 "%s. %n Reason: %s.", method.getDeclaringClass().getName(), method.getName(), argsString,
81 e.getMessage()));
82 }
83 }
84
85
86
87
88
89
90
91
92
93 private void performMethodValidation(Method method, Object... args) {
94 ParamValidators paramValidatorsAnnotation = checkNotNull(method).getAnnotation(
95 ParamValidators.class);
96 if (paramValidatorsAnnotation == null)
97 return;
98
99 List<Validator<?>> methodValidators = getValidatorsFromAnnotation(paramValidatorsAnnotation);
100
101 runPredicatesAgainstArgs(methodValidators, args);
102 }
103
104
105
106
107
108
109
110
111
112
113 private void performParameterValidation(Annotation[][] annotations, Object... args) {
114 for (int currentParameterIndex = 0; currentParameterIndex < annotations.length; currentParameterIndex++) {
115 ParamValidators annotation = findParamValidatorsAnnotationOrReturnNull(annotations[currentParameterIndex]);
116 if (annotation == null)
117 continue;
118 List<Validator<?>> parameterValidators = getValidatorsFromAnnotation(annotation);
119 runPredicatesAgainstArgs(parameterValidators,
120 args[currentParameterIndex]);
121 }
122 }
123
124 private List<Validator<?>> getValidatorsFromAnnotation(ParamValidators paramValidatorsAnnotation) {
125 List<Validator<?>> validators = Lists.newArrayList();
126 for (Class<? extends Validator<?>> validator : paramValidatorsAnnotation.value()) {
127 validators.add(checkNotNull(injector.getInstance(validator)));
128 }
129 return validators;
130 }
131
132 @SuppressWarnings("unchecked")
133 private void runPredicatesAgainstArgs(List<Validator<?>> predicates, Object... args) {
134 for (@SuppressWarnings("rawtypes") Validator validator : predicates) {
135 Iterables.all(Arrays.asList(args), validator);
136 }
137 }
138
139 private ParamValidators findParamValidatorsAnnotationOrReturnNull(
140 Annotation[] parameterAnnotations) {
141 for (Annotation annotation : parameterAnnotations) {
142 if (annotation instanceof ParamValidators)
143 return (ParamValidators) annotation;
144 }
145 return null;
146 }
147
148 }