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]>.

Reply via email to