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 2013/01/15 12:03:01 UTC
svn commit: r1433351 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/proxy/
test/java/org/apache/webbeans/newtests/interceptors/factory/
test/java/org/apache/webbeans/newtests/intercept...
Author: struberg
Date: Tue Jan 15 11:03:01 2013
New Revision: 1433351
URL: http://svn.apache.org/viewvc?rev=1433351&view=rev
Log:
OWB-344 add explicit proxy chain test
Added:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java?rev=1433351&r1=1433350&r2=1433351&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java Tue Jan 15 11:03:01 2013
@@ -35,6 +35,7 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -114,6 +115,7 @@ public class InterceptorResolutionServic
Set<Interceptor<?>> allUsedCdiInterceptors = new HashSet<Interceptor<?>>();
Map<Method, MethodInterceptorInfo> businessMethodInterceptorInfos = new HashMap<Method, MethodInterceptorInfo>();
+ List<AnnotatedMethod> nonInterceptedMethods = new ArrayList<AnnotatedMethod>();
// iterate over all methods and build up the interceptor/decorator stack
for (AnnotatedMethod annotatedMethod : interceptableAnnotatedMethods)
@@ -129,20 +131,14 @@ public class InterceptorResolutionServic
if (methodInterceptorInfo.isEmpty())
{
+ nonInterceptedMethods.add(annotatedMethod);
continue;
}
- if (InterceptionType.AROUND_INVOKE.equals(interceptionType))
- {
- businessMethodInterceptorInfos.put(annotatedMethod.getJavaMember(), methodInterceptorInfo);
- }
- else
- {
- //X TODO pick up non-business interceptors
- }
+ businessMethodInterceptorInfos.put(annotatedMethod.getJavaMember(), methodInterceptorInfo);
}
- return new BeanInterceptorInfo(decorators, allUsedCdiInterceptors, businessMethodInterceptorInfos);
+ return new BeanInterceptorInfo(decorators, allUsedCdiInterceptors, businessMethodInterceptorInfos, nonInterceptedMethods);
}
private <T> void collectEjbInterceptors(List<Interceptor<?>> ejbInterceptors, Annotated annotatedType)
@@ -358,12 +354,15 @@ public class InterceptorResolutionServic
*/
public static class BeanInterceptorInfo
{
- public BeanInterceptorInfo(List<Decorator<?>> decorators, Set<Interceptor<?>> interceptors,
- Map<Method, MethodInterceptorInfo> businessMethodsInfo)
+ public BeanInterceptorInfo(List<Decorator<?>> decorators,
+ Set<Interceptor<?>> interceptors,
+ Map<Method, MethodInterceptorInfo> businessMethodsInfo,
+ List<AnnotatedMethod> nonInterceptedMethods)
{
this.decorators = decorators;
this.interceptors = interceptors;
this.businessMethodsInfo = businessMethodsInfo;
+ this.nonInterceptedMethods = nonInterceptedMethods;
}
/**
@@ -384,6 +383,10 @@ public class InterceptorResolutionServic
*/
private Map<Method, MethodInterceptorInfo> businessMethodsInfo = new HashMap<Method, MethodInterceptorInfo>();
+ /**
+ * all non-intercepted methods
+ */
+ private List<AnnotatedMethod> nonInterceptedMethods = Collections.EMPTY_LIST;
public List<Decorator<?>> getDecorators()
{
@@ -399,6 +402,11 @@ public class InterceptorResolutionServic
{
return businessMethodsInfo;
}
+
+ public List<AnnotatedMethod> getNonInterceptedMethods()
+ {
+ return nonInterceptedMethods;
+ }
}
/**
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java?rev=1433351&r1=1433350&r2=1433351&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java Tue Jan 15 11:03:01 2013
@@ -59,7 +59,7 @@ public class InterceptorDecoratorProxyFa
//X a generated proxy cannot easily get redefined later!
- public <T> T createProxyInstance(Class<T> proxyClass, T instance, InterceptorHandler interceptorDecoratorStack)
+ public <T> T createProxyInstance(Class<? extends T> proxyClass, T instance, InterceptorHandler interceptorDecoratorStack)
throws ProxyGenerationException
{
try
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java?rev=1433351&r1=1433350&r2=1433351&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java Tue Jan 15 11:03:01 2013
@@ -64,7 +64,7 @@ public class InterceptorDecoratorProxyFa
ClassInterceptedClass internalInstance = new ClassInterceptedClass();
internalInstance.init();
- TestInvocationHandler testInvocationHandler = new TestInvocationHandler(internalInstance);
+ TestInterceptorHandler testInvocationHandler = new TestInterceptorHandler(internalInstance);
ClassInterceptedClass proxy = pf.createProxyInstance(proxyClass, internalInstance, testInvocationHandler);
Assert.assertNotNull(proxy);
@@ -89,13 +89,13 @@ public class InterceptorDecoratorProxyFa
Assert.assertEquals(5, testInvocationHandler.invokedMethodNames.size());
}
- public static class TestInvocationHandler implements InterceptorHandler
+ public static class TestInterceptorHandler implements InterceptorHandler
{
public List<String> invokedMethodNames = new ArrayList<String>();
private Object instance;
- public TestInvocationHandler(Object instance)
+ public TestInterceptorHandler(Object instance)
{
this.instance = instance;
}
Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java?rev=1433351&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java Tue Jan 15 11:03:01 2013
@@ -0,0 +1,134 @@
+package org.apache.webbeans.newtests.interceptors.resolution;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InterceptionType;
+import javax.enterprise.inject.spi.Interceptor;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.webbeans.intercept.DefaultInterceptorHandler;
+import org.apache.webbeans.intercept.InterceptorResolutionService;
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.apache.webbeans.newtests.interceptors.factory.beans.ClassMultiInterceptedClass;
+import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory;
+import org.apache.webbeans.proxy.InterceptorHandler;
+import org.apache.webbeans.test.component.intercept.webbeans.ActionInterceptor;
+import org.apache.webbeans.test.component.intercept.webbeans.SecureInterceptor;
+import org.apache.webbeans.test.component.intercept.webbeans.TransactionalInterceptor;
+import org.apache.webbeans.test.component.intercept.webbeans.bindings.Action;
+import org.apache.webbeans.test.component.intercept.webbeans.bindings.Secure;
+import org.apache.webbeans.test.component.intercept.webbeans.bindings.Transactional;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test the interceptor Resolution and creating a proxy from it.
+ */
+public class InterceptorProxyChainTest extends AbstractUnitTest
+{
+
+ @Test
+ public void testInterceptorProxyChain() throws Exception
+ {
+ Collection<String> beanXmls = new ArrayList<String>();
+ beanXmls.add(getXmlPath(this.getClass().getPackage().getName(), InterceptorResolutionServiceTest.class.getSimpleName()));
+
+ Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+ beanClasses.add(ClassMultiInterceptedClass.class);
+ beanClasses.add(Transactional.class);
+ beanClasses.add(Secure.class);
+ beanClasses.add(Action.class);
+ beanClasses.add(ActionInterceptor.class);
+ beanClasses.add(SecureInterceptor.class);
+ beanClasses.add(TransactionalInterceptor.class);
+
+ startContainer(beanClasses, beanXmls);
+
+ InterceptorResolutionService ir = new InterceptorResolutionService(getWebBeansContext());
+ AnnotatedType<ClassMultiInterceptedClass> annotatedType = getBeanManager().createAnnotatedType(ClassMultiInterceptedClass.class);
+ Bean<ClassMultiInterceptedClass> bean = (Bean<ClassMultiInterceptedClass>) getBeanManager().resolve(getBeanManager().getBeans(ClassMultiInterceptedClass.class));
+
+ InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ Assert.assertNotNull(interceptorInfo);
+
+
+ // not via BeanManager but native. We will proxy it ourselfs
+ ClassMultiInterceptedClass internalInstance = new ClassMultiInterceptedClass();
+ CreationalContext<ClassMultiInterceptedClass> cc = getBeanManager().createCreationalContext(bean);
+
+ Map<Interceptor<?>,Object> interceptorInstances = new HashMap<Interceptor<?>, Object>();
+ for (Interceptor interceptorBean : interceptorInfo.getInterceptors())
+ {
+ Object interceptorInstance = interceptorBean.create(cc);
+ interceptorInstances.put(interceptorBean, interceptorInstance);
+ }
+
+ Map<Method, List<Interceptor<?>>> methodInterceptors = new HashMap<Method, List<Interceptor<?>>>();
+ List<Method> nonBusinessMethods = new ArrayList<Method>();
+ for (Map.Entry<Method, InterceptorResolutionService.MethodInterceptorInfo> miEntry : interceptorInfo.getBusinessMethodsInfo().entrySet())
+ {
+ Method interceptedMethod = miEntry.getKey();
+ InterceptorResolutionService.MethodInterceptorInfo mii = miEntry.getValue();
+ if (InterceptionType.AROUND_INVOKE.equals(mii.getInterceptionType()))
+ {
+ List<Interceptor<?>> activeInterceptors = new ArrayList<Interceptor<?>>();
+ if (mii.getEjbInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getEjbInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (mii.getCdiInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getCdiInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (activeInterceptors.size() > 0)
+ {
+ methodInterceptors.put(interceptedMethod, activeInterceptors);
+ }
+ }
+ else
+ {
+ nonBusinessMethods.add(interceptedMethod);
+ }
+ }
+
+ InterceptorHandler interceptorHandler
+ = new DefaultInterceptorHandler<ClassMultiInterceptedClass>(internalInstance, methodInterceptors, interceptorInstances);
+
+ InterceptorDecoratorProxyFactory pf = new InterceptorDecoratorProxyFactory();
+
+ // we take a fresh URLClassLoader to not blur the test classpath with synthetic classes.
+ ClassLoader classLoader = new URLClassLoader(new URL[0]);
+
+ Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
+ Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
+
+ Class<? extends ClassMultiInterceptedClass> proxyClass = pf.createProxyClass(classLoader, ClassMultiInterceptedClass.class, businessMethods, nonInterceptedMethods);
+ Assert.assertNotNull(proxyClass);
+
+ ClassMultiInterceptedClass proxyInstance = pf.createProxyInstance(proxyClass, internalInstance, interceptorHandler);
+ Assert.assertNotNull(proxyInstance);
+
+ Assert.assertEquals(internalInstance, proxyInstance.getSelf());
+
+ proxyInstance.setMeaningOfLife(42);
+ Assert.assertEquals(42, proxyInstance.getMeaningOfLife());
+
+ shutDownContainer();
+ }
+
+
+}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java?rev=1433351&r1=1433350&r2=1433351&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java Tue Jan 15 11:03:01 2013
@@ -44,10 +44,12 @@ import org.apache.webbeans.test.componen
import org.apache.webbeans.test.component.intercept.webbeans.bindings.Secure;
import org.apache.webbeans.test.component.intercept.webbeans.bindings.Transactional;
-
import org.junit.Assert;
import org.junit.Test;
+import static org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
+
+
/**
* Test interceptor resolution.
*/
@@ -71,7 +73,7 @@ public class InterceptorResolutionServic
AnnotatedType<ClassInterceptedClass> annotatedType = getBeanManager().createAnnotatedType(ClassInterceptedClass.class);
Bean<ClassInterceptedClass> bean = (Bean<ClassInterceptedClass>) getBeanManager().resolve(getBeanManager().getBeans(ClassInterceptedClass.class));
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getInterceptors());
@@ -112,7 +114,7 @@ public class InterceptorResolutionServic
AnnotatedType<ClassMultiInterceptedClass> annotatedType = getBeanManager().createAnnotatedType(ClassMultiInterceptedClass.class);
Bean<ClassMultiInterceptedClass> bean = (Bean<ClassMultiInterceptedClass>) getBeanManager().resolve(getBeanManager().getBeans(ClassMultiInterceptedClass.class));
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getInterceptors());
@@ -151,7 +153,7 @@ public class InterceptorResolutionServic
AnnotatedType<MethodInterceptedClass> annotatedType = getBeanManager().createAnnotatedType(MethodInterceptedClass.class);
Bean<MethodInterceptedClass> bean = (Bean<MethodInterceptedClass>) getBeanManager().resolve(getBeanManager().getBeans(MethodInterceptedClass.class));
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getInterceptors());
@@ -175,6 +177,8 @@ public class InterceptorResolutionServic
}
}
+ Assert.assertEquals(1, interceptorInfo.getNonInterceptedMethods().size());
+
shutDownContainer();
}
@@ -196,7 +200,7 @@ public class InterceptorResolutionServic
Bean<DecoratedClass> bean = (Bean<DecoratedClass>) getBeanManager().resolve(
getBeanManager().getBeans(DecoratedClass.class, new AnnotationLiteral<Binding1>() {}));
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getBusinessMethodsInfo());
@@ -224,7 +228,7 @@ public class InterceptorResolutionServic
AnnotatedType<InterceptedComponent> annotatedType = getBeanManager().createAnnotatedType(InterceptedComponent.class);
Bean<InterceptedComponent> bean = (Bean<InterceptedComponent>) getBeanManager().resolve(getBeanManager().getBeans(InterceptedComponent.class));
- InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
+ BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean, annotatedType);
Assert.assertNotNull(interceptorInfo);
Assert.assertNotNull(interceptorInfo.getBusinessMethodsInfo());
Assert.assertEquals(1, interceptorInfo.getBusinessMethodsInfo().size());