diff options
author | Jeroen Frijters <jeroen@sumatra.nl> | 2006-08-17 07:43:55 +0000 |
---|---|---|
committer | Jeroen Frijters <jeroen@sumatra.nl> | 2006-08-17 07:43:55 +0000 |
commit | 8aca770e8d35da673d8eb49f99ed69d9e4077aca (patch) | |
tree | 3c06eb2998e4ce5973b4ba6643c0028eff458389 /gnu/java | |
parent | 675e898a0056c41ccfc58afb5a2fa8eb6f680745 (diff) | |
download | classpath-8aca770e8d35da673d8eb49f99ed69d9e4077aca.tar.gz |
2006-08-17 Jeroen Frijters <jeroen@frijters.net>
* gnu/java/rmi/server/RMIClassLoaderImpl.java
(loadClass): Rewritten to use getClassLoader.
(loadProxyClass): Implemented.
(getClassLoader): Fixed support for null or empty codebase.
* gnu/java/rmi/server/RMIObjectInputStream.java
(resolveClass): Use user class loader as default class loader.
(resolveProxyClass): Delegate to RMIClassLoader.loadProxyClass.
* gnu/javax/rmi/CORBA/UtilDelegateImpl.java
(loadClass): Simplified and use user class loader instead of
context class loader as default.
* java/io/ObjectInputStream.java
(currentLoader): Use VMStackWalker.firstNonNullClassLoader().
* vm/reference/gnu/classpath/VMStackWalker.java
(firstNonNullClassLoader): New method.
* vm/reference/java/io/VMObjectInputStream.java
(loaderAction, currentClassLoader): Removed.
Diffstat (limited to 'gnu/java')
-rw-r--r-- | gnu/java/rmi/server/RMIClassLoaderImpl.java | 67 | ||||
-rw-r--r-- | gnu/java/rmi/server/RMIObjectInputStream.java | 61 |
2 files changed, 54 insertions, 74 deletions
diff --git a/gnu/java/rmi/server/RMIClassLoaderImpl.java b/gnu/java/rmi/server/RMIClassLoaderImpl.java index 2e1e78055..82f0ff69e 100644 --- a/gnu/java/rmi/server/RMIClassLoaderImpl.java +++ b/gnu/java/rmi/server/RMIClassLoaderImpl.java @@ -1,5 +1,5 @@ /* RMIClassLoaderImpl.java -- FIXME: briefly describe file purpose - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,6 +38,7 @@ exception statement from your version. */ package gnu.java.rmi.server; +import java.lang.reflect.Proxy; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; @@ -186,6 +187,7 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi { defaultClassLoader = new MyClassLoader (new URL[] { defaultCodebase }, null, defaultAnnotation); + // XXX using getContextClassLoader here *cannot* be right cacheLoaders.put (new CacheKey (defaultAnnotation, Thread.currentThread().getContextClassLoader()), defaultClassLoader); @@ -216,47 +218,53 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi ClassLoader defaultLoader) throws MalformedURLException, ClassNotFoundException { - ClassLoader loader; - if (defaultLoader == null) - loader = Thread.currentThread().getContextClassLoader(); - else - loader = defaultLoader; - - //try context class loader first try { - return Class.forName(name, false, loader); + if (defaultLoader != null) + return Class.forName(name, false, defaultLoader); } catch (ClassNotFoundException e) { - // class not found in the local classpath + } + + return Class.forName(name, false, getClassLoader(codeBase)); + } + + public Class loadProxyClass(String codeBase, String[] interfaces, + ClassLoader defaultLoader) + throws MalformedURLException, ClassNotFoundException + { + Class clss[] = new Class[interfaces.length]; + + for (int i = 0; i < interfaces.length; i++) + { + clss[i] = loadClass(codeBase, interfaces[i], defaultLoader); } - if (codeBase.length() == 0) //=="" + // Chain all class loaders (they may differ). + ArrayList loaders = new ArrayList(clss.length); + ClassLoader loader = null; + for (int i = 0; i < clss.length; i++) { - loader = defaultClassLoader; + loader = clss[i].getClassLoader(); + if (! loaders.contains(loader)) + { + loaders.add(0, loader); + } } - else + if (loaders.size() > 1) { - loader = getClassLoader(codeBase); + loader = new CombinedClassLoader(loaders); } - if (loader == null) + try { - //do not throw NullPointerException - throw new ClassNotFoundException ("Could not find class (" + name + - ") at codebase (" + codeBase + ")"); + return Proxy.getProxyClass(loader, clss); + } + catch (IllegalArgumentException e) + { + throw new ClassNotFoundException(null, e); } - - return Class.forName(name, false, loader); - } - - public Class loadProxyClass(String codeBase, String[] interfaces, - ClassLoader defaultLoader) - throws MalformedURLException, ClassNotFoundException - { - // FIXME: Implement this. - return null; } /** @@ -272,6 +280,9 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi public ClassLoader getClassLoader(String codebase) throws MalformedURLException { + if (codebase == null || codebase.length() == 0) + return Thread.currentThread().getContextClassLoader(); + ClassLoader loader; CacheKey loaderKey = new CacheKey (codebase, Thread.currentThread().getContextClassLoader()); diff --git a/gnu/java/rmi/server/RMIObjectInputStream.java b/gnu/java/rmi/server/RMIObjectInputStream.java index e76535447..75f4f1202 100644 --- a/gnu/java/rmi/server/RMIObjectInputStream.java +++ b/gnu/java/rmi/server/RMIObjectInputStream.java @@ -1,5 +1,5 @@ /* RMIObjectInputStream.java -- - Copyright (c) 1996, 1997, 1998, 1999, 2002, 2004 + Copyright (c) 1996, 1997, 1998, 1999, 2002, 2004, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,11 +39,11 @@ exception statement from your version. */ package gnu.java.rmi.server; +import gnu.classpath.VMStackWalker; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; -import java.lang.reflect.Proxy; import java.net.MalformedURLException; import java.rmi.server.RMIClassLoader; import java.util.ArrayList; @@ -57,16 +57,14 @@ public RMIObjectInputStream(InputStream strm) throws IOException { } protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { - String annotation = (String)getAnnotation(); - try { - if(annotation == null) - return (RMIClassLoader.loadClass(desc.getName())); - else - return (RMIClassLoader.loadClass(annotation, desc.getName())); + return RMIClassLoader.loadClass( + (String)getAnnotation(), + desc.getName(), + VMStackWalker.firstNonNullClassLoader()); } - catch (MalformedURLException _) { - throw new ClassNotFoundException(desc.getName()); + catch (MalformedURLException x) { + throw new ClassNotFoundException(desc.getName(), x); } } @@ -81,45 +79,16 @@ protected Object getAnnotation() protected Class resolveProxyClass(String intfs[]) throws IOException, ClassNotFoundException { - String annotation = (String) getAnnotation(); - - Class clss[] = new Class[intfs.length]; - - for (int i = 0; i < intfs.length; i++) - { - if (annotation == null) - clss[i] = RMIClassLoader.loadClass(intfs[i]); - else - clss[i] = RMIClassLoader.loadClass(annotation, intfs[i]); - } - - ClassLoader loader; - - if (clss.length > 0) - { - // Chain all class loaders (they may differ). - ArrayList loaders = new ArrayList(intfs.length); - ClassLoader cx; - for (int i = 0; i < clss.length; i++) - { - cx = clss[i].getClassLoader(); - if (!loaders.contains(cx)) - { - loaders.add(0, cx); - } - } - loader = new CombinedClassLoader(loaders); - } - else - loader = ClassLoader.getSystemClassLoader(); - - try + try { - return Proxy.getProxyClass(loader, clss); + return RMIClassLoader.loadProxyClass( + (String)getAnnotation(), + intfs, + VMStackWalker.firstNonNullClassLoader()); } - catch (IllegalArgumentException e) + catch (MalformedURLException x) { - throw new ClassNotFoundException(null, e); + throw new ClassNotFoundException(null, x); } } |