From 95bd57d4bff6cd6ab6e16038e3cdfeacd5842ba9 Mon Sep 17 00:00:00 2001 From: Audrius Meskauskas Date: Mon, 20 Feb 2006 08:47:00 +0000 Subject: 2006-02-20 Audrius Meskauskas * 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. --- gnu/java/rmi/server/RMIObjectInputStream.java | 64 ++++++++++++++++++--------- 1 file changed, 44 insertions(+), 20 deletions(-) (limited to 'gnu/java/rmi/server/RMIObjectInputStream.java') 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()){ -- cgit v1.2.1