You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2012/11/08 21:50:50 UTC

svn commit: r1407261 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/decorator/ test/java/org/apache/webbeans/newtests/decorators/multiple/ test/java/org/apache/webbeans/newtests/decorators/tests/

Author: rmannibucau
Date: Thu Nov  8 20:50:50 2012
New Revision: 1407261

URL: http://svn.apache.org/viewvc?rev=1407261&view=rev
Log:
OWB-718 Decorator can't call two methods of the delegate object in the same method

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/MultipleCallDecorator.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleCallDecoratorTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java?rev=1407261&r1=1407260&r2=1407261&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java Thu Nov  8 20:50:50 2012
@@ -18,11 +18,21 @@
  */
 package org.apache.webbeans.decorator;
 
-import java.io.Serializable;
+import org.apache.webbeans.component.EnterpriseBeanMarker;
+import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.config.OWBLogConst;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.exception.WebBeansException;
+import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.proxy.MethodHandler;
+import org.apache.webbeans.util.WebBeansUtil;
+
+import javax.interceptor.InvocationContext;
 import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.Serializable;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -31,25 +41,13 @@ import java.util.concurrent.atomic.Atomi
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.interceptor.InvocationContext;
-
-import org.apache.webbeans.component.EnterpriseBeanMarker;
-import org.apache.webbeans.component.OwbBean;
-import org.apache.webbeans.config.OWBLogConst;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.exception.WebBeansException;
-import org.apache.webbeans.logger.WebBeansLoggerFacade;
-import org.apache.webbeans.util.WebBeansUtil;
-
-import org.apache.webbeans.proxy.MethodHandler;
-
 public class DelegateHandler implements InvocationHandler, MethodHandler, Serializable, Externalizable
 {
     private static final Logger logger = WebBeansLoggerFacade.getLogger(DelegateHandler.class);
     private static final long serialVersionUID = -3063755008944970684L;
 
     private transient List<Object> decorators;
-    private transient ThreadLocal<AtomicInteger> position = new ThreadLocal<AtomicInteger>()
+    public static transient ThreadLocal<AtomicInteger> position = new ThreadLocal<AtomicInteger>()
     {
         @Override
         protected AtomicInteger initialValue()
@@ -94,11 +92,14 @@ public class DelegateHandler implements 
             actualInstance = instance;
         }
 
-        while (position.get().intValue() < decorators.size())
+        int hit = 0;
+        int decoratorsSize = decorators.size();
+        while (position.get().intValue() < decoratorsSize)
         {
+            hit++;
 
+            int currentPosition = position.get().intValue();
             Object decorator = decorators.get(position.get().getAndIncrement());
-
             try
             {
                 Method decMethod = decorator.getClass().getMethod(method.getName(), method.getParameterTypes());
@@ -111,9 +112,17 @@ public class DelegateHandler implements 
                         bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(decMethod, true);
                     }
 
-                    Object returnValue = decMethod.invoke(decorator, arguments);
-                    position.remove();
-                    return returnValue;
+                    try
+                    {
+                        return decMethod.invoke(decorator, arguments);
+                    }
+                    finally
+                    {
+                        if (currentPosition == 0) // if we go back on the first decorator no more need of this thread local
+                        {
+                            position.remove();
+                        }
+                    }
                 }
 
             }
@@ -159,7 +168,10 @@ public class DelegateHandler implements 
 
         }
 
-        position.remove();
+        if (hit == decoratorsSize) // if we hit all decorators but noone was called (see while loop) then clean here
+        {
+            position.remove();
+        }
 
         if (!method.isAccessible())
         {
@@ -193,7 +205,7 @@ public class DelegateHandler implements 
                 }
             }
         }
-        
+
         return result;
 
     }
@@ -258,5 +270,5 @@ public class DelegateHandler implements 
         }
         bean = (OwbBean<?>) WebBeansContext.currentInstance().getBeanManagerImpl().getPassivationCapableBean(id);
         decorators = (List<Object>) in.readObject();
-    }    
+    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/MultipleCallDecorator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/MultipleCallDecorator.java?rev=1407261&r1=1407260&r2=1407261&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/MultipleCallDecorator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/MultipleCallDecorator.java Thu Nov  8 20:50:50 2012
@@ -23,18 +23,18 @@ import javax.decorator.Delegate;
 import javax.inject.Inject;
 
 @Decorator
-public class MultipleCallDecorator implements IOutputProvider
-{
+public class MultipleCallDecorator implements IOutputProvider {
 
-    @Inject @Delegate IOutputProvider op;
+    @Inject
+    @Delegate
+    IOutputProvider op;
 
     public String getOutput() {
         return null;
     }
 
     public String trace() {
-        op.trace();
-        return op.trace();
+        return op.trace() + op.toString() + op.hashCode() + op.trace();
     }
 
     public String otherMethod() {

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleCallDecoratorTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleCallDecoratorTest.java?rev=1407261&r1=1407260&r2=1407261&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleCallDecoratorTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleCallDecoratorTest.java Thu Nov  8 20:50:50 2012
@@ -23,7 +23,6 @@ import org.apache.webbeans.newtests.deco
 import org.apache.webbeans.newtests.decorators.multiple.MultipleCallDecorator;
 import org.apache.webbeans.newtests.decorators.multiple.OutputProvider;
 import org.apache.webbeans.newtests.decorators.multiple.RequestStringBuilder;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import javax.enterprise.inject.Default;
@@ -32,32 +31,35 @@ import javax.enterprise.util.AnnotationL
 import java.util.ArrayList;
 import java.util.Collection;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class MultipleCallDecoratorTest extends AbstractUnitTest
 {
     public static final String PACKAGE_NAME = MultipleDecoratorStackTests.class.getPackage().getName();
 
     @Test
-    @Ignore("Decorator can't call twice the delegate")
+    // this test is just a standard decorator calling a bunch of method
+    // it tests we don't have recusive issues in DelegateHandler
     public void testDecoratorStackWithAbstractAtEnd()
     {
-        Collection<Class<?>> classes = new ArrayList<Class<?>>();
+        final Collection<Class<?>> classes = new ArrayList<Class<?>>();
         classes.add(MultipleCallDecorator.class);
         classes.add(IOutputProvider.class);
         classes.add(OutputProvider.class);
         classes.add(RequestStringBuilder.class);
 
-        Collection<String> xmls = new ArrayList<String>();
+        final Collection<String> xmls = new ArrayList<String>();
         xmls.add(getXmlPath(PACKAGE_NAME, "MultipleCallDecoratorTest"));
 
         startContainer(classes, xmls);
 
-        Bean<?> bean = getBeanManager().getBeans(OutputProvider.class, new AnnotationLiteral<Default>()
+        final Bean<?> bean = getBeanManager().getBeans(OutputProvider.class, new AnnotationLiteral<Default>()
         {
         }).iterator().next();
 
-        IOutputProvider instance = (IOutputProvider) getBeanManager().getReference(bean, IOutputProvider.class, getBeanManager().createCreationalContext(bean));
-        assertEquals("delegate/trace", instance.trace()); // StackOverFlow
+        final IOutputProvider instance = (IOutputProvider) getBeanManager().getReference(bean, IOutputProvider.class, getBeanManager().createCreationalContext(bean));
+        final String expected = "delegate/traceorg.apache.webbeans.newtests.decorators.multiple.OutputProvider@.*delegate/trace";
+        final String actual = instance.trace();
+        assertTrue("'" + actual + "' doesn't match with '" + expected + "'", actual.matches(expected));
     }
 }
\ No newline at end of file