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 package info.magnolia.module.blossom.urimapping;
35
36 import java.lang.reflect.Method;
37 import java.lang.reflect.Modifier;
38
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41 import org.springframework.util.ClassUtils;
42 import org.springframework.util.ReflectionUtils;
43
44 import info.magnolia.cms.beans.config.VirtualURIMapping;
45 import info.magnolia.module.blossom.annotation.VirtualURIMapper;
46 import info.magnolia.module.blossom.support.AbstractBeanDetector;
47
48
49
50
51
52
53
54 public class AnnotatedVirtualURIMappingExporter extends AbstractBeanDetector {
55
56 private final Logger logger = LoggerFactory.getLogger(getClass());
57
58 @Override
59 protected boolean include(Class<?> beanType, String beanName) {
60 if (beanType.isAnnotationPresent(VirtualURIMapper.class)) {
61 if (ClassUtils.isAssignable(VirtualURIMapping.class, beanType)) {
62 if (logger.isWarnEnabled()) {
63 logger.warn("Bean [" + beanName + "] annotated with VirtualUriMapper should not also implement VirtualURIMapping, will not have methods exposed");
64 }
65 return false;
66 }
67 return true;
68 }
69 return false;
70 }
71
72 @Override
73 protected void onBeanDetection(final Object bean, final String beanName) {
74
75 if (logger.isDebugEnabled()) {
76 logger.debug("Detected VirtualURIMapper on bean [" + beanName + "] scanning methods to expose");
77 }
78
79 final Class<?> beanType = bean.getClass();
80 ReflectionUtils.doWithMethods(beanType, new ReflectionUtils.MethodCallback() {
81
82 @Override
83 public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
84 if (isEligibleMethod(method) && method.equals(ClassUtils.getMostSpecificMethod(method, beanType))) {
85
86 if (logger.isDebugEnabled()) {
87 logger.debug("Exposing VirtualURIMapping for method [" + method + "] on bean [" + beanName + "]");
88 }
89
90 BlossomVirtualURIMapping.addMapping(createMethodAdapter(method, bean));
91 }
92 }
93 });
94 }
95
96 protected boolean isEligibleMethod(Method method) {
97 return method.getParameterTypes().length > 0 &&
98 (method.getReturnType().equals(String.class) || method.getReturnType().equals(VirtualURIMapping.MappingResult.class)) &&
99 Modifier.isPublic(method.getModifiers()) &&
100 !Modifier.isStatic(method.getModifiers());
101 }
102
103 protected VirtualURIMappingAdapter createMethodAdapter(Method method, Object bean) {
104 return new VirtualURIMappingAdapter(bean, method);
105 }
106 }