[jboss-cvs] JBossAS SVN: r107109 - projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jul 27 09:19:38 EDT 2010


Author: alesj
Date: 2010-07-27 09:19:38 -0400 (Tue, 27 Jul 2010)
New Revision: 107109

Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
Log:
Iterate over packages just once.


Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-27 13:15:03 UTC (rev 107108)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-27 13:19:38 UTC (rev 107109)
@@ -22,6 +22,7 @@
 package org.jboss.classloader.spi.base;
 
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -129,8 +130,7 @@
                cantBlacklist++;
             }
 
-            addLoaderToIndex(baseDelegate, delegatePolicy, importType);
-            addLoaderToIndex(baseDelegate, delegatePolicy, ImportType.ALL);
+            addLoaderToIndex(baseDelegate, delegatePolicy, importType, ImportType.ALL);
          }
 
          this.delegates = Collections.synchronizedMap(temp);
@@ -269,8 +269,7 @@
             cantBlacklist++;
          }
 
-         addLoaderToIndex(loader, policy, type);
-         addLoaderToIndex(loader, policy, ImportType.ALL);
+         addLoaderToIndex(loader, policy, type, ImportType.ALL);
       }
    }
 
@@ -334,8 +333,7 @@
                   restoreBlackList();
             }
 
-            removeLoaderFromIndex(loader, policy, type);
-            removeLoaderFromIndex(loader, policy, ImportType.ALL);
+            removeLoaderFromIndex(loader, policy, type, ImportType.ALL);
          }
       }
    }
@@ -345,9 +343,9 @@
     *
     * @param loader the loader
     * @param policy the policy
-    * @param type the type
+    * @param types the types
     */
-   private void addLoaderToIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType type)
+   private void addLoaderToIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType... types)
    {
       if (policy == null)
          return;
@@ -355,21 +353,31 @@
       String[] packageNames = policy.getPackageNames();
       if (packageNames != null && packageNames.length > 0)
       {
-         Map<String, List<Loader>> map = index.get(type);
-         if (map == null)
+         // lets first build a list of possible maps
+         List<Map<String, List<Loader>>> maps = new ArrayList<Map<String, List<Loader>>>();
+         for (ImportType type : types)
          {
-            map = new ConcurrentHashMap<String, List<Loader>>();
-            index.put(type, map);
+            Map<String, List<Loader>> map = index.get(type);
+            if (map == null)
+            {
+               map = new ConcurrentHashMap<String, List<Loader>>();
+               index.put(type, map);
+            }
+            maps.add(map);
          }
+         // single package iteration
          for (String pn : packageNames)
          {
-            List<Loader> loaders = map.get(pn);
-            if (loaders == null)
+            for (Map<String, List<Loader>> map : maps)
             {
-               loaders = new CopyOnWriteArrayList<Loader>();
-               map.put(pn, loaders);
+               List<Loader> loaders = map.get(pn);
+               if (loaders == null)
+               {
+                  loaders = new CopyOnWriteArrayList<Loader>();
+                  map.put(pn, loaders);
+               }
+               loaders.add(loader);
             }
-            loaders.add(loader);
          }
       }
    }
@@ -379,25 +387,39 @@
     *
     * @param loader the loader
     * @param policy the policy
-    * @param type the type
+    * @param types the types
     */
-   private void removeLoaderFromIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType type)
+   private void removeLoaderFromIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType... types)
    {
       if (policy == null)
          return;
       
-      // remove loader from mapping / index
-      Map<String, List<Loader>> map = index.get(type);
-      if (map != null)
+      String[] packageNames = policy.getPackageNames();
+      if (packageNames != null && packageNames.length > 0)
       {
-         String[] packageNames = policy.getPackageNames();
-         if (packageNames != null)
+         // lets first build a list of possible maps
+         Map<ImportType, Map<String, List<Loader>>> maps = new HashMap<ImportType, Map<String, List<Loader>>>();
+         for (ImportType type : types)
          {
-            for (String pn : packageNames)
+            Map<String, List<Loader>> map = index.get(type);
+            if (map != null)
+               maps.put(type, map);
+         }
+         // single package iteration
+         for (String pn : packageNames)
+         {
+            for (Map.Entry<ImportType, Map<String, List<Loader>>> entry : maps.entrySet())
             {
+               Map<String, List<Loader>> map = entry.getValue();
                List<Loader> loaders = map.get(pn);
                if (loaders != null)
-                  loaders.remove(loader);
+               {
+                  if (loaders.remove(loader) && loaders.isEmpty())
+                  {
+                     if (map.remove(pn) != null && map.isEmpty())
+                        index.remove(entry.getKey());
+                  }
+               }
             }
          }
       }



More information about the jboss-cvs-commits mailing list