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