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.node2bean;
35
36 import java.beans.Introspector;
37 import java.util.Map;
38
39 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
40 import org.springframework.util.ClassUtils;
41
42 import info.magnolia.jcr.node2bean.Node2BeanException;
43 import info.magnolia.jcr.node2bean.TransformationState;
44 import info.magnolia.jcr.node2bean.TypeDescriptor;
45 import info.magnolia.jcr.node2bean.TypeMapping;
46 import info.magnolia.jcr.node2bean.impl.Node2BeanTransformerImpl;
47 import info.magnolia.objectfactory.ComponentProvider;
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public class SpringNode2BeanTransformer extends Node2BeanTransformerImpl {
63
64 private TypeDescriptor defaultType;
65 private Class<?> defaultClass;
66
67 private String topLevelBeanName;
68 private AutowireCapableBeanFactory autowireCapableBeanFactory;
69
70 public SpringNode2BeanTransformer(AutowireCapableBeanFactory autowireCapableBeanFactory) {
71 this.autowireCapableBeanFactory = autowireCapableBeanFactory;
72 }
73
74 public void setDefaultClass(Class<?> defaultClass) {
75 this.defaultClass = defaultClass;
76 }
77
78 public void setTopLevelBeanName(String topLevelBeanName) {
79 this.topLevelBeanName = topLevelBeanName;
80 }
81
82 @Override
83 protected TypeDescriptor onResolveType(TypeMapping typeMapping, TransformationState state, TypeDescriptor resolvedType, ComponentProvider componentProvider) {
84 if (resolvedType == null && defaultType == null && defaultClass != null) {
85 defaultType = typeMapping.getTypeDescriptor(defaultClass);
86 }
87 return resolvedType == null ? defaultType : resolvedType;
88 }
89
90 @Override
91 public Object newBeanInstance(TransformationState state, Map<String, Object> values, ComponentProvider componentProvider) throws Node2BeanException {
92
93
94 Object bean = super.newBeanInstance(state, values, componentProvider);
95
96
97 this.autowireCapableBeanFactory.autowireBean(bean);
98
99
100 return bean;
101 }
102
103 @Override
104 public void initBean(TransformationState state, Map properties) throws Node2BeanException {
105
106 Object bean = state.getCurrentBean();
107
108
109 String beanName = resolveBeanName(state, bean);
110
111
112 bean = this.autowireCapableBeanFactory.initializeBean(state.getCurrentBean(), beanName);
113
114 state.setCurrentBean(bean);
115 }
116
117 protected String resolveBeanName(TransformationState state, Object bean) {
118
119
120 if (state.getLevel() == 1 && topLevelBeanName != null) {
121 return topLevelBeanName;
122 }
123
124
125 String shortClassName = ClassUtils.getShortName(bean.getClass());
126 return Introspector.decapitalize(shortClassName);
127 }
128 }