/
CustomAcceptsVerifier.java
60 lines (48 loc) · 1.96 KB
/
CustomAcceptsVerifier.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package br.com.caelum.vraptor.interceptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.List;
import javax.enterprise.inject.Vetoed;
import net.vidageek.mirror.dsl.Mirror;
import net.vidageek.mirror.list.dsl.Matcher;
import br.com.caelum.vraptor.controller.ControllerInstance;
import br.com.caelum.vraptor.controller.ControllerMethod;
import br.com.caelum.vraptor.ioc.Container;
@Vetoed
public class CustomAcceptsVerifier {
private static class AcceptsConstraintMatcher implements Matcher<Annotation> {
@Override
public boolean accepts(Annotation element) {
return element.annotationType().isAnnotationPresent(AcceptsConstraint.class);
}
}
private ControllerInstance controllerInstance;
private Container container;
private Object interceptor;
private ControllerMethod controllerMethod;
public CustomAcceptsVerifier(ControllerMethod controllerMethod,ControllerInstance controllerInstance,
Container container, Object interceptor) {
this.controllerMethod = controllerMethod;
this.controllerInstance = controllerInstance;
this.container = container;
this.interceptor = interceptor;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public boolean isValid() {
List<Annotation> constraints = CustomAcceptsVerifier.getCustomAcceptsAnnotations(interceptor.getClass());
for (Annotation annotation : constraints) {
AcceptsConstraint constraint = annotation.annotationType().getAnnotation(AcceptsConstraint.class);
Class<? extends AcceptsValidator<?>> validatorClass = constraint.value();
AcceptsValidator validator = container.instanceFor(validatorClass);
validator.initialize(annotation);
if(!validator.validate(controllerMethod,controllerInstance)){
return false;
}
}
return true;
}
public static List<Annotation> getCustomAcceptsAnnotations(Class<?> klass){
return new Mirror().on((AnnotatedElement) klass).reflectAll()
.annotations().matching(new AcceptsConstraintMatcher());
}
}