[jboss-cvs] JBossAS SVN: r107087 - in projects/jboss-cl/trunk: classloader/src/main/java/org/jboss/classloader/spi/base and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jul 26 12:30:54 EDT 2010


Author: alesj
Date: 2010-07-26 12:30:52 -0400 (Mon, 26 Jul 2010)
New Revision: 107087

Added:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderCache.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/helpers/
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/helpers/AbstractClassLoaderCache.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java
Modified:
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderPolicy.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
   projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
   projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
Log:
[JBCL-174]; add explicit imports caching; TODO - tests.


Copied: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderCache.java (from rev 106760, projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/CacheLoader.java)
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderCache.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderCache.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -0,0 +1,141 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.classloader.spi;
+
+import java.net.URL;
+
+/**
+ * Simple ClassLoaderCache spi.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface ClassLoaderCache
+{
+   /**
+    * Get the cached loader.
+    *
+    * @param name the class name
+    * @return cached loader or null if no such loader
+    */
+   Loader getCachedLoader(String name);
+
+   /**
+    * Try finding the non-cached loader.
+    * If found cache it if possible.
+    *
+    * @param type import type
+    * @param name the class name
+    * @return found loader or null
+    */
+   Loader findLoader(ImportType type, String name);
+
+   /**
+    * Do cache loader.
+    *
+    * @param name the class name
+    * @param loader the loader to cache
+    */
+   void cacheLoader(String name, Loader loader);
+
+   /**
+    * Is class black listed.
+    *
+    * @param name the class name
+    * @return true if black listed, false otherwise
+    */
+   boolean isBlackListedClass(String name);
+
+   /**
+    * Do blacklist class.
+    *
+    * @param name the class name to black list
+    */
+   void blackListClass(String name);
+
+   /**
+    * Get cached resource.
+    *
+    * @param name the resource name
+    * @return cached resource or null if no such resource
+    */
+   URL getCachedResource(String name);
+
+   /**
+    * Try finding non-cached the resource.
+    * If found cache it if possible.
+    *
+    * @param type import type
+    * @param name the resource name
+    * @return found resource or null
+    */
+   URL findResource(ImportType type, String name);
+
+   /**
+    * Cache resource.
+    *
+    * @param name the resource name
+    * @param resource the resource
+    */
+   void cacheResource(String name, URL resource);
+
+   /**
+    * Is the resource black listed.
+    * @param name the resource name
+    * @return true if resource is black listed, false otherwise
+    */
+   boolean isBlackListedResource(String name);
+
+   /**
+    * Do black list the resource.
+    *
+    * @param name the resource name
+    */
+   void blackListResource(String name);
+
+   /**
+    * Flush the caches
+    */
+   void flushCaches();
+
+   /**
+    * Cleans the entry with the given name from the blackList
+    *
+    * @param name the name of the resource to clear from the blackList
+    */
+   void clearBlackList(String name);
+
+   /**
+    * Is the cache relevant for lookup.
+    *
+    * @param type the import type
+    * @return true if relevant, false otherwise
+    */
+   boolean isRelevant(ImportType type);
+
+   /**
+    * Get the cache info.
+    *
+    * @param type the import type
+    * @return the info
+    */
+   String getInfo(ImportType type);
+}
\ No newline at end of file

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderPolicy.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderPolicy.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/ClassLoaderPolicy.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -69,6 +69,11 @@
    /** Maps native library to its provider */
    private volatile List<NativeLibraryProvider> nativeLibraries;
 
+   public void setCache(ClassLoaderCache cache)
+   {
+      super.setCache(cache);
+   }
+
    /**
     * Add extra delegate loader.
     *

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -64,8 +64,6 @@
    /** The global class black list */
    private Set<String> globalClassBlackList = new ConcurrentSet<String>();
 
-   // TODO -- why the inconsistency / difference between classes and resources?
-
    /** The global resource cache */
    private Map<String, URL> globalResourceCache = new ConcurrentHashMap<String, URL>();
    
@@ -335,12 +333,12 @@
          return loader;
 
       // Work out the rules
-      ClassLoaderInformation info = null;
+      ClassLoaderCache cache = null;
       BaseClassLoaderPolicy policy;
       if (classLoader != null)
       {
          policy = classLoader.getPolicy();
-         info = policy.getInformation();
+         cache = policy.getCache();
          if (policy.isImportAll())
             allExports = true;
       }
@@ -356,9 +354,9 @@
          log.trace(this + " not loading " + path + " from all exports");
       
       // Next we try the before imports
-      if (info != null)
+      if (cache != null)
       {
-         loader = findLoaderInImports(info, path, ImportType.BEFORE, trace);
+         loader = findLoaderInImports(cache, path, ImportType.BEFORE, trace);
          if (loader != null)
             return loader;
       }
@@ -379,9 +377,9 @@
       }
 
       // Next we try the after imports
-      if (info != null)
+      if (cache != null)
       {
-         loader = findLoaderInImports(info, path, ImportType.AFTER, trace);
+         loader = findLoaderInImports(cache, path, ImportType.AFTER, trace);
          if (loader != null)
             return loader;
       }
@@ -405,9 +403,6 @@
    {
       boolean trace = log.isTraceEnabled();
 
-      // TODO -- check why is this different?
-      // TODO -- why only checking for cache and blacklisting in exports?
-
       // Try the classloader first
       if (classLoader != null)
       {
@@ -431,12 +426,12 @@
          return result;
 
       // Work out the rules
-      ClassLoaderInformation info = null;
+      ClassLoaderCache cache = null;
       BaseClassLoaderPolicy policy;
       if (classLoader != null)
       {
          policy = classLoader.getPolicy();
-         info = policy.getInformation();
+         cache = policy.getCache();
          if (policy.isImportAll())
             allExports = true;
       }
@@ -452,9 +447,9 @@
          log.trace(this + " not getting resource " + name + " from all exports");
       
       // Next we try the imports
-      if (info != null)
+      if (cache != null)
       {
-         result = getResourceFromImports(info, name, ImportType.ALL, trace);
+         result = getResourceFromImports(cache, name, ImportType.ALL, trace);
          if (result != null)
             return result;
       }
@@ -710,7 +705,7 @@
       }
       // Here is not found in the exports so can we blacklist it?
       if (canBlackList)
-         globalClassBlackList.add(name); // TODO -- why already blacklisting here?
+         globalClassBlackList.add(name);
       
       return null;
    }
@@ -864,23 +859,23 @@
    /**
     * Find a loader for a class in imports
     *
-    * @param info the classloader information
+    * @param cache the classloader cache
     * @param name the class resource name
     * @param type the import type
     * @param trace whether trace is enabled
     * @return the loader
     */
-   Loader findLoaderInImports(ClassLoaderInformation info, String name, ImportType type, boolean trace)
+   Loader findLoaderInImports(ClassLoaderCache cache, String name, ImportType type, boolean trace)
    {
-      List<? extends DelegateLoader> delegates = info.getDelegates(type);
-      if (delegates == null || delegates.isEmpty())
+      boolean relevant = cache.isRelevant(type);
+      if (relevant == false)
       {
          if (trace)
-            log.trace(this + " not loading " + name + " from imports it has no delegates");
+            log.trace(this + " not loading " + name + " from imports, it's not relevant: " + cache.getInfo(type));
          return null;
       }
 
-      Loader loader = info.getCachedLoader(name);
+      Loader loader = cache.getCachedLoader(name);
       if (loader != null)
       {
          if (trace)
@@ -888,48 +883,45 @@
          return loader;
       }
       
-      if (info.isBlackListedClass(name))
+      if (cache.isBlackListedClass(name))
       {
          if (trace)
             log.trace(this + " class is black listed in imports " + name);
          return null;
       }
-      
-      for (DelegateLoader delegate : delegates)
-      {
-         if (trace)
-            log.trace(this + " trying to load " + name + " from import " + delegate + " for " + info.getClassLoader());
-         if (delegate.getResource(name) != null)
-         {
-            info.cacheLoader(name, delegate);
-            return delegate;
-         }
-      }
+
+      if (trace)
+         log.trace(this + " trying to load " + name + " from imports: " + cache.getInfo(type));
+
+      loader = cache.findLoader(type, name);
+      if (loader != null)
+         return loader;
+
       if (type == ImportType.AFTER) // TODO -- is this really OK?
-         info.blackListClass(name);
+         cache.blackListClass(name);
       return null;
    }
    
    /**
     * Load a resource from the imports
     * 
-    * @param info the classloader information
+    * @param cache the classloader cache
     * @param name the resource name
     * @param type the import type
     * @param trace whether trace is enabled
     * @return the url
     */
-   private URL getResourceFromImports(ClassLoaderInformation info, String name, ImportType type, boolean trace)
+   private URL getResourceFromImports(ClassLoaderCache cache, String name, ImportType type, boolean trace)
    {
-      List<? extends DelegateLoader> delegates = info.getDelegates(type);
-      if (delegates == null || delegates.isEmpty())
+      boolean relevant = cache.isRelevant(type);
+      if (relevant == false)
       {
          if (trace)
-            log.trace(this + " not getting resource " + name + " from imports it has no delegates");
+            log.trace(this + " not getting resource " + name + " from imports, it's not relevant: " + cache.getInfo(type));
          return null;
       }
 
-      URL url = info.getCachedResource(name);
+      URL url = cache.getCachedResource(name);
       if (url != null)
       {
          if (trace)
@@ -937,7 +929,7 @@
          return url;
       }
       
-      if (info.isBlackListedResource(name))
+      if (cache.isBlackListedResource(name))
       {
          if (trace)
             log.trace(this + " resource is black listed in imports " + name);
@@ -945,19 +937,15 @@
       }
 
       if (trace)
-         log.trace(this + " trying to get resource " + name + " from imports " + delegates + " for " + info.getClassLoader());
+         log.trace(this + " trying to get resource " + name + " from imports: " + cache.getInfo(type));
 
-      for (DelegateLoader delegate : delegates)
-      {
-         URL result = delegate.getResource(name);
-         if (result != null)
-         {
-            info.cacheResource(name, result);
-            return result;
-         }
-      }
+
+      url = cache.findResource(type, name);
+      if (url != null)
+         return url;
+
       if (type == ImportType.AFTER) // TODO -- check
-         info.blackListResource(name);
+         cache.blackListResource(name);
       return null;
    }
    

Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -26,8 +26,13 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.ProtectionDomain;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Formattable;
+import java.util.Formatter;
+import java.util.List;
 
+import org.jboss.classloader.spi.ClassLoaderCache;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.DelegateLoader;
 import org.jboss.classloader.spi.ShutdownPolicy;
@@ -58,7 +63,10 @@
 
    /** The classloader information */
    private volatile ClassLoaderInformation information;
-   
+
+   /** The cache */
+   private volatile ClassLoaderCache cache;
+
    /** The access control context for this policy */
    private AccessControlContext access;
 
@@ -124,6 +132,32 @@
    }
 
    /**
+    * Get the cache.
+    *
+    * By default we return information if there is no cache set explicitly.
+    *
+    * @return the cache
+    */
+   protected ClassLoaderCache getCache()
+   {
+      ClassLoaderCache clc = cache;
+      if (clc == null)
+         return information;
+      
+      return new ClassLoaderCacheWrapper(clc, information);
+   }
+
+   /**
+    * Set the cache.
+    *
+    * @param cache the cache
+    */
+   protected void setCache(ClassLoaderCache cache)
+   {
+      this.cache = cache;
+   }
+
+   /**
     * Get the access control context for this policy
     * 
     * @return the access control context

Added: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderCacheWrapper.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -0,0 +1,142 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.classloader.spi.base;
+
+import java.net.URL;
+
+import org.jboss.classloader.spi.ClassLoaderCache;
+import org.jboss.classloader.spi.ImportType;
+import org.jboss.classloader.spi.Loader;
+
+/**
+ * Wrap finder method with additional ClassLoaderInformation lookup.
+ *
+ * @author <a href="mailto:ales.justin at jboss.org">Ales Justin</a>
+ */
+class ClassLoaderCacheWrapper implements ClassLoaderCache
+{
+   private ClassLoaderCache delegate;
+   private ClassLoaderInformation info;
+
+   ClassLoaderCacheWrapper(ClassLoaderCache delegate, ClassLoaderInformation info)
+   {
+      this.delegate = delegate;
+      this.info = info;
+   }
+
+   public Loader getCachedLoader(String name)
+   {
+      return delegate.getCachedLoader(name);
+   }
+
+   public Loader findLoader(ImportType type, String name)
+   {
+      Loader loader = delegate.findLoader(type, name);
+      if (loader != null)
+      {
+         cacheLoader(name, loader);
+         return loader;
+      }
+
+      if (info != null)
+      {
+         loader = info.findLoader(type, name);
+         if (loader != null)
+            cacheLoader(name, loader);
+      }
+      return loader;
+   }
+
+   public void cacheLoader(String name, Loader loader)
+   {
+      delegate.cacheLoader(name, loader);
+   }
+
+   public boolean isBlackListedClass(String name)
+   {
+      return delegate.isBlackListedClass(name);
+   }
+
+   public void blackListClass(String name)
+   {
+      delegate.blackListClass(name);
+   }
+
+   public URL getCachedResource(String name)
+   {
+      return delegate.getCachedResource(name);
+   }
+
+   public URL findResource(ImportType type, String name)
+   {
+      URL url = delegate.findResource(type, name);
+      if (url != null)
+      {
+         cacheResource(name, url);
+         return url;
+      }
+
+      if (info != null)
+      {
+         url = info.findResource(type, name);
+         if (url != null)
+            cacheResource(name, url);
+      }
+      return url;
+   }
+
+   public void cacheResource(String name, URL resource)
+   {
+      delegate.cacheResource(name, resource);
+   }
+
+   public boolean isBlackListedResource(String name)
+   {
+      return delegate.isBlackListedResource(name);
+   }
+
+   public void blackListResource(String name)
+   {
+      delegate.blackListResource(name);
+   }
+
+   public void flushCaches()
+   {
+      delegate.flushCaches();
+   }
+
+   public void clearBlackList(String name)
+   {
+      delegate.clearBlackList(name);
+   }
+
+   public boolean isRelevant(ImportType type)
+   {
+      return delegate.isRelevant(type);
+   }
+
+   public String getInfo(ImportType type)
+   {
+      return delegate.getInfo(type);
+   }
+}

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-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -22,14 +22,16 @@
 package org.jboss.classloader.spi.base;
 
 import java.net.URL;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.classloader.spi.DelegateLoader;
 import org.jboss.classloader.spi.ImportType;
 import org.jboss.classloader.spi.Loader;
-import org.jboss.util.collection.ConcurrentSet;
+import org.jboss.classloader.spi.helpers.AbstractClassLoaderCache;
 
 /**
  * ClassLoaderInformation.
@@ -38,7 +40,7 @@
  * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision: 1.1 $
  */
-public class ClassLoaderInformation
+public class ClassLoaderInformation extends AbstractClassLoaderCache
 {
    /** The classloader */
    private BaseClassLoader classLoader;
@@ -54,18 +56,6 @@
 
    /** The delegates */
    private volatile Map<ImportType, List<DelegateLoader>> delegates;
-   
-   /** The class cache */
-   private volatile Map<String, Loader> classCache;
-   
-   /** The class black list */
-   private volatile Set<String> classBlackList;
-   
-   /** The resource cache */
-   private volatile Map<String, URL> resourceCache;
-   
-   /** The resource black list */
-   private volatile Set<String> resourceBlackList;
 
    /** The # of delegates who cant cache */
    private int cantCache;
@@ -146,46 +136,7 @@
       }
    }
 
-   private void restoreCache()
-   {
-      classCache = new ConcurrentHashMap<String, Loader>();
-      resourceCache = new ConcurrentHashMap<String, URL>();
-   }
-
-   private void destroyCache()
-   {
-      classCache = null;
-      resourceCache = null;
-   }
-
-   private void restoreBlackList()
-   {
-      classBlackList = new ConcurrentSet<String>();
-      resourceBlackList = new ConcurrentSet<String>();
-   }
-
-   private void destroyBlackList()
-   {
-      classBlackList = null;
-      resourceBlackList = null;
-   }
-
    /**
-    * Flush the caches
-    */
-   public void flushCaches()
-   {
-      if (classCache != null)
-         classCache.clear();
-      if (classBlackList != null)
-         classBlackList.clear();
-      if (resourceCache != null)
-         resourceCache.clear();
-      if (resourceBlackList != null)
-         resourceBlackList.clear();
-   }
-   
-   /**
     * Get the classLoader.
     * 
     * @return the classLoader.
@@ -372,121 +323,57 @@
       }
    }
 
-   /**
-    * Get the cached loader for a class 
-    * 
-    * @param name the class name
-    * @return any cached loader
-    */
-   public Loader getCachedLoader(String name)
+   public boolean isRelevant(ImportType type)
    {
-      Map<String, Loader> classCache = this.classCache;
-      if (classCache != null)
-         return classCache.get(name);
-      return null;
+      List<? extends DelegateLoader> loaders = getDelegates(type);
+      return loaders != null && loaders.isEmpty() == false;
    }
-   
-   /**
-    * Cache a loader for a class
-    * 
-    * @param name the class name
-    * @param loader the cached loader
-    */
-   public void cacheLoader(String name, Loader loader)
+
+   public Loader findLoader(ImportType type, String name)
    {
-      Map<String, Loader> classCache = this.classCache;
-      if (classCache != null)
-         classCache.put(name, loader);
+      List<? extends DelegateLoader> delegates = getDelegates(type);
+      if (delegates == null || delegates.isEmpty())
+         return null;
+
+      for (DelegateLoader delegate : delegates)
+      {
+         if (delegate.getResource(name) != null)
+         {
+            cacheLoader(name, delegate);
+            return delegate;
+         }
+      }
+      return null;
    }
-   
-   /**
-    * Check whether this is a black listed class
-    * 
-    * @param name the class name
-    * @return true when black listed
-    */
-   public boolean isBlackListedClass(String name)
+
+   public URL findResource(ImportType type, String name)
    {
-      Set<String> classBlackList = this.classBlackList;
-      return classBlackList != null && classBlackList.contains(name);
-   }
-   
-   /**
-    * Blacklist a class
-    * 
-    * @param name the class name to black list
-    */
-   public void blackListClass(String name)
-   {
-      Set<String> classBlackList = this.classBlackList;
-      if (classBlackList != null)
-         classBlackList.add(name);
-   }
-   
-   /**
-    * Get the cached url for a resource 
-    * 
-    * @param name the resource name
-    * @return any cached url
-    */
-   public URL getCachedResource(String name)
-   {
-      Map<String, URL> resourceCache = this.resourceCache;
-      if (resourceCache != null)
-         return resourceCache.get(name);
+      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)
+         {
+            cacheResource(name, result);
+            return result;
+         }
+      }
       return null;
    }
-   
-   /**
-    * Cache a url for a resource
-    * 
-    * @param name the resource name
-    * @param url the cached url
-    */
-   public void cacheResource(String name, URL url)
+
+   public String getInfo(ImportType type)
    {
-      Map<String, URL> resourceCache = this.resourceCache;
-      if (resourceCache != null)
-         resourceCache.put(name, url);
+      StringBuilder builder = new StringBuilder();
+      List<? extends DelegateLoader> delegates = getDelegates(type);
+      if (delegates != null && delegates.isEmpty() == false)
+         builder.append("delegates: ").append(delegates);
+      builder.append(getClassLoader());
+      return builder.toString();
    }
-   
-   /**
-    * Check whether this is a black listed resource
-    * 
-    * @param name the resource name
-    * @return true when black listed
-    */
-   public boolean isBlackListedResource(String name)
-   {
-      Set<String> resourceBlackList = this.resourceBlackList;
-      return resourceBlackList != null && resourceBlackList.contains(name);
-   }
-   
-   /**
-    * Blacklist a resource
-    * 
-    * @param name the resource name to black list
-    */
-   public void blackListResource(String name)
-   {
-      Set<String> resourceBlackList = this.resourceBlackList;
-      if (resourceBlackList != null)
-         resourceBlackList.add(name);
-   }
-   
-   /**
-    * Cleans the entry with the given name from the blackList
-    *
-    * @param name the name of the resource to clear from the blackList
-    */
-   public void clearBlackList(String name)
-   {
-      if (classBlackList != null)
-         classBlackList.remove(name);
-      if (resourceBlackList != null)
-         resourceBlackList.remove(name);
-   }
-   
+
    @Override
    public String toString()
    {

Added: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/helpers/AbstractClassLoaderCache.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/helpers/AbstractClassLoaderCache.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/helpers/AbstractClassLoaderCache.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -0,0 +1,201 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.classloader.spi.helpers;
+
+import java.net.URL;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.jboss.classloader.spi.ClassLoaderCache;
+import org.jboss.classloader.spi.Loader;
+import org.jboss.util.collection.ConcurrentSet;
+
+/**
+ * AbstractClassLoaderCache.
+ * 
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public abstract class AbstractClassLoaderCache implements ClassLoaderCache
+{
+   /** The class cache */
+   private volatile Map<String, Loader> classCache;
+
+   /** The class black list */
+   private volatile Set<String> classBlackList;
+
+   /** The resource cache */
+   private volatile Map<String, URL> resourceCache;
+
+   /** The resource black list */
+   private volatile Set<String> resourceBlackList;
+
+   /**
+    * Restore cache.
+    */
+   protected void restoreCache()
+   {
+      classCache = new ConcurrentHashMap<String, Loader>();
+      resourceCache = new ConcurrentHashMap<String, URL>();
+   }
+
+   /**
+    * Destroy cache.
+    */
+   protected void destroyCache()
+   {
+      classCache = null;
+      resourceCache = null;
+   }
+
+   /**
+    * Restore black list.
+    */
+   protected void restoreBlackList()
+   {
+      classBlackList = new ConcurrentSet<String>();
+      resourceBlackList = new ConcurrentSet<String>();
+   }
+
+   /**
+    * Destroy black list.
+    */
+   protected void destroyBlackList()
+   {
+      classBlackList = null;
+      resourceBlackList = null;
+   }
+
+   /**
+    * Merge caches.
+    *
+    * @param other the other cache
+    */
+   protected void merge(AbstractClassLoaderCache other)
+   {
+      if (other.classCache != null)
+      {
+         if (classCache != null)
+            classCache.putAll(other.classCache);
+         else
+            classCache = new ConcurrentHashMap<String, Loader>(other.classCache);
+      }
+      if (other.resourceCache != null)
+      {
+         if (resourceCache != null)
+            resourceCache.putAll(other.resourceCache);
+         else
+            resourceCache = new ConcurrentHashMap<String, URL>(other.resourceCache);
+      }
+      // TODO - join black lists OK?
+      if (other.classBlackList != null)
+      {
+         if (classBlackList != null)
+            classBlackList.addAll(other.classBlackList);
+         else
+            classBlackList = new ConcurrentSet<String>(other.classBlackList);
+      }
+      if (other.resourceBlackList != null)
+      {
+         if (resourceBlackList != null)
+            resourceBlackList.addAll(other.resourceBlackList);
+         else
+            resourceBlackList = new ConcurrentSet<String>(other.resourceBlackList);
+      }
+   }
+
+   public void flushCaches()
+   {
+      if (classCache != null)
+         classCache.clear();
+      if (classBlackList != null)
+         classBlackList.clear();
+      if (resourceCache != null)
+         resourceCache.clear();
+      if (resourceBlackList != null)
+         resourceBlackList.clear();
+   }
+
+   public Loader getCachedLoader(String name)
+   {
+      Map<String, Loader> classCache = this.classCache;
+      if (classCache != null)
+         return classCache.get(name);
+      return null;
+   }
+   
+   public void cacheLoader(String name, Loader loader)
+   {
+      Map<String, Loader> classCache = this.classCache;
+      if (classCache != null)
+         classCache.put(name, loader);
+   }
+   
+   public boolean isBlackListedClass(String name)
+   {
+      Set<String> classBlackList = this.classBlackList;
+      return classBlackList != null && classBlackList.contains(name);
+   }
+   
+   public void blackListClass(String name)
+   {
+      Set<String> classBlackList = this.classBlackList;
+      if (classBlackList != null)
+         classBlackList.add(name);
+   }
+   
+   public URL getCachedResource(String name)
+   {
+      Map<String, URL> resourceCache = this.resourceCache;
+      if (resourceCache != null)
+         return resourceCache.get(name);
+      return null;
+   }
+   
+   public void cacheResource(String name, URL url)
+   {
+      Map<String, URL> resourceCache = this.resourceCache;
+      if (resourceCache != null)
+         resourceCache.put(name, url);
+   }
+   
+   public boolean isBlackListedResource(String name)
+   {
+      Set<String> resourceBlackList = this.resourceBlackList;
+      return resourceBlackList != null && resourceBlackList.contains(name);
+   }
+   
+   public void blackListResource(String name)
+   {
+      Set<String> resourceBlackList = this.resourceBlackList;
+      if (resourceBlackList != null)
+         resourceBlackList.add(name);
+   }
+   
+   public void clearBlackList(String name)
+   {
+      if (classBlackList != null)
+         classBlackList.remove(name);
+      if (resourceBlackList != null)
+         resourceBlackList.remove(name);
+   }
+}

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -21,8 +21,12 @@
 */
 package org.jboss.classloading.spi.dependency;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.jboss.classloading.plugins.metadata.PackageCapability;
@@ -60,8 +64,26 @@
    
    /** The requirements for all modules */
    private Map<Module, List<RequirementDependencyItem>> requirements = new ConcurrentHashMap<Module, List<RequirementDependencyItem>>();
-   
+
+   /** The space cache */
+   private ClassLoadingSpaceCache cache;
+
+   public ClassLoadingSpace()
+   {
+      cache = new ClassLoadingSpaceCache(this);
+   }
+
    /**
+    * The cache.
+    *
+    * @return the cache
+    */
+   ClassLoadingSpaceCache getCache()
+   {
+      return cache;
+   }
+
+   /**
     * Get an unmodifiable set of the collections
     * 
     * @return the modules
@@ -70,7 +92,7 @@
    {
       return Collections.unmodifiableSet(modules);
    }
-   
+
    /**
     * Join and resolve a module
     * 
@@ -166,9 +188,15 @@
       int otherSize = space.getModules().size();
       
       if (ourSize >= otherSize)
+      {
          joinAndResolve(space.getModules());
+         cache.merge(space.getCache());
+      }
       else
+      {
          space.joinAndResolve(getModules());
+         space.getCache().merge(cache);
+      }
    }
    
    /**
@@ -187,6 +215,9 @@
       if (other != this)
          throw new IllegalStateException(module + " has the wrong classloading space: expected=" + this + " was " + other);
 
+      ClassLoadingSpaceCache clsc = other.getCache();
+      clsc.flushCaches(); // flush after split
+
       unjoin(module);
       unresolve(module);
    }

Copied: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java (from rev 106760, projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpace.java)
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java	                        (rev 0)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/ClassLoadingSpaceCache.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -0,0 +1,68 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2007, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.classloading.spi.dependency;
+
+import java.net.URL;
+
+import org.jboss.classloader.spi.ImportType;
+import org.jboss.classloader.spi.Loader;
+import org.jboss.classloader.spi.helpers.AbstractClassLoaderCache;
+
+/**
+ * ClassLoadingSpace shared cache.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+class ClassLoadingSpaceCache extends AbstractClassLoaderCache
+{
+   private ClassLoadingSpace space;
+
+   ClassLoadingSpaceCache(ClassLoadingSpace space)
+   {
+      this.space = space;
+   }
+
+   public Loader findLoader(ImportType type, String name)
+   {
+      return null; // leave it to the CLI wrapper
+   }
+
+   public URL findResource(ImportType type, String name)
+   {
+      return null; // leave it to the CLI wrapper
+   }
+
+   public boolean isRelevant(ImportType type)
+   {
+      return true;
+   }
+
+   public String getInfo(ImportType type)
+   {
+      return space.toString();
+   }
+
+   void merge(ClassLoadingSpaceCache other)
+   {
+      super.merge(other);
+   }
+}

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -31,12 +31,7 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 
-import org.jboss.classloader.spi.ClassLoaderPolicyFactory;
-import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloader.spi.DelegateLoader;
-import org.jboss.classloader.spi.ImportType;
-import org.jboss.classloader.spi.ParentPolicy;
-import org.jboss.classloader.spi.ShutdownPolicy;
+import org.jboss.classloader.spi.*;
 import org.jboss.classloader.spi.base.BaseClassLoader;
 import org.jboss.classloader.spi.filter.ClassFilter;
 import org.jboss.classloading.plugins.metadata.PackageCapability;
@@ -312,6 +307,16 @@
    }
 
    /**
+    * Get space cache, if exists.
+    *
+    * @return the space cache
+    */
+   protected ClassLoaderCache getCache()
+   {
+      return space != null ? space.getCache() : null;
+   }
+
+   /**
     * Get the export all for the module
     * 
     * @return the export all

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java	2010-07-26 15:19:43 UTC (rev 107086)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java	2010-07-26 16:30:52 UTC (rev 107087)
@@ -145,6 +145,7 @@
       ClassLoader result = system.registerClassLoaderPolicy(domainName, parentPolicy, parentName, getPolicy());
       this.system = system;
       this.classLoader = result;
+      registerCache();
       registerModuleClassLoader(this, result);
       return result;
    }
@@ -169,6 +170,7 @@
       Loader loader = new ClassLoaderToLoaderAdapter(parent);
       ClassLoader result = registerClassLoaderPolicy(system, loader);
       this.classLoader = result;
+      registerCache();
       registerModuleClassLoader(this, result);
       return result;
    }
@@ -193,11 +195,25 @@
       ClassLoader result = system.registerClassLoaderPolicy(domainName, parentPolicy, loader, getPolicy());
       this.system = system;
       this.classLoader = result;
+      registerCache();
       registerModuleClassLoader(this, result);
       return result;
    }
 
    /**
+    * Register space cache.
+    */
+   private void registerCache()
+   {
+      ClassLoaderCache cache = getCache();
+      if (cache != null)
+      {
+         ClassLoaderPolicy policy = getPolicy();
+         policy.setCache(cache);
+      }
+   }
+
+   /**
     * Get the policy
     * 
     * @return the policy
@@ -226,6 +242,11 @@
          system.unregisterClassLoaderPolicy(policy);
       if (classLoader != null)
          unregisterModuleClassLoader(this, classLoader);
+
+      ClassLoaderCache cache = getCache();
+      if (cache != null)
+         cache.flushCaches(); // flush just in case
+
       classLoader = null;
       system = null;
       policy = null;



More information about the jboss-cvs-commits mailing list