[jboss-cvs] JBossAS SVN: r77648 - trunk/ejb3/src/main/org/jboss/ejb3/client.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Aug 29 08:28:05 EDT 2008


Author: alex.loubyansky at jboss.com
Date: 2008-08-29 08:28:04 -0400 (Fri, 29 Aug 2008)
New Revision: 77648

Modified:
   trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java
Log:
JBCTS-843 I think ordering of callbacks should be moved to metadata and applied to all kinds of callbacks

Modified: trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java	2008-08-29 12:16:24 UTC (rev 77647)
+++ trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java	2008-08-29 12:28:04 UTC (rev 77648)
@@ -33,11 +33,11 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Stack;
+import java.util.TreeMap;
 
 import javax.naming.Context;
 import javax.naming.LinkRef;
@@ -368,7 +368,9 @@
    }
    
    /**
-    * Get the post construct methods
+    * Populate the list of the post construct callbacks ordered according to the spec rules defined in
+    * 12.4.1 Multiple Callback Interceptor Methods for a Life Cycle Callback Event.
+    * 
     * @throws ClassNotFoundException 
     * @throws NoSuchMethodException 
     * @throws SecurityException 
@@ -377,43 +379,60 @@
    private void processPostConstructs()
       throws ClassNotFoundException, SecurityException, NoSuchMethodException
    {
-      // First build a set of the callbacks by class      
-      List<Class<?>> pcClasses = new ArrayList<Class<?>>();
-      Stack<Method> pcs = new Stack<Method>();
+      LifecycleCallbacksMetaData callbacks = xml.getPostConstructs();
+      if(callbacks == null || callbacks.isEmpty())
+         return;
       
-      LifecycleCallbacksMetaData callbacks = xml.getPostConstructs();
-      if(callbacks != null)
+      ClassLoader cl = Thread.currentThread().getContextClassLoader();
+      Class<?> parameterTypes[] = new Class[0];
+
+      Comparator<Class<?>> callbackComparator = new Comparator<Class<?>>()
       {
-         for(LifecycleCallbackMetaData callback : callbacks)
+         public int compare(Class<?> o1, Class<?> o2)
          {
-            String className = callback.getClassName();
-            String methodName = callback.getMethodName();
-            Class<?> lifecycleClass;
-            if(className == null)
-               lifecycleClass = mainClass;
+            if (o1.isAssignableFrom(o2))
+               return -1;
+            if (o2.isAssignableFrom(o1))
+               return 1;
+            return 0;
+         }
+      };
+
+      Map<Class<?>, Method> defaultClassCallbacks = new TreeMap<Class<?>, Method>(callbackComparator);
+      Map<Class<?>, Method> nonDefaultClassCallbacks = new TreeMap<Class<?>, Method>(callbackComparator);
+
+      for (LifecycleCallbackMetaData callback : callbacks)
+      {
+         String className = callback.getClassName();
+         String methodName = callback.getMethodName();
+         Class<?> lifecycleClass;
+         Map<Class<?>, Method> callbacksMap = null;
+         if (className == null)
+         {
+            lifecycleClass = mainClass;
+            callbacksMap = defaultClassCallbacks;
+         }
+         else
+         {
+            lifecycleClass = cl.loadClass(className);
+            if(lifecycleClass.isAssignableFrom(mainClass))
+               callbacksMap = defaultClassCallbacks;
             else
-               lifecycleClass = Thread.currentThread().getContextClassLoader().loadClass(className);
-            Class<?> parameterTypes[] = new Class[0];
+               callbacksMap = nonDefaultClassCallbacks;
+         }
+
+         // If we haven't yet added the callback for this class
+         if (!callbacksMap.containsKey(lifecycleClass))
+         {
             Method method = lifecycleClass.getDeclaredMethod(methodName, parameterTypes);
-            
-            // If we haven't yet added the callback for this class
-            if (!pcClasses.contains(lifecycleClass))
-            {
-               // Add it
-               pcs.push(method);
-            }
-            
-            // Mark that we've added callbacks for this class
-            pcClasses.add(lifecycleClass);
+            callbacksMap.put(lifecycleClass, method);
          }
       }
       
-      // Add each post construct method, preserving proper order
-      while(pcs.size()>0)
-      {
-         postConstructs.add(pcs.pop());
-      }
-      
+      if(!defaultClassCallbacks.isEmpty())
+         postConstructs.addAll(defaultClassCallbacks.values());
+      if(!nonDefaultClassCallbacks.isEmpty())
+         postConstructs.addAll(nonDefaultClassCallbacks.values());
    }
 
    /* (non-Javadoc)




More information about the jboss-cvs-commits mailing list