[jboss-cvs] JBossAS SVN: r72136 - in projects/ejb3/trunk: core/src/main/java/org/jboss/ejb3/aop and 10 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Apr 13 11:47:37 EDT 2008


Author: wolfc
Date: 2008-04-13 11:47:36 -0400 (Sun, 13 Apr 2008)
New Revision: 72136

Added:
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java
Removed:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java
Modified:
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
   projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
   projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
   projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml
Log:
EJBTHREE-1261: calling lifecycle callbacks in correct order

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/BaseContext.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,9 +21,9 @@
  */ 
 package org.jboss.ejb3;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.ejb3.interceptor.InterceptorInfo;
@@ -44,8 +44,7 @@
    protected RealmMapping rm;
    protected SimpleMetaData metadata;
    
-   protected HashMap<Class<?>, Object> interceptorInstances;
-   private Object interceptors[];
+   protected Map<Class<?>, Object> interceptorInstances = new HashMap<Class<?>, Object>();
    
    /**
     * Use with extreme caution, must not break getInstance post condition.
@@ -98,12 +97,10 @@
       {
          EJBContainer c = (EJBContainer) container;
          List<Class<?>> interceptorClasses = c.getBeanContainer().getInterceptorClasses();
-         List<Object> interceptors = new ArrayList<Object>();
          for(Class<?> interceptorClass : interceptorClasses)
          {
-            interceptors.add(c.createInterceptor(interceptorClass));
+            interceptorInstances.put(interceptorClass, c.createInterceptor(interceptorClass));
          }
-         this.interceptors = interceptors.toArray(new Object[0]);
       }
       catch(IllegalAccessException e)
       {
@@ -132,8 +129,11 @@
       return container;
    }
    
-   public Object[] getInterceptors()
+   public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
    {
-      return interceptors;
+      Object interceptor = interceptorInstances.get(interceptorClass);
+      if(interceptor == null)
+         throw new IllegalArgumentException("No interceptor found for " + interceptorClass + " in " + this);
+      return interceptor;
    }
 }

Modified: projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java
===================================================================
--- projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/main/java/org/jboss/ejb3/aop/BeanContainer.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -27,20 +27,16 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.interceptor.Interceptors;
-
 import org.jboss.aop.Advisor;
 import org.jboss.aop.Domain;
 import org.jboss.aop.annotation.AnnotationRepository;
 import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.cluster.metadata.ClusteredMetaDataBridge;
 import org.jboss.ejb3.interceptors.InterceptorFactoryRef;
-import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
 import org.jboss.ejb3.interceptors.container.AbstractContainer;
 import org.jboss.ejb3.interceptors.container.ContainerInterceptorFactory;
 import org.jboss.ejb3.interceptors.container.InterceptorFactoryRefImpl;
 import org.jboss.ejb3.interceptors.direct.AbstractDirectContainer;
-import org.jboss.ejb3.interceptors.lang.ClassHelper;
 import org.jboss.ejb3.interceptors.metadata.AdditiveBeanInterceptorMetaDataBridge;
 import org.jboss.ejb3.interceptors.metadata.InterceptorComponentMetaDataLoaderFactory;
 import org.jboss.ejb3.interceptors.metadata.InterceptorMetaDataBridge;
@@ -68,45 +64,9 @@
       setBeanContextFactoryClass(BeanContainerBeanContextFactory.class);
    }
    
-   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Class<?> interceptors[])
-   {
-      if(interceptors != null)
-      {
-         for(Class<?> interceptorClass : interceptors)
-         {
-            if(!interceptorClasses.contains(interceptorClass))
-               interceptorClasses.add(interceptorClass);
-         }
-      }
-   }
-   
-   private static void addInterceptorClasses(List<Class<?>> interceptorClasses, Interceptors interceptorsAnnotation)
-   {
-      if(interceptorsAnnotation != null)
-      {
-         addInterceptorClasses(interceptorClasses, interceptorsAnnotation.value());
-      }
-   }
-   
    public List<Class<?>> getInterceptorClasses()
    {
-      // FIXME: move to ejb3-interceptors
-      List<Class<?>> interceptorClasses = new ArrayList<Class<?>>();
-      
-      DefaultInterceptors defaultInterceptorsAnnotation = getAnnotation(DefaultInterceptors.class);
-      if(defaultInterceptorsAnnotation != null)
-         addInterceptorClasses(interceptorClasses, defaultInterceptorsAnnotation.value());
-      
-      Interceptors interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(Interceptors.class);
-      addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
-      
-      for(Method beanMethod : ClassHelper.getAllMethods(getBeanClass()))
-      {
-         interceptorsAnnotation = (Interceptors) getAdvisor().resolveAnnotation(beanMethod, Interceptors.class);
-         addInterceptorClasses(interceptorClasses, interceptorsAnnotation);
-      }
-      
-      return interceptorClasses;
+      return getInterceptorRegistry().getInterceptorClasses();
    }
    
    @Override

Modified: projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java
===================================================================
--- projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/core/src/test/java/org/jboss/ejb3/test/threadlocal/MockBeanContext.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -92,6 +92,14 @@
    }
 
    /* (non-Javadoc)
+    * @see org.jboss.ejb3.interceptors.container.BeanContext#getInterceptor(java.lang.Class)
+    */
+   public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+   {
+      throw new IllegalArgumentException("NOP");
+   }
+   
+   /* (non-Javadoc)
     * @see org.jboss.ejb3.interceptors.container.BeanContext#getInterceptors()
     */
    public Object[] getInterceptors()

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorInterceptor.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -66,19 +66,8 @@
 
    public Object invoke(Invocation invocation) throws Throwable
    {
-      // TODO: speed up
-      Object interceptors[] = ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptors();
-      if(interceptors != null)
-      {
-         for(Object interceptor : interceptors)
-         {
-            if(interceptor.getClass().equals(interceptorClass))
-               return invoke(interceptor, invocation);
-         }
-      }
-      //throw new IllegalStateException("Can't find an interceptor instance for " + interceptorClass + " among " + Arrays.toString(instances));
-      // The business method interceptor method interceptor only exists when there is an aroundInvoke
-      return invocation.invokeNext();
+      Object interceptor = ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptor(interceptorClass);
+      return invoke(interceptor, invocation);
    }
 
    private Object invoke(Object interceptor, final Invocation invocation) throws Throwable

Deleted: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/EJB3InterceptorsInterceptor.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -1,51 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
-  *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.ejb3.interceptors.aop;
-
-import java.util.List;
-
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.ejb3.interceptors.container.ContainerMethodInvocation;
-
-/**
- * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
- * @version $Revision: $
- */
-public class EJB3InterceptorsInterceptor implements Interceptor
-{
-   public EJB3InterceptorsInterceptor(List<Class<?>> applicableInterceptorClasses)
-   {
-      // TODO Auto-generated constructor stub
-   }
-   
-   public String getName()
-   {
-      return EJB3InterceptorsInterceptor.class.getName();
-   }
-
-   public Object invoke(Invocation invocation) throws Throwable
-   {
-      ContainerMethodInvocation.getContainerMethodInvocation(invocation).getBeanContext().getInterceptors();
-      return null;
-   }
-}

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/LifecycleCallbacks.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -43,13 +43,11 @@
    public static Interceptor[] createLifecycleCallbackInterceptors(Advisor advisor, List<Class<?>> lifecycleInterceptorClasses, BeanContext<?> component, Class<? extends Annotation> lifecycleAnnotationType) throws Exception
    {
       List<Interceptor> interceptors = new ArrayList<Interceptor>();
-      Object ejb3Interceptors[] = component.getInterceptors();
-      for(Object interceptor : ejb3Interceptors)
+      // 12.7 footnote 57: ignore method level interceptors
+      // The lifecycle callbacks on the interceptors must be invoked in order
+      for(Class<?> interceptorClass : lifecycleInterceptorClasses)
       {
-         // 12.7 footnote 57: ignore method level interceptors
-         Class<?> interceptorClass = interceptor.getClass();
-         if(!lifecycleInterceptorClasses.contains(interceptorClass))
-            continue;
+         Object interceptor = component.getInterceptor(interceptorClass);
          ExtendedAdvisor interceptorAdvisor = ExtendedAdvisorHelper.getExtendedAdvisor(advisor, interceptor);
          for(Method interceptorMethod : ClassHelper.getAllMethods(interceptorClass))
          {
@@ -59,6 +57,8 @@
             }
          }
       }
+      
+      // Bean lifecycle callbacks
       Class<?> beanClass = advisor.getClazz();
       for(Method beanMethod : ClassHelper.getAllMethods(beanClass))
       {
@@ -67,6 +67,7 @@
             interceptors.add(new LifecycleCallbackBeanMethodInterceptor(beanMethod));
          }
       }
+      
       interceptors.add(0, PerVmAdvice.generateInterceptor(null, new InvocationContextInterceptor(), "setup"));
       
       return interceptors.toArray(new Interceptor[0]);

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/BeanContext.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -30,7 +30,17 @@
  */
 public interface BeanContext<T>
 {
+   /**
+    * @return the bean instance
+    */
    T getInstance();
    
-   Object[] getInterceptors();
+   /**
+    * Get the EJB3 interceptor of a certain type.
+    *  
+    * @param interceptorClass   the interceptor type to get
+    * @return   the interceptor
+    * @throws IllegalArgumentException  if no interceptor of that class is associated
+    */
+   Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException;
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/DummyBeanContext.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,6 +21,7 @@
  */
 package org.jboss.ejb3.interceptors.container;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 
 /**
@@ -30,7 +31,8 @@
 public class DummyBeanContext<T> implements BeanContext<T>
 {
    private T instance;
-   private Object interceptors[];
+   private Object[] interceptors;
+   private LinkedHashMap<Class<?>, Object> interceptorsMap = new LinkedHashMap<Class<?>, Object>();
    
    public DummyBeanContext(T instance, List<Object> interceptors)
    {
@@ -38,6 +40,8 @@
       assert interceptors != null : "interceptors is null";
       this.instance = instance;
       this.interceptors = interceptors.toArray(new Object[0]);
+      for(Object interceptor : interceptors)
+         this.interceptorsMap.put(interceptor.getClass(), interceptor);
    }
    
    public T getInstance()
@@ -45,9 +49,16 @@
       return instance;
    }
 
+   public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+   {
+      Object interceptor = interceptorsMap.get(interceptorClass);
+      if(interceptor == null)
+         throw new IllegalArgumentException("No interceptor found for " + interceptorClass + " in " + this);
+      return interceptor;
+   }
+
    public Object[] getInterceptors()
    {
       return interceptors;
    }
-
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/registry/InterceptorRegistry.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -94,6 +94,12 @@
    
    private void initialize()
    {
+      // The lifecycle interceptor classes are: 
+      // 1. the interceptors listed in an interceptor-order
+      // or
+      // 2. default interceptor + class interceptors
+      // where set 1 = set 2 + optionally extra interceptors
+      
       DefaultInterceptors defaultInterceptorsAnnotation = (DefaultInterceptors) advisor.resolveAnnotation(DefaultInterceptors.class);
       List<Class<?>> defaultInterceptorClasses = new ArrayList<Class<?>>();
       if(defaultInterceptorsAnnotation != null)
@@ -102,7 +108,8 @@
             defaultInterceptorClasses.add(defaultInterceptorClass);
       }
       log.debug("Found default interceptors " + defaultInterceptorClasses);
-      interceptorClasses.addAll(defaultInterceptorClasses);
+//      interceptorClasses.addAll(defaultInterceptorClasses);
+      List<Class<?>> lifecycleInterceptorClasses = new ArrayList<Class<?>>();
       lifecycleInterceptorClasses.addAll(defaultInterceptorClasses);
       
       Interceptors interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(Interceptors.class);
@@ -112,14 +119,32 @@
          for(Class<?> classInterceptorClass : interceptorsAnnotation.value())
          {
             classInterceptorClasses.add(classInterceptorClass);
-            if(!interceptorClasses.contains(classInterceptorClass))
-               interceptorClasses.add(classInterceptorClass);
+//            if(!interceptorClasses.contains(classInterceptorClass))
+//               interceptorClasses.add(classInterceptorClass);
             if(!lifecycleInterceptorClasses.contains(classInterceptorClass))
                lifecycleInterceptorClasses.add(classInterceptorClass);
          }
       }
       log.debug("Found class interceptors " + classInterceptorClasses);
       
+      {
+         // Ordering of lifecycle interceptors
+         InterceptorOrder order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
+         if(order != null)
+         {
+            List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
+            if(!orderedInterceptorClasses.containsAll(lifecycleInterceptorClasses))
+               throw new IllegalStateException("EJB3 12.8.2 footnote 59: all applicable lifecycle interceptors must be listed in the interceptor order");
+            lifecycleInterceptorClasses = orderedInterceptorClasses;
+         }
+      }
+      this.lifecycleInterceptorClasses.addAll(lifecycleInterceptorClasses);
+      for(Class<?> interceptorClass : lifecycleInterceptorClasses)
+      {
+         if(!interceptorClasses.contains(interceptorClass))
+            interceptorClasses.add(interceptorClass);
+      }
+      
       Class<?> beanClass = advisor.getClazz();
       for(Method beanMethod : ClassHelper.getAllMethods(beanClass))
       {
@@ -128,11 +153,7 @@
          if(interceptorsAnnotation != null)
          {
             for(Class<?> interceptorClass : interceptorsAnnotation.value())
-            {
                methodInterceptorClasses.add(interceptorClass);
-               if(!interceptorClasses.contains(interceptorClass))
-                  interceptorClasses.add(interceptorClass);
-            }
          }
          
          // Interceptors applicable for this bean method
@@ -152,9 +173,19 @@
             order = (InterceptorOrder) advisor.resolveAnnotation(InterceptorOrder.class);
          // TODO: validate the order to see if all interceptors are listed
          if(order != null)
-            applicableInterceptorClasses.put(beanMethod, Arrays.asList(order.value()));
-         else
-            applicableInterceptorClasses.put(beanMethod, methodApplicableInterceptorClasses);
+         {
+            List<Class<?>> orderedInterceptorClasses = Arrays.asList(order.value());
+            if(!orderedInterceptorClasses.containsAll(methodApplicableInterceptorClasses))
+               throw new IllegalStateException("EJB3 12.8.2 footnote 59: all applicable method interceptors must be listed in the interceptor order");
+            methodApplicableInterceptorClasses = orderedInterceptorClasses;
+         }
+         applicableInterceptorClasses.put(beanMethod, methodApplicableInterceptorClasses);
+         
+         for(Class<?> interceptorClass : methodApplicableInterceptorClasses)
+         {
+            if(!interceptorClasses.contains(interceptorClass))
+               interceptorClasses.add(interceptorClass);
+         }
       }
    }
    

Added: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/InterceptorOrderBean.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -0,0 +1,43 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.test.interceptors.metadata;
+
+import org.jboss.ejb3.interceptors.ManagedObject;
+import org.jboss.logging.Logger;
+
+/**
+ * This one has an interceptor bound to it via an interceptor order.
+ * 
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+ at ManagedObject
+public class InterceptorOrderBean
+{
+   private static final Logger log = Logger.getLogger(InterceptorOrderBean.class);
+   
+   public String sayHi(String name)
+   {
+      log.debug("sayHi");
+      return "Hi " + name;
+   }   
+}

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/metadata/unit/MetadataTestCase.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -39,6 +39,7 @@
 import org.jboss.ejb3.metadata.annotation.AnnotationRepositoryToMetaData;
 import org.jboss.ejb3.test.interceptors.common.CommonInterceptor;
 import org.jboss.ejb3.test.interceptors.direct.DirectMethodInterceptor;
+import org.jboss.ejb3.test.interceptors.metadata.InterceptorOrderBean;
 import org.jboss.ejb3.test.interceptors.metadata.MetadataBean;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.jboss.JBoss50MetaData;
@@ -114,6 +115,14 @@
       };
    }
 
+   @Override
+   protected void setUp() throws Exception
+   {
+      CommonInterceptor.aroundInvokes = 0;
+      CommonInterceptor.postConstructs = 0;
+      CommonInterceptor.preDestroys = 0;
+   }
+   
    public void test() throws Throwable
    {
       AspectManager.verbose = true;
@@ -170,4 +179,50 @@
       
       bean = null;
    }
+   
+   public void testInterceptorOrder() throws Throwable
+   {
+      // To make surefire happy
+      Thread.currentThread().setContextClassLoader(MetadataBean.class.getClassLoader());
+      
+      // Bootstrap AOP
+      // FIXME: use the right jboss-aop.xml
+      URL url = Thread.currentThread().getContextClassLoader().getResource("proxy/jboss-aop.xml");
+      log.info("deploying AOP from " + url);
+      AspectXmlLoader.deployXML(url);
+      
+      // Bootstrap metadata
+      UnmarshallerFactory unmarshallerFactory = UnmarshallerFactory.newInstance();
+      Unmarshaller unmarshaller = unmarshallerFactory.newUnmarshaller();
+      url = Thread.currentThread().getContextClassLoader().getResource("metadata/META-INF/ejb-jar.xml");
+      EjbJar30MetaData metaData = (EjbJar30MetaData) unmarshaller.unmarshal(url.toString(), schemaResolverForClass(EjbJar30MetaData.class));
+      JBoss50MetaData jbossMetaData = new JBoss50MetaData();
+      jbossMetaData.merge(null, metaData);
+      
+      JBossEnterpriseBeanMetaData beanMetaData = jbossMetaData.getEnterpriseBean("InterceptorOrderBean");
+      assertNotNull(beanMetaData);
+      
+      assertEquals(0, CommonInterceptor.postConstructs);
+      
+      MyContainer<InterceptorOrderBean> container = new MyContainer<InterceptorOrderBean>("InterceptorOrderBean", "Test", InterceptorOrderBean.class, beanMetaData);
+      container.testAdvisor();
+      
+      BeanContext<InterceptorOrderBean> bean = container.construct();
+      
+      assertEquals("CommonInterceptor postConstruct must have been called once", 1, CommonInterceptor.postConstructs);
+      
+      System.out.println(bean.getClass() + " " + bean.getClass().getClassLoader());
+      System.out.println("  " + Arrays.toString(bean.getClass().getInterfaces()));
+      String result = container.invoke(bean, "sayHi", "Test");
+      System.out.println(result);
+      
+      assertEquals("sayHi didn't invoke CommonInterceptor.aroundInvoke once", 1, CommonInterceptor.aroundInvokes);
+      
+      assertEquals("CommonInterceptor postConstruct must have been called once", 1, CommonInterceptor.postConstructs);
+      
+      container.destroy(bean);
+      assertEquals(1, CommonInterceptor.preDestroys);
+      
+      bean = null;
+   }
 }

Added: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/AbstractInterceptor.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -0,0 +1,53 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+  *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.test.interceptors.order;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+
+/**
+ * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
+ * @version $Revision: $
+ */
+public abstract class AbstractInterceptor
+{
+   @AroundInvoke
+   public Object aroundInvoke(InvocationContext ctx) throws Exception
+   {
+      List<String> list = (List<String>) ctx.getParameters()[0];
+      list.add(getInterceptorName());
+      return ctx.proceed();
+   }
+
+   protected abstract String getInterceptorName();
+   
+   @PostConstruct
+   public void postConstruct(InvocationContext ctx) throws Exception
+   {
+      InterceptorChainBean bean = (InterceptorChainBean) ctx.getTarget();
+      bean.addPostConstruct(getInterceptorName());
+      ctx.proceed();
+   }
+}

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorA.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,22 +21,16 @@
  */
 package org.jboss.ejb3.test.interceptors.order;
 
-import java.util.List;
 
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.InvocationContext;
-
 /**
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
-public class InterceptorA
+public class InterceptorA extends AbstractInterceptor
 {
-   @AroundInvoke
-   public Object aroundInvoke(InvocationContext ctx) throws Exception
+   @Override
+   protected String getInterceptorName()
    {
-      List<String> list = (List<String>) ctx.getParameters()[0];
-      list.add("A");
-      return ctx.proceed();
-   }
+      return "A";
+   }   
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorB.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,22 +21,16 @@
  */
 package org.jboss.ejb3.test.interceptors.order;
 
-import java.util.List;
 
-import javax.interceptor.AroundInvoke;
-import javax.interceptor.InvocationContext;
-
 /**
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
-public class InterceptorB
+public class InterceptorB extends AbstractInterceptor
 {
-   @AroundInvoke
-   public Object aroundInvoke(InvocationContext ctx) throws Exception
+   @Override
+   protected String getInterceptorName()
    {
-      List<String> list = (List<String>) ctx.getParameters()[0];
-      list.add("B");
-      return ctx.proceed();
-   }
+      return "B";
+   }   
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/InterceptorChainBean.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -21,13 +21,18 @@
  */
 package org.jboss.ejb3.test.interceptors.order;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.PostConstruct;
 import javax.interceptor.Interceptors;
 
 import org.jboss.ejb3.interceptors.ManagedObject;
 
 /**
+ * Keep track of the interceptor chain invoked.
+ * 
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision: $
  */
@@ -35,9 +40,29 @@
 @Interceptors({InterceptorA.class, InterceptorB.class})
 public class InterceptorChainBean
 {
-   //@Interceptors({InterceptorA.class, InterceptorB.class})
-   public void createInterceptorChain(List<String> chain)
+   private List<String> postConstructs = new ArrayList<String>();
+   
+   protected boolean addPostConstruct(String name)
    {
+      return postConstructs.add(name);
+   }
+   
+   /**
+    * Add the called instance to the chain and return
+    * the post constructs invoked.
+    * 
+    * @param chain
+    * @return a list of post constructed instances
+    */
+   public List<String> createInterceptorChain(List<String> chain)
+   {
       chain.add("BEAN");
+      return Collections.unmodifiableList(postConstructs);
    }
+   
+   @PostConstruct
+   public void postConstruct()
+   {
+      addPostConstruct("BEAN");
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/order/unit/InterceptorChainTestCase.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -143,10 +143,12 @@
       BeanContext<InterceptorChainBean> bean = container.construct();
       
       List<String> chain = new ArrayList<String>();
-      container.invoke(bean, "createInterceptorChain", chain);
+      List<String> postConstructs = container.invoke(bean, "createInterceptorChain", chain);
       
       assertEquals(Arrays.asList("B", "A", "BEAN"), chain);
       
+      assertEquals(Arrays.asList("B", "A", "BEAN"), postConstructs);
+      
       bean = null;
    }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimpleContext.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -37,6 +37,11 @@
       return instance;
    }
 
+   public Object getInterceptor(Class<?> interceptorClass) throws IllegalArgumentException
+   {
+      throw new IllegalArgumentException("No interceptors defined");
+   }
+   
    public Object[] getInterceptors()
    {
       return new Object[0];

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java	2008-04-13 15:47:36 UTC (rev 72136)
@@ -58,7 +58,8 @@
       ProxiedBean bean = createNewInstance ? new ProxiedBean() : pooledBean;
       pooledBean = bean;
       ctx.setInstance(bean);
-      mi.setTargetObject(bean);
+      //mi.setTargetObject(bean);
+      mi.setBeanContext(ctx);
       try
       {
          return invocation.invokeNext();
@@ -66,6 +67,7 @@
       finally
       {
          ctx.setInstance(null);
+         mi.setBeanContext(null);
       }
    }
 

Modified: projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml	2008-04-13 15:18:42 UTC (rev 72135)
+++ projects/ejb3/trunk/interceptors/src/test/resources/metadata/META-INF/ejb-jar.xml	2008-04-13 15:47:36 UTC (rev 72136)
@@ -15,6 +15,9 @@
     			<method-name>aroundInvoke</method-name>
     		</around-invoke>
     	</session>
+    	<session>
+    		<ejb-name>InterceptorOrderBean</ejb-name>
+    	</session>
     </enterprise-beans>
     <interceptors>
 		<interceptor>
@@ -43,5 +46,11 @@
     			<method-name>intercept</method-name>
     		</method>
     	</interceptor-binding>
+    	<interceptor-binding>
+    		<ejb-name>InterceptorOrderBean</ejb-name>
+    		<interceptor-order>
+                <interceptor-class>org.jboss.ejb3.test.interceptors.common.CommonInterceptor</interceptor-class>
+            </interceptor-order>
+    	</interceptor-binding>
     </assembly-descriptor>
 </ejb-jar>
\ No newline at end of file




More information about the jboss-cvs-commits mailing list