[jboss-cvs] JBossAS SVN: r69231 - in projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors: metadata and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jan 23 04:07:42 EST 2008


Author: wolfc
Date: 2008-01-23 04:07:42 -0500 (Wed, 23 Jan 2008)
New Revision: 69231

Modified:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java
Log:
Added PostActivate and PrePassivate

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java	2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/InterceptorsFactory.java	2008-01-23 09:07:42 UTC (rev 69231)
@@ -21,6 +21,7 @@
  */
 package org.jboss.ejb3.interceptors.aop;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -30,6 +31,8 @@
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
 import javax.interceptor.AroundInvoke;
 import javax.interceptor.Interceptors;
 
@@ -45,8 +48,13 @@
 import org.jboss.logging.Logger;
 
 /**
- * Comment
+ * The interceptors factory analyzes the annotations and creates
+ * interceptor instances out of those. These are then attached
+ * to the advisor as meta data.
  * 
+ * Do not access this meta data directly, use the provided static
+ * methods herein.
+ * 
  * @author <a href="mailto:carlo.dewolf at jboss.com">Carlo de Wolf</a>
  * @version $Revision$
  */
@@ -54,7 +62,15 @@
 {
    private static final Logger log = Logger.getLogger(InterceptorsFactory.class);
    
-   private List<? extends Interceptor> createInterceptors(Advisor advisor, InterceptorFactory interceptorFactory, Class<?>[] interceptorClasses, List<BusinessMethodInterceptorMethodInterceptor> interceptors, Map<Class<?>, Object> existingInterceptors, List<LifecycleCallbackInterceptorMethodInterceptor> postConstructs, List<LifecycleCallbackInterceptorMethodInterceptor> preDestroys) throws InstantiationException, IllegalAccessException
+   // TODO: allow for extensions (/ new life-cycle annotations) (and PostActive, PrePassivate are part of stateful) 
+   /**
+    * This defined the life-cycle annotations for which we build up
+    * an interceptor chain.
+    */
+   @SuppressWarnings("unchecked")
+   private static final Class<? extends Annotation> lifeCycleAnnotationClasses[] = (Class<? extends Annotation>[]) new Class<?>[] { PostActivate.class, PostConstruct.class, PreDestroy.class, PrePassivate.class };
+   
+   private List<? extends Interceptor> createInterceptors(Advisor advisor, InterceptorFactory interceptorFactory, Class<?>[] interceptorClasses, List<BusinessMethodInterceptorMethodInterceptor> interceptors, Map<Class<?>, Object> existingInterceptors, Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> lifeCycleInterceptors) throws InstantiationException, IllegalAccessException
    {
       if(interceptorClasses != null)
       {
@@ -75,18 +91,17 @@
             // TODO: should be only non-overriden methods (EJB 3 12.4.1 last bullet)
             for(Method method : ClassHelper.getAllMethods(interceptorClass))
             {
-               if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, PostConstruct.class))
+               if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, AroundInvoke.class))
                {
-                  postConstructs.add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+                  interceptors.add(new BusinessMethodInterceptorMethodInterceptor(interceptor, method));
                }
-               if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, PreDestroy.class))
+               for(Class<? extends Annotation> lifeCycleAnnotationClass : lifeCycleAnnotationClasses)
                {
-                  preDestroys.add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+                  if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, lifeCycleAnnotationClass))
+                  {
+                     lifeCycleInterceptors.get(lifeCycleAnnotationClass).add(new LifecycleCallbackInterceptorMethodInterceptor(interceptor, method));
+                  }
                }
-               if(interceptorAdvisor.isAnnotationPresent(interceptorClass, method, AroundInvoke.class))
-               {
-                  interceptors.add(new BusinessMethodInterceptorMethodInterceptor(interceptor, method));
-               }
             }
             //instanceAdvisor.appendInterceptorStack(stackName);
             //instanceAdvisor.appendInterceptor(new InvokeSpecInterceptorInterceptor());
@@ -108,17 +123,22 @@
          InterceptorFactoryRef interceptorFactoryRef = (InterceptorFactoryRef) advisor.resolveAnnotation(InterceptorFactoryRef.class);
          if(interceptorFactoryRef == null)
             throw new IllegalStateException("No InterceptorFactory specified on " + advisor.getName());
-         log.info("interceptor factory class = " + interceptorFactoryRef.value());
+         log.debug("interceptor factory class = " + interceptorFactoryRef.value());
          InterceptorFactory interceptorFactory = interceptorFactoryRef.value().newInstance();
          
          Map<Class<?>, Object> interceptors = new HashMap<Class<?>, Object>();
-         List<LifecycleCallbackInterceptorMethodInterceptor> postConstructs = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
-         List<LifecycleCallbackInterceptorMethodInterceptor> preDestroys = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
          
+         Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> lifeCycleInterceptors = new HashMap<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>>();
+         for(Class<? extends Annotation> lifeCycleAnnotationClass : lifeCycleAnnotationClasses)
+         {
+            List<LifecycleCallbackInterceptorMethodInterceptor> list = new ArrayList<LifecycleCallbackInterceptorMethodInterceptor>();
+            lifeCycleInterceptors.put(lifeCycleAnnotationClass, list);
+         }
+         
          DefaultInterceptors defaultInterceptorsAnnotation = (DefaultInterceptors) advisor.resolveAnnotation(DefaultInterceptors.class);
          List<BusinessMethodInterceptorMethodInterceptor> defaultInterceptors = new ArrayList<BusinessMethodInterceptorMethodInterceptor>();
          if(defaultInterceptorsAnnotation != null)
-            createInterceptors(advisor, interceptorFactory, defaultInterceptorsAnnotation.value(), defaultInterceptors, interceptors, postConstructs, preDestroys);
+            createInterceptors(advisor, interceptorFactory, defaultInterceptorsAnnotation.value(), defaultInterceptors, interceptors, lifeCycleInterceptors);
          
          log.debug("Found class interceptors " + defaultInterceptors);
          // Default Interceptors
@@ -127,7 +147,7 @@
          Interceptors interceptorsAnnotation = (Interceptors) advisor.resolveAnnotation(Interceptors.class);
          List<BusinessMethodInterceptorMethodInterceptor> classInterceptors = new ArrayList<BusinessMethodInterceptorMethodInterceptor>();
          if(interceptorsAnnotation != null)
-            createInterceptors(advisor, interceptorFactory, interceptorsAnnotation.value(), classInterceptors, interceptors, postConstructs, preDestroys);
+            createInterceptors(advisor, interceptorFactory, interceptorsAnnotation.value(), classInterceptors, interceptors, lifeCycleInterceptors);
          
          log.debug("Found class interceptors " + classInterceptors);
          // Class Interceptors
@@ -178,11 +198,11 @@
          log.debug("Found bean interceptors " + beanInterceptors);
          instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "beanInterceptors", beanInterceptors);
          
-         instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "preDestroys", Collections.unmodifiableList(preDestroys));
+         instanceAdvisor.getMetaData().addMetaData(InterceptorsFactory.class, "lifeCycleInterceptors", Collections.unmodifiableMap(lifeCycleInterceptors));
          
          // Put the postConstructs interceptors here in the chain
          // TODO: why? We may need more control
-         return new InterceptorSequencer(postConstructs.toArray(new Interceptor[0]));
+         return new InterceptorSequencer(lifeCycleInterceptors.get(PostConstruct.class).toArray(new Interceptor[0]));
          //return null;
       }
       catch(InstantiationException e)
@@ -241,11 +261,27 @@
    }
    
    @SuppressWarnings("unchecked")
-   public static List<Interceptor> getPreDestroys(InstanceAdvisor instanceAdvisor)
+   private static Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>> getLifeCycleInterceptors(InstanceAdvisor instanceAdvisor)
    {
-      return (List<Interceptor>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "preDestroys");
+      return (Map<Class<? extends Annotation>, List<LifecycleCallbackInterceptorMethodInterceptor>>) instanceAdvisor.getMetaData().getMetaData(InterceptorsFactory.class, "lifeCycleInterceptors");
    }
    
+   public static List<? extends Interceptor> getLifeCycleInterceptors(InstanceAdvisor instanceAdvisor, Class<? extends Annotation> lifeCycleAnnotationClass)
+   {
+      return getLifeCycleInterceptors(instanceAdvisor).get(lifeCycleAnnotationClass);
+   }
+   
+   /**
+    * @deprecated use getLifeCycleInterceptors
+    * @param instanceAdvisor
+    * @return
+    */
+   @Deprecated
+   public static List<? extends Interceptor> getPreDestroys(InstanceAdvisor instanceAdvisor)
+   {
+      return getLifeCycleInterceptors(instanceAdvisor, PreDestroy.class);
+   }
+   
    private String toString(Object obj)
    {
       return obj.getClass().getName() + "@" + System.identityHashCode(obj);

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java	2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/BeanInterceptorMetaDataBridge.java	2008-01-23 09:07:42 UTC (rev 69231)
@@ -26,10 +26,14 @@
 import java.util.Arrays;
 import java.util.List;
 
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
 import javax.interceptor.AroundInvoke;
 import javax.interceptor.Interceptors;
 
 import org.jboss.ejb3.annotation.impl.InterceptorsImpl;
+import org.jboss.ejb3.annotation.impl.PostActivateImpl;
+import org.jboss.ejb3.annotation.impl.PrePassivateImpl;
 import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptors;
 import org.jboss.ejb3.interceptors.aop.annotation.DefaultInterceptorsImpl;
 import org.jboss.ejb3.metadata.MetaDataBridge;
@@ -201,6 +205,24 @@
                return annotationClass.cast(interceptors);
          }
       }
+      else if(annotationClass == PostActivate.class)
+      {
+         if(beanMetaData instanceof JBossSessionBeanMetaData)
+         {
+            PostActivate lifeCycleAnnotation = getLifeCycleAnnotation(((JBossSessionBeanMetaData) beanMetaData).getPostActivates(), PostActivateImpl.class, methodName);
+            if(lifeCycleAnnotation != null)
+               return annotationClass.cast(lifeCycleAnnotation);
+         }
+      }
+      else if(annotationClass == PrePassivate.class)
+      {
+         if(beanMetaData instanceof JBossSessionBeanMetaData)
+         {
+            PrePassivate lifeCycleAnnotation = getLifeCycleAnnotation(((JBossSessionBeanMetaData) beanMetaData).getPrePassivates(), PrePassivateImpl.class, methodName);
+            if(lifeCycleAnnotation != null)
+               return annotationClass.cast(lifeCycleAnnotation);
+         }
+      }
       return super.retrieveAnnotation(annotationClass, beanMetaData, classLoader, methodName, parameterNames);
    }
 }

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java	2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/EnvironmentInterceptorMetaDataBridge.java	2008-01-23 09:07:42 UTC (rev 69231)
@@ -75,7 +75,7 @@
       return null;
    }
    
-   private <T extends Annotation> T getLifeCycleAnnotation(LifecycleCallbacksMetaData callbacks, Class<T> annotationImplType, String methodName)
+   protected <T extends Annotation> T getLifeCycleAnnotation(LifecycleCallbacksMetaData callbacks, Class<T> annotationImplType, String methodName)
    {
       if(callbacks == null || callbacks.isEmpty())
          return null;

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java	2008-01-23 09:02:54 UTC (rev 69230)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/metadata/InterceptorMetaDataBridge.java	2008-01-23 09:07:42 UTC (rev 69231)
@@ -23,8 +23,12 @@
 
 import java.lang.annotation.Annotation;
 
+import javax.ejb.PostActivate;
+import javax.ejb.PrePassivate;
 import javax.interceptor.AroundInvoke;
 
+import org.jboss.ejb3.annotation.impl.PostActivateImpl;
+import org.jboss.ejb3.annotation.impl.PrePassivateImpl;
 import org.jboss.ejb3.metadata.MetaDataBridge;
 import org.jboss.logging.Logger;
 import org.jboss.metadata.ejb.spec.InterceptorMetaData;
@@ -54,6 +58,18 @@
          if(annotation != null)
             return annotationClass.cast(annotation);
       }
+      else if(annotationClass == PostActivate.class)
+      {
+         PostActivate lifeCycleAnnotation = getLifeCycleAnnotation(interceptorMetaData.getPostActivates(), PostActivateImpl.class, methodName);
+         if(lifeCycleAnnotation != null)
+            return annotationClass.cast(lifeCycleAnnotation);
+      }
+      else if(annotationClass == PrePassivate.class)
+      {
+         PrePassivate lifeCycleAnnotation = getLifeCycleAnnotation(interceptorMetaData.getPrePassivates(), PrePassivateImpl.class, methodName);
+         if(lifeCycleAnnotation != null)
+            return annotationClass.cast(lifeCycleAnnotation);
+      }
       return super.retrieveAnnotation(annotationClass, interceptorMetaData, classLoader, methodName, parameterNames);
    }
 }




More information about the jboss-cvs-commits mailing list