made the generated classes visible to the classloader.

git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@36008 71c3de6d-444a-0410-be80-ed276b4c234a
This commit is contained in:
kohsuke committed 2010-10-17 07:43:09 +00:00
1 parent cfd817d21e
commit be5ab5490b
3 files changed
+35 -3

No files matched your search

+21 -1
View File
@@ -59,6 +59,7 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@@ -70,6 +71,8 @@ import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -580,13 +583,30 @@ public abstract class PluginManager extends AbstractModelObject {
/**
* {@link ClassLoader} that can see all plugins.
*/
private final class UberClassLoader extends ClassLoader {
public final class UberClassLoader extends ClassLoader {
/**
* Make generated types visible.
* Keyed by the generated class name.
*/
private ConcurrentMap<String, WeakReference<Class>> generatedClasses = new ConcurrentHashMap<String, WeakReference<Class>>();
public UberClassLoader() {
super(PluginManager.class.getClassLoader());
}
public void addNamedClass(String className, Class c) {
generatedClasses.put(className,new WeakReference<Class>(c));
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
WeakReference<Class> wc = generatedClasses.get(name);
if (wc!=null) {
Class c = wc.get();
if (c!=null) return c;
else generatedClasses.remove(name,wc);
}
// first, use the context classloader so that plugins that are loading
// can use its own classloader first.
ClassLoader cl = Thread.currentThread().getContextClassLoader();