You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2012/07/28 12:01:22 UTC
svn commit: r1366635 -
/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
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.