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