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.


Reply via email to