[jboss-cvs] JBossAS SVN: r101247 - projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Feb 22 10:46:32 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-02-22 10:46:32 -0500 (Mon, 22 Feb 2010)
New Revision: 101247

Modified:
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
Log:
[JBKERNEL-92] Make resolveCallbacks() access the callbacks in a thread safe way

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-02-22 13:34:18 UTC (rev 101246)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-02-22 15:46:32 UTC (rev 101247)
@@ -23,6 +23,7 @@
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -107,8 +108,8 @@
    private final Set<AbstractController> childControllers = new CopyOnWriteArraySet<AbstractController>();
 
    /** The callback items */
-   private final Map<Object, Set<CallbackItem<?>>> installCallbacks = new ConcurrentHashMap<Object, Set<CallbackItem<?>>>();
-   private final Map<Object, Set<CallbackItem<?>>> uninstallCallbacks = new ConcurrentHashMap<Object, Set<CallbackItem<?>>>();
+   private final Map<Object, Set<CallbackItem<?>>> installCallbacks = new HashMap<Object, Set<CallbackItem<?>>>();
+   private final Map<Object, Set<CallbackItem<?>>> uninstallCallbacks = new HashMap<Object, Set<CallbackItem<?>>>();
 
    /** Whether an on demand context has been enabled */
    private boolean onDemandEnabled = true;
@@ -1831,14 +1832,20 @@
     * @param isInstallPhase install or uninstall phase
     * @return all matching registered callbacks or empty set if no such item
     */
-   protected Set<CallbackItem<?>> getCallbacks(Object name, boolean isInstallPhase)
+   protected Set<CallbackItem<?>> getCallbacks(Set<CallbackItem<?>> result, Object name, boolean isInstallPhase)
    {
       lockRead();
       try
       {
          Map<Object, Set<CallbackItem<?>>> map = (isInstallPhase ? installCallbacks : uninstallCallbacks);
          Set<CallbackItem<?>> callbacks = map.get(name);
-         return callbacks != null ? callbacks : Collections.<CallbackItem<?>>emptySet();
+         if (callbacks != null)
+         {
+            if (result == null)
+               result = new HashSet<CallbackItem<?>>();
+            result.addAll(callbacks);
+         }
+         return result;
       }
       finally
       {
@@ -1910,20 +1917,16 @@
          if (dependencyInfo != null && dependencyInfo.isAutowireCandidate())
          {
             // match callbacks by name
-            existingCallbacks = new HashSet<CallbackItem<?>>();
-            existingCallbacks.addAll(getCallbacks(context.getName(), isInstallPhase));
+            existingCallbacks = getCallbacks(existingCallbacks, context.getName(), isInstallPhase);
             // match by classes
             Collection<Class<?>> classes = getExposedClasses(context);
             if (classes != null && classes.isEmpty() == false)
             {
                for (Class<?> clazz : classes)
                {
-                  existingCallbacks.addAll(getCallbacks(clazz, isInstallPhase));
+                  existingCallbacks = getCallbacks(existingCallbacks, clazz, isInstallPhase);
                }
             }
-            
-            if (existingCallbacks.isEmpty())
-               existingCallbacks = null;
          }
          
          if (installs != null || uninstalls != null || existingCallbacks != null)




More information about the jboss-cvs-commits mailing list