This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.commons.classloader-0.9.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-classloader.git
commit 0891b6877e340936dc4c2d0aab11cccf485675a1 Author: Carsten Ziegeler <[email protected]> AuthorDate: Wed Aug 5 15:07:52 2009 +0000 Don't cache classes in the facade, cache them in the package admin class loader. git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/classloader@801254 13f79535-47bb-0310-9956-ffa450edef68 --- .../classloader/impl/ClassLoaderFacade.java | 19 ---------- .../classloader/impl/PackageAdminClassLoader.java | 40 +++++++++++++++++++++- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java b/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java index d080d67..5b4cd68 100644 --- a/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java +++ b/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java @@ -21,8 +21,6 @@ package org.apache.sling.commons.classloader.impl; import java.io.IOException; import java.net.URL; import java.util.Enumeration; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** @@ -37,12 +35,6 @@ public class ClassLoaderFacade extends ClassLoader { private final DynamicClassLoaderManagerImpl manager; - /** A cache for resolved classes. */ - private Map<String, Class<?>> classCache = new ConcurrentHashMap<String, Class<?>>(); - - /** A cache for resolved urls. */ - private Map<String, URL> urlCache = new ConcurrentHashMap<String, URL>(); - public ClassLoaderFacade(final DynamicClassLoaderManagerImpl manager) { this.manager = manager; } @@ -54,16 +46,11 @@ public class ClassLoaderFacade extends ClassLoader { if ( !this.manager.isActive() ) { throw new RuntimeException("Dynamic class loader has already been deactivated."); } - final URL cachedURL = urlCache.get(name); - if ( cachedURL != null ) { - return cachedURL; - } final ClassLoader[] loaders = manager.getDynamicClassLoaders(); for(final ClassLoader cl : loaders) { if ( cl != null ) { final URL u = cl.getResource(name); if ( u != null ) { - urlCache.put(name, u); return u; } } @@ -97,19 +84,13 @@ public class ClassLoaderFacade extends ClassLoader { if ( !this.manager.isActive() ) { throw new RuntimeException("Dynamic class loader has already been deactivated."); } - final Class<?> cachedClass = this.classCache.get(name); - if ( cachedClass != null ) { - return cachedClass; - } final ClassLoader[] loaders = manager.getDynamicClassLoaders(); for(final ClassLoader cl : loaders) { if ( cl != null ) { try { final Class<?> c = cl.loadClass(name); - this.classCache.put(name, c); return c; } catch (Exception cnfe) { - cnfe.printStackTrace(); // we just ignore this and try the next class loader } } diff --git a/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java b/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java index f27bc8d..d5a3077 100644 --- a/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java +++ b/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java @@ -20,7 +20,12 @@ package org.apache.sling.commons.classloader.impl; import java.io.IOException; import java.net.URL; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.osgi.framework.Bundle; import org.osgi.service.packageadmin.ExportedPackage; @@ -38,6 +43,15 @@ class PackageAdminClassLoader extends ClassLoader { /** The manager factory. */ private final DynamicClassLoaderManagerFactory factory; + /** A cache for resolved classes. */ + private Map<String, Class<?>> classCache = new ConcurrentHashMap<String, Class<?>>(); + + /** Negative class cache. */ + private Set<String> negativeClassCache = Collections.synchronizedSet(new HashSet<String>()); + + /** A cache for resolved urls. */ + private Map<String, URL> urlCache = new ConcurrentHashMap<String, URL>(); + public PackageAdminClassLoader(final PackageAdmin pckAdmin, final ClassLoader parent, final DynamicClassLoaderManagerFactory factory) { @@ -101,6 +115,10 @@ class PackageAdminClassLoader extends ClassLoader { * @see java.lang.ClassLoader#findResource(java.lang.String) */ public URL findResource(String name) { + final URL cachedURL = urlCache.get(name); + if ( cachedURL != null ) { + return cachedURL; + } URL url = super.findResource(name); if ( url == null ) { final Bundle bundle = this.findBundleForPackage(getPackageFromResource(name)); @@ -108,6 +126,7 @@ class PackageAdminClassLoader extends ClassLoader { url = bundle.getResource(name); if ( url != null ) { this.factory.addUsedBundle(bundle); + urlCache.put(name, url); } } } @@ -118,6 +137,10 @@ class PackageAdminClassLoader extends ClassLoader { * @see java.lang.ClassLoader#findClass(java.lang.String) */ public Class<?> findClass(String name) throws ClassNotFoundException { + final Class<?> cachedClass = this.classCache.get(name); + if ( cachedClass != null ) { + return cachedClass; + } Class<?> clazz = null; try { clazz = super.findClass(name); @@ -131,6 +154,7 @@ class PackageAdminClassLoader extends ClassLoader { if ( clazz == null ) { throw new ClassNotFoundException("Class not found " + name); } + this.classCache.put(name, clazz); return clazz; } @@ -138,19 +162,33 @@ class PackageAdminClassLoader extends ClassLoader { * @see java.lang.ClassLoader#loadClass(java.lang.String, boolean) */ protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { + final Class<?> cachedClass = this.classCache.get(name); + if ( cachedClass != null ) { + return cachedClass; + } + if ( negativeClassCache.contains(name) ) { + throw new ClassNotFoundException("Class not found " + name); + } Class<?> clazz = null; try { clazz = super.loadClass(name, resolve); } catch (ClassNotFoundException cnfe) { final Bundle bundle = this.findBundleForPackage(getPackageFromClassName(name)); if ( bundle != null ) { - clazz = bundle.loadClass(name); + try { + clazz = bundle.loadClass(name); + } catch (ClassNotFoundException inner) { + negativeClassCache.add(name); + throw inner; + } this.factory.addUsedBundle(bundle); } } if ( clazz == null ) { + negativeClassCache.add(name); throw new ClassNotFoundException("Class not found " + name); } + this.classCache.put(name, clazz); return clazz; } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
