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 10:46:29 UTC

svn commit: r1433330 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/portable/ test/java/org/apache/webbeans/newtests/interceptors/business/tests/ test/java/org/apache/webbeans/newtests...

Author: struberg
Date: Tue Jan 15 09:46:28 2013
New Revision: 1433330

URL: http://svn.apache.org/viewvc?rev=1433330&view=rev
Log:
OWB-344 imporove interception tests and hooks

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.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=1433330&r1=1433329&r2=1433330&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 09:46:28 2013
@@ -20,6 +20,7 @@ package org.apache.webbeans.intercept;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.enterprise.inject.spi.Annotated;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
@@ -27,6 +28,7 @@ import javax.enterprise.inject.spi.BeanM
 import javax.enterprise.inject.spi.Decorator;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
+import javax.interceptor.ExcludeClassInterceptors;
 import javax.interceptor.Interceptors;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
@@ -93,13 +95,14 @@ public class InterceptorResolutionServic
         AnnotationManager annotationManager = webBeansContext.getAnnotationManager();
         BeanManager beanManager = webBeansContext.getBeanManagerImpl();
 
-        List<Interceptor> classLevelEjbInterceptors = new ArrayList<Interceptor>();
-
         // pick up CDI interceptors from a class level
         Set<Annotation> classInterceptorBindings = annotationManager.getInterceptorAnnotations(annotatedType.getAnnotations());
 
-        //X pick up EJB-style interceptors from a class level
-        Interceptors interceptorsAnnot = annotatedType.getAnnotation(Interceptors.class);
+        // pick up EJB-style interceptors from a class level
+        Set<Interceptor<?>> allUsedEjbInterceptors = new HashSet<Interceptor<?>>();
+        List<Interceptor<?>> classLevelEjbInterceptors = new ArrayList<Interceptor<?>>();
+
+        collectEjbInterceptors(classLevelEjbInterceptors, annotatedType);
 
         // pick up the decorators
         List<Decorator<?>> decorators = beanManager.resolveDecorators(bean.getTypes(), AnnotationUtil.asArray(bean.getQualifiers()));
@@ -109,7 +112,6 @@ public class InterceptorResolutionServic
         }
 
         Set<Interceptor<?>> allUsedCdiInterceptors = new HashSet<Interceptor<?>>();
-        Set<Interceptor<?>> allUsedEjbInterceptors = new HashSet<Interceptor<?>>();
         Map<Method, MethodInterceptorInfo> businessMethodInterceptorInfos = new HashMap<Method, MethodInterceptorInfo>();
 
 
@@ -119,7 +121,7 @@ public class InterceptorResolutionServic
             InterceptionType interceptionType = calculateInterceptionType(annotatedMethod);
             MethodInterceptorInfo methodInterceptorInfo = new MethodInterceptorInfo(interceptionType);
 
-            calculateEjbMethodInterceptors(methodInterceptorInfo, allUsedEjbInterceptors, interceptorsAnnot);
+            calculateEjbMethodInterceptors(methodInterceptorInfo, allUsedEjbInterceptors, classLevelEjbInterceptors, annotatedMethod);
 
             calculateCdiMethodInterceptors(methodInterceptorInfo, allUsedCdiInterceptors, annotatedMethod, classInterceptorBindings);
 
@@ -143,15 +145,43 @@ public class InterceptorResolutionServic
         return new BeanInterceptorInfo(decorators, allUsedCdiInterceptors, businessMethodInterceptorInfos);
     }
 
-    private void calculateEjbMethodInterceptors(MethodInterceptorInfo methodInterceptorInfo, Set<Interceptor<?>> allUsedEjbInterceptors, Interceptors interceptorsAnnot)
+    private <T> void collectEjbInterceptors(List<Interceptor<?>> ejbInterceptors, Annotated annotatedType)
     {
-        if (interceptorsAnnot == null)
+        Interceptors interceptorsAnnot = annotatedType.getAnnotation(Interceptors.class);
+        if (interceptorsAnnot != null)
         {
-            return;
+            for (Class interceptorClass : interceptorsAnnot.value())
+            {
+                Interceptor ejbInterceptor = webBeansContext.getInterceptorsManager().getEjbInterceptorForClass(interceptorClass);
+                ejbInterceptors.add(ejbInterceptor);
+            }
+        }
+    }
+
+    private void calculateEjbMethodInterceptors(MethodInterceptorInfo methodInterceptorInfo, Set<Interceptor<?>> allUsedEjbInterceptors,
+                                                List<Interceptor<?>> classLevelEjbInterceptors, AnnotatedMethod annotatedMethod)
+    {
+        List<Interceptor<?>> methodInterceptors = new ArrayList<Interceptor<?>>();
+
+        if (classLevelEjbInterceptors != null && classLevelEjbInterceptors.size() > 0)
+        {
+            // add the class level defined Interceptors first
+
+            ExcludeClassInterceptors excludeClassInterceptors = annotatedMethod.getAnnotation(ExcludeClassInterceptors.class);
+            if (excludeClassInterceptors == null)
+            {
+                // but only if there is no exclusion of all class-level interceptors
+                methodInterceptors.addAll(classLevelEjbInterceptors);
+            }
         }
 
-        Class<?>[] ejbInterceptorClasses = interceptorsAnnot.value();
+        collectEjbInterceptors(methodInterceptors, annotatedMethod);
+        allUsedEjbInterceptors.addAll(methodInterceptors);
 
+        if (methodInterceptors.size() > 0)
+        {
+            methodInterceptorInfo.setEjbInterceptors(methodInterceptors);
+        }
     }
 
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/LifecycleInterceptorInvocationContext.java Tue Jan 15 09:46:28 2013
@@ -74,14 +74,22 @@ public class LifecycleInterceptorInvocat
         }
         else
         {
-            for (AnnotatedMethod<?> lifecycleMethod : lifecycleMethods)
-            {   Method m = lifecycleMethod.getJavaMember();
-                if (!m.isAccessible())
-                {
-                    m.setAccessible(true);
+            if (lifecycleMethods != null)
+            {
+                // only if there is a lifecycle method, otherwise re immediately return
+                for (AnnotatedMethod<?> lifecycleMethod : lifecycleMethods)
+                {   Method m = lifecycleMethod.getJavaMember();
+                    if (!m.isAccessible())
+                    {
+                        m.setAccessible(true);
+                    }
+                    m.invoke(getTarget());
                 }
-                m.invoke(getTarget());
             }
+            // else, see interceptors spec
+            // "For lifecycle callback interceptor methods, if there is no callback method
+            // defined on the target class, the invocation of proceed in the last
+            // interceptor method in the chain is a no-op, and null is returned."
 
             return null;
         }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java Tue Jan 15 09:46:28 2013
@@ -53,6 +53,8 @@ import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.ExceptionUtil;
 
 
+import static org.apache.webbeans.intercept.InterceptorResolutionService.BeanInterceptorInfo;
+
 public class InjectionTargetImpl<T> extends AbstractProducer<T> implements InjectionTarget<T>
 {
 
@@ -76,6 +78,11 @@ public class InjectionTargetImpl<T> exte
      */
     private List<AnnotatedMethod<?>> preDestroyMethods;
 
+    /**
+     * static information about Interceptors and Decorators of that bean
+     */
+    private BeanInterceptorInfo interceptorInfo;
+
     public InjectionTargetImpl(AnnotatedType<T> annotatedType, Set<InjectionPoint> points, WebBeansContext webBeansContext,
                                List<AnnotatedMethod<?>> postConstructMethods, List<AnnotatedMethod<?>> preDestroyMethods)
     {
@@ -88,10 +95,23 @@ public class InjectionTargetImpl<T> exte
         this.preDestroyMethods = preDestroyMethods;
     }
 
+    public void setInterceptorInfo(BeanInterceptorInfo interceptorInfo)
+    {
+        this.interceptorInfo = interceptorInfo;
+    }
+
     @Override
     public T produce(CreationalContext<T> creationalContext)
     {
-        return new InjectableConstructor<T>(getConstructor().getJavaMember(), this, (CreationalContextImpl<T>) creationalContext).doInjection();
+        T instance = new InjectableConstructor<T>(getConstructor().getJavaMember(), this, (CreationalContextImpl<T>) creationalContext).doInjection();
+
+        if (interceptorInfo != null)
+        {
+            // apply interceptorInfo
+            interceptorInfo.getInterceptors();
+        }
+
+        return instance;
     }
 
     @Override
@@ -169,7 +189,7 @@ public class InjectionTargetImpl<T> exte
     @Override
     public void postConstruct(T instance)
     {
-        if (postConstructMethods == null)
+        if (postConstructMethods == null /*X TODO && postConstructInterceptors == null */)
         {
             return;
         }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java Tue Jan 15 09:46:28 2013
@@ -84,6 +84,8 @@ public class NewProxyTest extends Abstra
         RuntimeExceptionBindingTypeBean instance = factory.createProxyInstance(proxyClass, target, interceptorHandler);
         int result = instance.business();
         Assert.assertEquals(42, result);
+
+        Assert.assertEquals(1, interceptor.invoked);
         
         shutDownContainer();
         

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java?rev=1433330&r1=1433329&r2=1433330&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/common/RuntimeExceptionsInterceptor.java Tue Jan 15 09:46:28 2013
@@ -32,11 +32,14 @@ import javax.interceptor.InvocationConte
 @RuntimeExceptions
 public class RuntimeExceptionsInterceptor
 {
+    public int invoked = 0;
+
     @AroundInvoke
     public Object invoke(InvocationContext context)
     {
         try
         {
+            invoked++;
             return context.proceed();
         }
         catch (Exception e)