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.