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());