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