[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