[jboss-cvs] JBossAS SVN: r107104 - 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 05:41:49 EDT 2010


Author: alesj
Date: 2010-07-27 05:41:49 -0400 (Tue, 27 Jul 2010)
New Revision: 107104

Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
Log:
Package 2 delegate index.


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 09:05:46 UTC (rev 107103)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-27 09:41:49 UTC (rev 107104)
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.classloader.spi.DelegateLoader;
@@ -63,6 +64,9 @@
    /** The # of delegates who cant blacklist */
    private int cantBlacklist;
 
+   /** The package to delegate mapping */
+   private Map<ImportType, Map<String, List<Loader>>> mapping;
+
    /**
     * Create a new ClassLoaderInformation.
     * 
@@ -134,6 +138,9 @@
       {
          restoreBlackList();
       }
+
+      // package to delegate index
+      mapping = new ConcurrentHashMap<ImportType, Map<String, List<Loader>>>();
    }
 
    /**
@@ -329,36 +336,76 @@
       return loaders != null && loaders.isEmpty() == false;
    }
 
+   /**
+    * Get the package name for a resource
+    *
+    * @param resource the resource name
+    * @return the package name or the empty string if there is no package
+    */
+   private static final String getResourcePackageName(final String resource)
+   {
+      int i = resource.lastIndexOf('/');
+      if (i == -1)
+         return "";
+      return resource.substring(0, i).replace('/', '.');
+   }
+
    public Loader findLoader(ImportType type, String name)
    {
-      List<? extends DelegateLoader> delegates = getDelegates(type);
-      if (delegates == null || delegates.isEmpty())
-         return null;
-
-      for (DelegateLoader delegate : delegates)
+      String pckg = getResourcePackageName(name);
+      Map<String, List<Loader>> map = mapping.get(type);
+      List<Loader> loaders = null;
+      if (map != null && map.isEmpty() == false)
       {
-         if (delegate.getResource(name) != null)
+         loaders = map.get(pckg);
+         if (loaders != null && loaders.isEmpty() == false)
          {
-            cacheLoader(name, delegate);
-            return delegate;
+            for (Loader loader : loaders)
+            {
+               if (loader.getResource(name) != null)
+                  return loader;
+            }
          }
       }
-      return null;
+      Loader loader = findLoaderInternal(type, name, new URL[1]);
+      if (loader != null)
+      {
+         if (map == null)
+         {
+            map = new ConcurrentHashMap<String, List<Loader>>();
+            mapping.put(type, map);
+         }
+         if (loaders == null)
+         {
+            loaders = new CopyOnWriteArrayList<Loader>();
+            map.put(pckg, loaders);
+         }
+         loaders.add(loader);
+      }
+      return loader;
    }
 
    public URL findResource(ImportType type, String name)
    {
+      URL[] result = new URL[1];
+      findLoaderInternal(type, name, result);
+      return result[0];
+   }
+
+   private Loader findLoaderInternal(ImportType type, String name, URL[] result)
+   {
       List<? extends DelegateLoader> delegates = getDelegates(type);
       if (delegates == null || delegates.isEmpty())
          return null;
 
       for (DelegateLoader delegate : delegates)
       {
-         URL result = delegate.getResource(name);
-         if (result != null)
+         URL url = delegate.getResource(name);
+         if (url != null)
          {
-            cacheResource(name, result);
-            return result;
+            result[0] = url; // hacky way of returning a temp result
+            cacheLoader(name, delegate);
+            return delegate;
          }
       }
       return null;



More information about the jboss-cvs-commits mailing list