Author: rmannibucau
Date: Wed Jan 16 16:35:07 2013
New Revision: 1434024

URL: http://svn.apache.org/viewvc?rev=1434024&view=rev
Log:
OWB-760 abstract decorator - avoid to reset position

Added:
    
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/AbstractDecorator.java
      - copied, changed from r1433985, 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/Decorator2.java
    
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleAbstractDecoratorStack.xml
      - copied, changed from r1433985, 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStack.xml
Modified:
    
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
    
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStackTests.java

Modified: 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java?rev=1434024&r1=1434023&r2=1434024&view=diff
==============================================================================
--- 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
 (original)
+++ 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DelegateHandler.java
 Wed Jan 16 16:35:07 2013
@@ -57,9 +57,9 @@ public class DelegateHandler implements 
     };
 
     private transient Object actualInstance = null;
-    
+
     private transient OwbBean<?> bean = null;
-    
+
     private transient InvocationContext ejbContext;
 
     //Do not remove this constructor, used by passivation.
@@ -72,13 +72,13 @@ public class DelegateHandler implements 
     {
         this.bean = bean;
     }
-    
+
     public DelegateHandler(OwbBean<?> bean, InvocationContext ejbContext)
     {
         this.bean = bean;
         this.ejbContext = ejbContext;
-    }    
-    
+    }
+
     public Object invoke(Object instance, Method method, Method proceed, 
Object[] arguments) throws Exception
     {
         return invoke(instance, method, arguments);
@@ -94,6 +94,7 @@ public class DelegateHandler implements 
 
         int hit = 0;
         int decoratorsSize = decorators.size();
+        Exception ex = null;
         while (position.get().intValue() < decoratorsSize)
         {
             hit++;
@@ -111,18 +112,7 @@ public class DelegateHandler implements 
                     {
                         
bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(decMethod,
 true);
                     }
-
-                    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();
-                        }
-                    }
+                    return decMethod.invoke(decorator, arguments);
                 }
 
             }
@@ -134,6 +124,7 @@ public class DelegateHandler implements 
             }
             catch (NoSuchMethodException e)
             {
+                ex = e;
                 continue;
             }
             catch (InvocationTargetException e)
@@ -142,6 +133,7 @@ public class DelegateHandler implements 
                 //If the wrapped exception tells us the method didn't exist, 
continue
                 if(cause instanceof NoSuchMethodException)
                 {
+                    ex = e;
                     continue;
                 }
 
@@ -165,6 +157,13 @@ public class DelegateHandler implements 
                 logger.log(Level.SEVERE, OWBLogConst.ERROR_0014, 
WebBeansLoggerFacade.args(method.getName(), decorator.getClass().getName()));
                 throw new WebBeansException(e);
             }
+            finally
+            {
+                if (ex == null && currentPosition == 0) // if we go back on 
the first decorator no more need of this thread local
+                {
+                    position.remove();
+                }
+            }
 
         }
 
@@ -179,7 +178,7 @@ public class DelegateHandler implements 
         }
 
         Object result = null;
-        
+
         if(!(bean instanceof EnterpriseBeanMarker))
         {
             result = method.invoke(actualInstance, arguments);
@@ -189,16 +188,16 @@ public class DelegateHandler implements 
             if(ejbContext != null)
             {
                 Method ejbMethod = ejbContext.getMethod();
-                
+
                 // don't use method.equals(), it may only differ by being 
abstract in the EJB proxy.
-                 
-                if (method.getName().equals(ejbMethod.getName()) && 
-                        
method.getReturnType().equals(ejbMethod.getReturnType())) 
+
+                if (method.getName().equals(ejbMethod.getName()) &&
+                        
method.getReturnType().equals(ejbMethod.getReturnType()))
                 {
                     result = ejbContext.proceed();
                 }
 
-                else 
+                else
                 {
                     Object ejbInstance = ejbContext.getTarget();
                     result = method.invoke(ejbInstance, arguments);
@@ -212,7 +211,7 @@ public class DelegateHandler implements 
 
     /**
      * Helper method to locate method in any of the interfaces of the 
Decorator.
-     * 
+     *
      * @param class1 whose interfaces we want to check
      * @param m to check for in Interfaces
      * @return True if the method exists in any of the interfaces of the
@@ -244,15 +243,15 @@ public class DelegateHandler implements 
         decorators = dec;
     }
 
-    public void writeExternal(ObjectOutput out) throws IOException 
+    public void writeExternal(ObjectOutput out) throws IOException
     {
         String id = WebBeansUtil.isPassivationCapable(bean);
-        if (id != null) 
+        if (id != null)
         {
             out.writeObject(id);
             out.writeObject(decorators);
         }
-        else 
+        else
         {
             out.writeObject("");
         }
@@ -261,10 +260,10 @@ public class DelegateHandler implements 
     }
 
     public void readExternal(ObjectInput in) throws IOException,
-            ClassNotFoundException 
+            ClassNotFoundException
     {
         String id = (String)in.readObject();
-        if (id.equals("")) 
+        if (id.equals(""))
         {
             return;
         }

Copied: 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/AbstractDecorator.java
 (from r1433985, 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/Decorator2.java)
URL: 
http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/AbstractDecorator.java?p2=openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/AbstractDecorator.java&p1=openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/Decorator2.java&r1=1433985&r2=1434024&rev=1434024&view=diff
==============================================================================
--- 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/Decorator2.java
 (original)
+++ 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/multiple/AbstractDecorator.java
 Wed Jan 16 16:35:07 2013
@@ -26,31 +26,14 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 @Decorator
-public class Decorator2 implements IOutputProvider
+public abstract class AbstractDecorator implements IOutputProvider
 {
     @Inject @Delegate @Default @Any @Named IOutputProvider op;
     @Inject @Default RequestStringBuilder rsb;
 
     public String getOutput()
     {
-        rsb.addOutput("Decorator2\n");
+        rsb.addOutput("AbstractDecorator\n");
         return op.getOutput();
     }
-   
-    // change biz method 
-    public String trace() 
-    {
-        return "Decorator2/trace," + op.otherMethod();
-    }
-
-    public String otherMethod()
-    {
-        return "Decorator2/otherMethod," + op.otherMethod();
-    }
-
-    @Override
-    public String getDelayedOutput() throws InterruptedException
-    {
-        return op.getDelayedOutput();
-    }
 }

Modified: 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStackTests.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStackTests.java?rev=1434024&r1=1434023&r2=1434024&view=diff
==============================================================================
--- 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStackTests.java
 (original)
+++ 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStackTests.java
 Wed Jan 16 16:35:07 2013
@@ -28,6 +28,7 @@ import javax.enterprise.util.AnnotationL
 import junit.framework.Assert;
 
 import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.apache.webbeans.newtests.decorators.multiple.AbstractDecorator;
 import org.apache.webbeans.newtests.decorators.multiple.Decorator1;
 import org.apache.webbeans.newtests.decorators.multiple.Decorator2;
 import org.apache.webbeans.newtests.decorators.multiple.IOutputProvider;
@@ -75,4 +76,39 @@ public class MultipleDecoratorStackTests
         
         
     }
+
+    @Test
+    public void testAbstractDecoratorStack()
+    {
+        Collection<Class<?>> classes = new ArrayList<Class<?>>();
+        classes.add(Decorator1.class);
+        classes.add(AbstractDecorator.class);
+        classes.add(IOutputProvider.class);
+        classes.add(OutputProvider.class);
+        classes.add(RequestStringBuilder.class);
+
+        Collection<String> xmls = new ArrayList<String>();
+        xmls.add(getXmlPath(PACKAGE_NAME, "MultipleAbstractDecoratorStack"));
+
+        startContainer(classes, xmls);
+
+        Bean<?> bean = getBeanManager().getBeans(OutputProvider.class, new 
AnnotationLiteral<Default>()
+        {
+        }).iterator().next();
+        Object instance = getBeanManager().getReference(bean, 
OutputProvider.class, getBeanManager().createCreationalContext(bean));
+
+        OutputProvider outputProvider = (OutputProvider) instance;
+
+        Assert.assertTrue(outputProvider != null);
+
+        String result = outputProvider.getOutput();
+        System.out.println(result);
+        // Verify that the Decorators were called in order, and in a stack.
+        
Assert.assertTrue(result.equalsIgnoreCase("Decorator1\nAbstractDecorator\nOutputProvider\n"));
+
+        String hijackedStack = outputProvider.trace();
+        Assert.assertEquals("Decorator1/trace,delegate/trace", hijackedStack);
+
+
+    }
 }

Copied: 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleAbstractDecoratorStack.xml
 (from r1433985, 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStack.xml)
URL: 
http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleAbstractDecoratorStack.xml?p2=openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleAbstractDecoratorStack.xml&p1=openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStack.xml&r1=1433985&r2=1434024&rev=1434024&view=diff
==============================================================================
--- 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleDecoratorStack.xml
 (original)
+++ 
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/decorators/tests/MultipleAbstractDecoratorStack.xml
 Wed Jan 16 16:35:07 2013
@@ -20,6 +20,6 @@ under the License.
 <beans>
    <decorators>
       
<class>org.apache.webbeans.newtests.decorators.multiple.Decorator1</class>
-      
<class>org.apache.webbeans.newtests.decorators.multiple.Decorator2</class>
+      
<class>org.apache.webbeans.newtests.decorators.multiple.AbstractDecorator</class>
    </decorators>
 </beans>
\ No newline at end of file


Reply via email to