[jboss-cvs] JBossAS SVN: r107107 - in projects/jboss-cl/trunk/classloader/src: test/java/org/jboss/test/classloader/delegate/test and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jul 27 08:58:45 EDT 2010


Author: alesj
Date: 2010-07-27 08:58:44 -0400 (Tue, 27 Jul 2010)
New Revision: 107107

Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
   projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
   projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/resources/tests/ResourceUnitTestCase.java
Log:
Index in advance, fall back to old list.

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 10:20:44 UTC (rev 107106)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-27 12:58:44 UTC (rev 107107)
@@ -65,8 +65,8 @@
    /** The # of delegates who cant blacklist */
    private int cantBlacklist;
 
-   /** The package to delegate mapping */
-   private Map<ImportType, Map<String, List<Loader>>> mapping;
+   /** The package to delegate index */
+   private Map<ImportType, Map<String, List<Loader>>> index;
 
    /**
     * Create a new ClassLoaderInformation.
@@ -90,6 +90,9 @@
       boolean canCache = policy.isCacheable();
       boolean canBlackList = policy.isBlackListable();
 
+      // package to delegate index
+      index = new ConcurrentHashMap<ImportType, Map<String, List<Loader>>>();
+
       List<? extends DelegateLoader> delegates = policy.getDelegates();
       if (delegates != null && delegates.isEmpty() == false)
       {
@@ -125,6 +128,9 @@
                canBlackList = false;
                cantBlacklist++;
             }
+
+            addLoaderToIndex(baseDelegate, delegatePolicy, importType);
+            addLoaderToIndex(baseDelegate, delegatePolicy, ImportType.ALL);
          }
 
          this.delegates = Collections.synchronizedMap(temp);
@@ -139,9 +145,6 @@
       {
          restoreBlackList();
       }
-
-      // package to delegate index
-      mapping = new ConcurrentHashMap<ImportType, Map<String, List<Loader>>>();
    }
 
    /**
@@ -265,6 +268,9 @@
 
             cantBlacklist++;
          }
+
+         addLoaderToIndex(loader, policy, type);
+         addLoaderToIndex(loader, policy, ImportType.ALL);
       }
    }
 
@@ -328,25 +334,75 @@
                   restoreBlackList();
             }
 
-            // remove loader from mapping / index
-            Map<String, List<Loader>> map = mapping.get(type);
-            if (map != null)
+            removeLoaderFromIndex(loader, policy, type);
+            removeLoaderFromIndex(loader, policy, ImportType.ALL);
+         }
+      }
+   }
+
+   /**
+    * Add loader to index.
+    *
+    * @param loader the loader
+    * @param policy the policy
+    * @param type the type
+    */
+   private void addLoaderToIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType type)
+   {
+      if (policy == null)
+         return;
+
+      String[] packageNames = policy.getPackageNames();
+      if (packageNames != null && packageNames.length > 0)
+      {
+         Map<String, List<Loader>> map = index.get(type);
+         if (map == null)
+         {
+            map = new ConcurrentHashMap<String, List<Loader>>();
+            index.put(type, map);
+         }
+         for (String pn : packageNames)
+         {
+            List<Loader> loaders = map.get(pn);
+            if (loaders == null)
             {
-               String[] packageNames = policy.getPackageNames();
-               if (packageNames != null)
-               {
-                  for (String pn : packageNames)
-                  {
-                     List<Loader> loaders = map.get(pn);
-                     if (loaders != null)
-                        loaders.remove(loader);
-                  }
-               }
+               loaders = new CopyOnWriteArrayList<Loader>();
+               map.put(pn, loaders);
             }
+            loaders.add(loader);
          }
       }
    }
 
+   /**
+    * Remove loader from index.
+    *
+    * @param loader the loader
+    * @param policy the policy
+    * @param type the type
+    */
+   private void removeLoaderFromIndex(Loader loader, BaseClassLoaderPolicy policy, ImportType type)
+   {
+      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)
+         {
+            for (String pn : packageNames)
+            {
+               List<Loader> loaders = map.get(pn);
+               if (loaders != null)
+                  loaders.remove(loader);
+            }
+         }
+      }
+   }
+
    public boolean isRelevant(ImportType type)
    {
       List<? extends DelegateLoader> loaders = getDelegates(type);
@@ -369,37 +425,7 @@
 
    public Loader findLoader(ImportType type, String name)
    {
-      String pckg = getResourcePackageName(name);
-      Map<String, List<Loader>> map = mapping.get(type);
-      List<Loader> loaders = null;
-      if (map != null && map.isEmpty() == false)
-      {
-         loaders = map.get(pckg);
-         if (loaders != null && loaders.isEmpty() == false)
-         {
-            for (Loader loader : loaders)
-            {
-               if (loader.getResource(name) != null)
-                  return loader;
-            }
-         }
-      }
-      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;
+      return findLoaderInternal(type, name, new URL[1]);
    }
 
    public URL findResource(ImportType type, String name)
@@ -419,20 +445,45 @@
     */
    private Loader findLoaderInternal(ImportType type, String name, URL[] result)
    {
+      // try index first
+      Map<String, List<Loader>> map = index.get(type);
+      if (map != null && map.isEmpty() == false)
+      {
+         String pckg = getResourcePackageName(name);
+         List<Loader> loaders = map.get(pckg);
+         if (loaders != null && loaders.isEmpty() == false)
+         {
+            for (Loader loader : loaders)
+            {
+               URL url = loader.getResource(name);
+               if (url != null)
+               {
+                  result[0] = url;
+                  cacheLoader(name, loader);
+                  cacheResource(name, url);
+                  return loader;
+               }
+            }
+         }
+      }
+
+      // fall back to old all delegates list, some policies don't expose packages
       List<? extends DelegateLoader> delegates = getDelegates(type);
-      if (delegates == null || delegates.isEmpty())
-         return null;
-
-      for (DelegateLoader delegate : delegates)
+      if (delegates != null && delegates.isEmpty() == false)
       {
-         URL url = delegate.getResource(name);
-         if (url != null)
+         for (DelegateLoader loader : delegates)
          {
-            result[0] = url; // hacky way of returning a temp result?
-            cacheLoader(name, delegate);
-            return delegate;
+            URL url = loader.getResource(name);
+            if (url != null)
+            {
+               result[0] = url;
+               cacheLoader(name, loader);
+               cacheResource(name, url);
+               return loader;
+            }
          }
       }
+
       return null;
    }
 

Modified: projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java	2010-07-27 10:20:44 UTC (rev 107106)
+++ projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java	2010-07-27 12:58:44 UTC (rev 107107)
@@ -28,8 +28,6 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
-import junit.framework.Test;
-
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -47,6 +45,8 @@
 import org.jboss.test.classloader.delegate.support.b.TestFactoryImplementation;
 import org.jboss.test.thread.TestThread;
 
+import junit.framework.Test;
+
 /**
  * DelegateUnitTestCase
  * 
@@ -86,7 +86,7 @@
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
       MockClassLoaderPolicy pb = createMockClassLoaderPolicy("B");
-      pb.setPaths(TestB1.class);
+      pb.setPathsAndPackageNames(TestB1.class);
       ClassLoader b = system.registerClassLoaderPolicy(pb);
 
       MockClassLoaderPolicy pa = createMockClassLoaderPolicy("A");
@@ -140,12 +140,12 @@
       ClassLoader a = system.registerClassLoaderPolicy(pa);
       
       Class<?> fromB = assertLoadClass(ClassLoaderDomain.class, b, false);
-      Class<?> fromA = assertLoadClass(ClassLoaderDomain.class, a, b, false);
+      assertLoadClass(ClassLoaderDomain.class, a, b, false);
       
       Class<?> delegate = assertLoadClass(TestADelegateClassLoaderDomain.class, a, false);
       
       Method method = delegate.getMethod("getSomething", (Class[]) null);
-      fromA = method.getReturnType();
+      Class<? >fromA = method.getReturnType();
       assertNotNull(fromA);
       assertClassLoader(fromA, b);
       
@@ -183,7 +183,7 @@
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" });
+      policy.setPackageNames("");
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
       
       assertLoadClass("TestDefaultPackage", classLoader);
@@ -194,7 +194,7 @@
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" });
+      policy.setPackageNames("");
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
@@ -208,7 +208,7 @@
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" });
+      policy.setPackageNames("");
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setImportAll(true);
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
@@ -223,7 +223,7 @@
       ClassLoaderDomain parent = system.createAndRegisterDomain("parent", ParentPolicy.BEFORE_BUT_JAVA_ONLY);
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" });
+      policy.setPackageNames("");
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.BEFORE, parent);
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       ClassLoader classLoader = system.registerClassLoaderPolicy(parent, policy);
@@ -256,7 +256,7 @@
          
          Class<?> testSleep = assertLoadClass(TestSleep.class, a);
          Field field = testSleep.getField("sleep");
-         field.set(null, new Long(1));
+         field.set(null, 1l);
          
          final CountDownLatch startALatch = new CountDownLatch(1);
          final CountDownLatch startBLatch = new CountDownLatch(1);

Modified: projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/resources/tests/ResourceUnitTestCase.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/resources/tests/ResourceUnitTestCase.java	2010-07-27 10:20:44 UTC (rev 107106)
+++ projects/jboss-cl/trunk/classloader/src/test/java/org/jboss/test/classloader/resources/tests/ResourceUnitTestCase.java	2010-07-27 12:58:44 UTC (rev 107107)
@@ -28,8 +28,6 @@
 import java.util.Enumeration;
 import java.util.HashSet;
 
-import junit.framework.Test;
-
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.ParentPolicy;
@@ -37,10 +35,13 @@
 import org.jboss.classloader.test.support.MockClassLoaderPolicy;
 import org.jboss.test.classloader.AbstractClassLoaderTestWithSecurity;
 
+import junit.framework.Test;
+
 /**
  * ClassLoaderSystemUnitTestCase.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
 public class ResourceUnitTestCase extends AbstractClassLoaderTestWithSecurity
@@ -83,6 +84,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -99,6 +101,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("");
+      policy.setPackageNames("");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -115,7 +118,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -132,7 +135,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -149,7 +152,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setImportAll(true);
@@ -166,7 +169,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" } );
+      policy.setPackageNames("");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setImportAll(true);
@@ -183,7 +186,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       
@@ -200,7 +203,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.BEFORE, parent);
@@ -219,7 +222,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.AFTER, parent);
@@ -236,7 +239,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.AFTER, parent);
@@ -255,7 +258,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" } );
+      policy.setPackageNames("");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.BEFORE, parent);
@@ -299,7 +302,7 @@
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setPrefix("b/");
       policy2.setPath("com/acme/p1");
-      policy2.setPackageNames(new String[] { "com.acme.p1" });
+      policy2.setPackageNames("com.acme.p1");
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
       system.registerClassLoaderPolicy(policy2);
       
@@ -316,7 +319,7 @@
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setPrefix("b/");
       policy2.setPath("");
-      policy2.setPackageNames(new String[] { "" });
+      policy2.setPackageNames("");
       ClassLoader classLoader = system.registerClassLoaderPolicy(policy);
       system.registerClassLoaderPolicy(policy2);
       
@@ -329,6 +332,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -361,7 +365,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -378,7 +382,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(policy)));
@@ -395,7 +399,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setImportAll(true);
@@ -412,7 +416,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" } );
+      policy.setPackageNames("");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       policy2.setImportAll(true);
@@ -429,7 +433,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
 
       MockClassLoaderPolicy policy2 = createMockClassLoaderPolicy();
       
@@ -446,7 +450,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.BEFORE, parent);
@@ -465,7 +469,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("com/acme/p1");
-      policy.setPackageNames(new String[] { "com.acme.p1" } );
+      policy.setPackageNames("com.acme.p1");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.AFTER, parent);
@@ -484,7 +488,7 @@
       MockClassLoaderPolicy policy = createMockClassLoaderPolicy();
       policy.setPrefix("a/");
       policy.setPath("");
-      policy.setPackageNames(new String[] { "" } );
+      policy.setPackageNames("");
       system.registerClassLoaderPolicy(parent, policy);
 
       ClassLoaderDomain child = system.createAndRegisterDomain("child", ParentPolicy.BEFORE, parent);
@@ -590,7 +594,7 @@
          HashSet<URL> found = new HashSet<URL>();
          while (urls.hasMoreElements())
             found.add(urls.nextElement());
-         fail("Should NOT have got resources " + resourcePath + " from " + classLoader + " found " + urls);
+         fail("Should NOT have got resources " + resourcePath + " from " + classLoader + " found " + found);
       }
    }
 }



More information about the jboss-cvs-commits mailing list