Author: struberg
Date: Sat Jul 28 10:01:21 2012
New Revision: 1366635
URL: http://svn.apache.org/viewvc?rev=1366635&view=rev
Log:
OWB-672 improve synchronisation checks for DecoratorHandler creation
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=1366635&r1=1366634&r2=1366635&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
Sat Jul 28 10:01:21 2012
@@ -156,7 +156,7 @@ public abstract class InterceptorHandler
protected WebBeansContext webBeansContext;
- private volatile DelegateHandler delegateHandler = null;
+ private volatile DelegateHandler decoratorDelegateHandler = null;
/**
* Creates a new handler.
@@ -234,27 +234,7 @@ public abstract class InterceptorHandler
{
if (!injectionTarget.getDecoratorStack().isEmpty())
{
- synchronized (this)
- {
- if (delegateHandler == null)
- {
- Class<?> proxyClass =
webBeansContext.getJavassistProxyFactory().getInterceptorProxyClasses().get(bean);
- if (proxyClass == null)
- {
- ProxyFactory delegateFactory =
webBeansContext.getJavassistProxyFactory().createProxyFactory(bean);
- proxyClass =
webBeansContext.getJavassistProxyFactory().getProxyClass(delegateFactory);
-
webBeansContext.getJavassistProxyFactory().getInterceptorProxyClasses().put(bean,
proxyClass);
- }
- Object delegate = proxyClass.newInstance();
- delegateHandler = new DelegateHandler(bean);
-
((ProxyObject)delegate).setHandler(delegateHandler);
-
- // Gets component decorator stack
- List<Object> decorators =
WebBeansDecoratorConfig.getDecoratorStack(injectionTarget, instance, delegate,
ownerCreationalContext);
- //Sets decorator stack of delegate
- delegateHandler.setDecorators(decorators);
- }
- }
+ resolveDecoratorDelegateHandler(instance,
ownerCreationalContext, injectionTarget);
}
// Run around invoke chain
@@ -267,10 +247,10 @@ public abstract class InterceptorHandler
interceptedMethodMap = new
ConcurrentHashMap<Method, List<InterceptorData>>();
}
- if (delegateHandler != null)
+ if (decoratorDelegateHandler != null)
{
// We have interceptors and decorators, Our
delegateHandler will need to be wrapped in an interceptor
- WebBeansDecoratorInterceptor lastInterceptor = new
WebBeansDecoratorInterceptor(delegateHandler, instance);
+ WebBeansDecoratorInterceptor lastInterceptor = new
WebBeansDecoratorInterceptor(decoratorDelegateHandler, instance);
decoratorInterceptorDataImpl = new
InterceptorDataImpl(true, lastInterceptor, webBeansContext);
decoratorInterceptorDataImpl.setDefinedInInterceptorClass(true);
decoratorInterceptorDataImpl.setAroundInvoke(
@@ -316,9 +296,9 @@ public abstract class InterceptorHandler
// If there are Decorators, allow the delegate handler to
// manage the stack
- if (delegateHandler != null)
+ if (decoratorDelegateHandler != null)
{
- return delegateHandler.invoke(instance, method,
proceed, arguments);
+ return decoratorDelegateHandler.invoke(instance,
method, proceed, arguments);
}
}
@@ -354,6 +334,31 @@ public abstract class InterceptorHandler
return result;
}
+ private synchronized void resolveDecoratorDelegateHandler(Object instance,
CreationalContextImpl<?> ownerCreationalContext,
+
InjectionTargetBean<?> injectionTarget)
+ throws Exception
+ {
+ if (decoratorDelegateHandler == null)
+ {
+ Class<?> proxyClass =
webBeansContext.getJavassistProxyFactory().getInterceptorProxyClasses().get(bean);
+ if (proxyClass == null)
+ {
+ ProxyFactory delegateFactory =
webBeansContext.getJavassistProxyFactory().createProxyFactory(bean);
+ proxyClass =
webBeansContext.getJavassistProxyFactory().getProxyClass(delegateFactory);
+
webBeansContext.getJavassistProxyFactory().getInterceptorProxyClasses().put(bean,
proxyClass);
+ }
+ Object delegate = proxyClass.newInstance();
+ DelegateHandler newDelegateHandler = new DelegateHandler(bean);
+ ((ProxyObject)delegate).setHandler(newDelegateHandler);
+
+ // Gets component decorator stack
+ List<Object> decorators =
WebBeansDecoratorConfig.getDecoratorStack(injectionTarget, instance, delegate,
ownerCreationalContext);
+ //Sets decorator stack of delegate
+ newDelegateHandler.setDecorators(decorators);
+ decoratorDelegateHandler = newDelegateHandler;
+ }
+ }
+
/**
* Call around invoke method of the given bean on
* calling interceptedMethod.