diff options
| author | Audrius Meskauskas <audriusa@Bioinformatics.org> | 2006-02-20 08:47:00 +0000 |
|---|---|---|
| committer | Audrius Meskauskas <audriusa@Bioinformatics.org> | 2006-02-20 08:47:00 +0000 |
| commit | 95bd57d4bff6cd6ab6e16038e3cdfeacd5842ba9 (patch) | |
| tree | 437cb4a3c60168c72e33c80881e4b155822a1970 /gnu/java/rmi/server/RMIObjectInputStream.java | |
| parent | 6ae2ee00e1523e97b75e25f5eec8da841965e540 (diff) | |
| download | classpath-95bd57d4bff6cd6ab6e16038e3cdfeacd5842ba9.tar.gz | |
2006-02-20 Audrius Meskauskas <AudriusA@Bioinformatics.org>
* gnu/java/rmi/server/RMIObjectInputStream.java (resolveProxyClass):
Expect that proxy interfaces may have different class loaders.
* gnu/java/rmi/server/UnicastServerRef.java: Rewritten.
* java/rmi/registry/Registry.java,
* java/rmi/server/UnicastRemoteObject.java:
Documented about proxy stubs.
* gnu/java/rmi/server/CombinedClassLoader.java,
java/rmi/server/RemoteObjectInvocationHandler.java: New files.
* NEWS: Added entry.
Diffstat (limited to 'gnu/java/rmi/server/RMIObjectInputStream.java')
| -rw-r--r-- | gnu/java/rmi/server/RMIObjectInputStream.java | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/gnu/java/rmi/server/RMIObjectInputStream.java b/gnu/java/rmi/server/RMIObjectInputStream.java index 587d57fc7..e76535447 100644 --- a/gnu/java/rmi/server/RMIObjectInputStream.java +++ b/gnu/java/rmi/server/RMIObjectInputStream.java @@ -46,6 +46,7 @@ import java.io.ObjectStreamClass; import java.lang.reflect.Proxy; import java.net.MalformedURLException; import java.rmi.server.RMIClassLoader; +import java.util.ArrayList; public class RMIObjectInputStream extends ObjectInputStream { @@ -76,28 +77,51 @@ protected Object getAnnotation() return readObject(); } -protected Class resolveProxyClass(String intfs[]) - throws IOException, ClassNotFoundException -{ - String annotation = (String)getAnnotation(); - + + protected Class resolveProxyClass(String intfs[]) throws IOException, + ClassNotFoundException + { + String annotation = (String) getAnnotation(); + Class clss[] = new Class[intfs.length]; - if(annotation == null) - clss[0] = RMIClassLoader.loadClass(intfs[0]); - else - clss[0] = RMIClassLoader.loadClass(annotation, intfs[0]); - - //assume all interfaces can be loaded by the same classloader - ClassLoader loader = clss[0].getClassLoader(); + for (int i = 0; i < intfs.length; i++) - clss[i] = Class.forName(intfs[i], false, loader); - - try { - return Proxy.getProxyClass(loader, clss); - } catch (IllegalArgumentException e) { - throw new ClassNotFoundException(null, e); - } -} + { + 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 + { + return Proxy.getProxyClass(loader, clss); + } + catch (IllegalArgumentException e) + { + throw new ClassNotFoundException(null, e); + } + } protected Object readValue(Class valueClass) throws IOException, ClassNotFoundException { if(valueClass.isPrimitive()){ |
