[jboss-cvs] JBossAS SVN: r77973 - trunk/ejb3/src/main/org/jboss/ejb3/client.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Sep 4 09:29:52 EDT 2008
Author: alex.loubyansky at jboss.com
Date: 2008-09-04 09:29:51 -0400 (Thu, 04 Sep 2008)
New Revision: 77973
Modified:
trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java
Log:
JBCTS-843 with comparator impl some of the callbacks were getting lost due to inconsistent impl with equals. Current impl is a copy of the helper method from the metadata project where it is also tested. After the metadata release, the method from the metadata project should be used instead.
Modified: trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java 2008-09-04 13:14:28 UTC (rev 77972)
+++ trunk/ejb3/src/main/org/jboss/ejb3/client/ClientContainer.java 2008-09-04 13:29:51 UTC (rev 77973)
@@ -33,11 +33,12 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
-import java.util.TreeMap;
+import java.util.Set;
import javax.naming.Context;
import javax.naming.LinkRef;
@@ -386,55 +387,50 @@
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class<?> parameterTypes[] = new Class[0];
- Comparator<Class<?>> callbackComparator = new Comparator<Class<?>>()
- {
- public int compare(Class<?> o1, Class<?> o2)
- {
- if(o1 == o2)
- return 0;
- if (o1.isAssignableFrom(o2))
- return -1;
- if (o2.isAssignableFrom(o1))
- return 1;
- return 0;
- }
- };
+ Set<Class<?>> callbacksSet = new HashSet<Class<?>>();
+ LinkedList<Method> methods = new LinkedList<Method>();
- 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
- callbacksMap = nonDefaultClassCallbacks;
- }
+ Class<?> lifecycleClass = className == null ? mainClass : cl.loadClass(className);
// If we haven't yet added the callback for this class
- if (!callbacksMap.containsKey(lifecycleClass))
+ if (callbacksSet.add(lifecycleClass))
{
Method method = lifecycleClass.getDeclaredMethod(methodName, parameterTypes);
- callbacksMap.put(lifecycleClass, method);
- }
+
+ boolean added = false;
+ for (int i = 0; i < methods.size(); ++i)
+ {
+ Method m = methods.get(i);
+ Class<?> methodClass = m.getDeclaringClass();
+ // insert the class before the current class in the list if the class is a superclass of the current class
+ if (lifecycleClass.isAssignableFrom(methodClass))
+ {
+ methods.add(i, method);
+ added = true;
+ break;
+ }
+ // insert the class before the current class in the list
+ // if the class is not a subclass of the current class and
+ // it is a superclass of the default class or the default class itself
+ else if(!methodClass.isAssignableFrom(lifecycleClass) &&
+ (lifecycleClass == mainClass || lifecycleClass.isAssignableFrom(mainClass)))
+ {
+ methods.add(i, method);
+ added = true;
+ break;
+ }
+ }
+
+ if (!added)
+ methods.add(method);
+ }
}
- if(!defaultClassCallbacks.isEmpty())
- postConstructs.addAll(defaultClassCallbacks.values());
- if(!nonDefaultClassCallbacks.isEmpty())
- postConstructs.addAll(nonDefaultClassCallbacks.values());
+ postConstructs.addAll(methods);
}
/* (non-Javadoc)
More information about the jboss-cvs-commits
mailing list