You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/08/05 17:07:52 UTC
svn commit: r801254 - in
/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl:
ClassLoaderFacade.java PackageAdminClassLoader.java
Author: cziegeler
Date: Wed Aug 5 15:07:52 2009
New Revision: 801254
URL: http://svn.apache.org/viewvc?rev=801254&view=rev
Log:
Don't cache classes in the facade, cache them in the package admin class loader.
Modified:
sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java
sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java
Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java?rev=801254&r1=801253&r2=801254&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java Wed Aug 5 15:07:52 2009
@@ -21,8 +21,6 @@
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 @@
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 @@
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 @@
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
}
}
Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java?rev=801254&r1=801253&r2=801254&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java Wed Aug 5 15:07:52 2009
@@ -20,7 +20,12 @@
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 @@
/** 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 @@
* @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 @@
url = bundle.getResource(name);
if ( url != null ) {
this.factory.addUsedBundle(bundle);
+ urlCache.put(name, url);
}
}
}
@@ -118,6 +137,10 @@
* @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 @@
if ( clazz == null ) {
throw new ClassNotFoundException("Class not found " + name);
}
+ this.classCache.put(name, clazz);
return clazz;
}
@@ -138,19 +162,33 @@
* @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;
}
}