1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.core.aop;
18
19 import java.lang.reflect.Proxy;
20
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23 import org.springframework.aop.TargetSource;
24 import org.springframework.aop.framework.adapter.AdvisorAdapterRegistry;
25 import org.springframework.aop.framework.adapter.GlobalAdvisorAdapterRegistry;
26 import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
27 import org.springframework.aop.support.AopUtils;
28 import org.springframework.beans.factory.BeanFactory;
29 import org.springframework.beans.factory.InitializingBean;
30 import org.springframework.beans.factory.config.BeanDefinition;
31 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
32 import org.springframework.util.Assert;
33
34 import ch.elca.el4j.services.monitoring.notification.CoreNotificationHelper;
35 import ch.elca.el4j.util.codingsupport.AopHelper;
36
37
38
39
40
41
42
43
44
45
46
47 public class IntelligentAdvisorAutoProxyCreator extends DefaultAdvisorAutoProxyCreator implements InitializingBean {
48
49
50
51 private static final long serialVersionUID = 8582646215764283797L;
52
53
54
55
56 private static final Logger s_logger = LoggerFactory.getLogger(IntelligentAdvisorAutoProxyCreator.class);
57
58
59
60
61
62
63
64
65 private String[] m_interceptorNames = new String[0];
66
67
68
69
70
71
72 private AdvisorAdapterRegistry m_advisorAdapterRegistry
73 = GlobalAdvisorAdapterRegistry.getInstance();
74
75
76
77
78
79
80 private boolean m_applyCommonInterceptorsFirst = true;
81
82
83
84
85
86 private boolean forceUseOfAdvisorNamePrefix = true;
87
88
89
90
91
92
93
94 @SuppressWarnings("unchecked")
95 @Override
96 protected Object createProxy(Class beanClass, String beanName,
97 Object[] specificInterceptors, TargetSource targetSource) {
98
99 Object proxy = ProxyEnricher.enrichProxy(beanClass, beanName,
100 specificInterceptors, targetSource, getInterceptorNames(),
101 getBeanFactory(), getAdvisorAdapterRegistry(),
102 isApplyCommonInterceptorsFirst());
103
104
105 if (proxy == null) {
106 proxy = super.createProxy(beanClass, beanName,
107 specificInterceptors, targetSource);
108 }
109 return proxy;
110 }
111
112
113
114
115
116
117 @SuppressWarnings("unchecked")
118 @Override
119 protected Object[] getAdvicesAndAdvisorsForBean(Class beanClass, String beanName, TargetSource targetSource) {
120 Class deproxiedBeanClass = deproxyBeanClass(beanClass, beanName, getBeanFactory());
121 return super.getAdvicesAndAdvisorsForBean(deproxiedBeanClass, beanName, targetSource);
122 }
123
124
125
126
127
128
129
130
131
132 @SuppressWarnings("unchecked")
133 protected static Class deproxyBeanClass(Class beanClass, String beanName, BeanFactory beanFactory) {
134 Class deproxiedBeanClass = beanClass;
135 if (AopUtils.isCglibProxyClass(beanClass)) {
136 deproxiedBeanClass = AopHelper.getClassOfCglibProxyClass(beanClass);
137 } else if (Proxy.isProxyClass(beanClass) && (beanFactory instanceof DefaultListableBeanFactory)) {
138 DefaultListableBeanFactory factory = (DefaultListableBeanFactory) beanFactory;
139 BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);
140 if (!beanDefinition.isAbstract()) {
141 String beanClassName = beanDefinition.getBeanClassName();
142 try {
143
144 deproxiedBeanClass = beanClass.getClassLoader().loadClass(beanClassName);
145 } catch (ClassNotFoundException e) {
146 s_logger.debug("error deproxying beanClass:" + beanClass, e);
147 }
148 }
149 }
150 return deproxiedBeanClass;
151 }
152
153
154
155
156 protected String[] getInterceptorNames() {
157 return m_interceptorNames;
158 }
159
160
161
162
163
164
165
166
167 @Override
168 public void setInterceptorNames(String[] interceptorNames) {
169 m_interceptorNames = interceptorNames;
170 super.setInterceptorNames(interceptorNames);
171 }
172
173
174
175
176 protected AdvisorAdapterRegistry getAdvisorAdapterRegistry() {
177 return m_advisorAdapterRegistry;
178 }
179
180
181
182
183
184
185
186
187 @Override
188 public void setAdvisorAdapterRegistry(
189 AdvisorAdapterRegistry advisorAdapterRegistry) {
190 m_advisorAdapterRegistry = advisorAdapterRegistry;
191 super.setAdvisorAdapterRegistry(advisorAdapterRegistry);
192 }
193
194
195
196
197 protected boolean isApplyCommonInterceptorsFirst() {
198 return m_applyCommonInterceptorsFirst;
199 }
200
201
202
203
204
205
206
207
208
209
210 @Override
211 public void setApplyCommonInterceptorsFirst(
212 boolean applyCommonInterceptorsFirst) {
213 m_applyCommonInterceptorsFirst = applyCommonInterceptorsFirst;
214 super.setApplyCommonInterceptorsFirst(applyCommonInterceptorsFirst);
215 }
216
217
218
219
220 public boolean isForceUseOfAdvisorNamePrefix() {
221 return forceUseOfAdvisorNamePrefix;
222 }
223
224
225
226
227 public void setForceUseOfAdvisorNamePrefix(boolean forceUseOfAdvisorNamePrefix) {
228 this.forceUseOfAdvisorNamePrefix = forceUseOfAdvisorNamePrefix;
229 }
230
231
232
233
234 @Override
235 public void afterPropertiesSet() throws Exception {
236 Assert.isTrue(!isForceUseOfAdvisorNamePrefix() || isUsePrefix(),
237 "Property 'forceUseOfAdvisorNamePrefix' is set to true, so property 'usePrefix' must be true too. "
238 + "This was made to eliminate duplicated used advisors, so interceptors are not applied twice or "
239 + "even more on one bean.");
240 }
241 }