[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