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