diff options
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/Ice/InitializationData.java | 5 | ||||
-rw-r--r-- | java/src/Ice/PluginManagerI.java | 2 | ||||
-rw-r--r-- | java/src/IceBox/ServiceManagerI.java | 2 | ||||
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 8 | ||||
-rw-r--r-- | java/src/IceInternal/Instance.java | 8 | ||||
-rw-r--r-- | java/src/IceInternal/ObjectInputStream.java | 7 | ||||
-rw-r--r-- | java/src/IceInternal/ProtocolPluginFacade.java | 5 | ||||
-rw-r--r-- | java/src/IceInternal/ProtocolPluginFacadeI.java | 9 | ||||
-rw-r--r-- | java/src/IceInternal/UdpTransceiver.java | 4 | ||||
-rw-r--r-- | java/src/IceInternal/Util.java | 53 | ||||
-rw-r--r-- | java/src/IceSSL/Instance.java | 4 |
11 files changed, 79 insertions, 28 deletions
diff --git a/java/src/Ice/InitializationData.java b/java/src/Ice/InitializationData.java index 18395f54dac..7c89724bac1 100644 --- a/java/src/Ice/InitializationData.java +++ b/java/src/Ice/InitializationData.java @@ -67,4 +67,9 @@ public final class InitializationData implements Cloneable * The thread hook for the communicator. **/ public ThreadNotification threadHook; + + /** + * The custom class loader for the communicator. + **/ + public ClassLoader classLoader; } diff --git a/java/src/Ice/PluginManagerI.java b/java/src/Ice/PluginManagerI.java index dbba9f1a117..4d5bbdb9b0a 100644 --- a/java/src/Ice/PluginManagerI.java +++ b/java/src/Ice/PluginManagerI.java @@ -311,7 +311,7 @@ public final class PluginManagerI implements PluginManager PluginFactory pluginFactory = null; try { - Class<?> c = IceInternal.Util.findClass(className); + Class<?> c = IceInternal.Util.getInstance(_communicator).findClass(className); if(c == null) { PluginInitializationException e = new PluginInitializationException(); diff --git a/java/src/IceBox/ServiceManagerI.java b/java/src/IceBox/ServiceManagerI.java index 0f12e9263e3..e5571b291e7 100644 --- a/java/src/IceBox/ServiceManagerI.java +++ b/java/src/IceBox/ServiceManagerI.java @@ -481,7 +481,7 @@ public class ServiceManagerI extends _ServiceManagerDisp info.args = args; try { - Class<?> c = IceInternal.Util.findClass(className); + Class<?> c = IceInternal.Util.findClass(className, null); if(c == null) { FailureException e = new FailureException(); diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 77112002911..fbe4c8702b5 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -821,7 +821,7 @@ public class BasicStream try { InputStreamWrapper w = new InputStreamWrapper(sz, this); - ObjectInputStream in = new ObjectInputStream(w); + ObjectInputStream in = new ObjectInputStream(_instance, w); return (java.io.Serializable)in.readObject(); } catch(java.lang.Exception ex) @@ -2349,7 +2349,7 @@ public class BasicStream getConcreteClass(String className) throws LinkageError { - Class<?> c = Util.findClass(className); + Class<?> c = _instance.findClass(className); if(c != null) { @@ -2536,13 +2536,13 @@ public class BasicStream { Class<?> cls; Class<?>[] types = new Class<?>[1]; - cls = Util.findClass("org.apache.tools.bzip2.CBZip2InputStream"); + cls = IceInternal.Util.findClass("org.apache.tools.bzip2.CBZip2InputStream", null); if(cls != null) { types[0] = java.io.InputStream.class; _bzInputStreamCtor = cls.getDeclaredConstructor(types); } - cls = Util.findClass("org.apache.tools.bzip2.CBZip2OutputStream"); + cls = IceInternal.Util.findClass("org.apache.tools.bzip2.CBZip2OutputStream", null); if(cls != null) { types = new Class[2]; diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index 9d85fa10fb7..697dca8bc8a 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -524,6 +524,12 @@ public final class Instance _initData.logger = logger; } + public Class<?> + findClass(String className) + { + return Util.findClass(className, _initData.classLoader); + } + // // Only for use by Ice.CommunicatorI // @@ -1034,7 +1040,7 @@ public final class Instance Class<?> cls = null; try { - cls = Util.findClass(className); + cls = findClass(className); } catch(java.lang.Exception ex) { diff --git a/java/src/IceInternal/ObjectInputStream.java b/java/src/IceInternal/ObjectInputStream.java index e5fa8e0b45a..fc0168fadc1 100644 --- a/java/src/IceInternal/ObjectInputStream.java +++ b/java/src/IceInternal/ObjectInputStream.java @@ -18,10 +18,11 @@ package IceInternal; public class ObjectInputStream extends java.io.ObjectInputStream { public - ObjectInputStream(java.io.InputStream in) + ObjectInputStream(Instance instance, java.io.InputStream in) throws java.io.IOException { super(in); + _instance = instance; } protected Class<?> @@ -30,7 +31,7 @@ public class ObjectInputStream extends java.io.ObjectInputStream { try { - Class<?> c = Util.findClass(cls.getName()); + Class<?> c = _instance.findClass(cls.getName()); if(c != null) { return c; @@ -42,4 +43,6 @@ public class ObjectInputStream extends java.io.ObjectInputStream throw new ClassNotFoundException("unable to resolve class " + cls.getName(), ex); } } + + private Instance _instance; } diff --git a/java/src/IceInternal/ProtocolPluginFacade.java b/java/src/IceInternal/ProtocolPluginFacade.java index c591ee80046..5019b1bf426 100644 --- a/java/src/IceInternal/ProtocolPluginFacade.java +++ b/java/src/IceInternal/ProtocolPluginFacade.java @@ -47,4 +47,9 @@ public interface ProtocolPluginFacade // Get an EndpointFactory. // EndpointFactory getEndpointFactory(short type); + + // + // Look up a Java class by name. + // + Class<?> findClass(String className); } diff --git a/java/src/IceInternal/ProtocolPluginFacadeI.java b/java/src/IceInternal/ProtocolPluginFacadeI.java index c02c4282c1d..fd9768c451c 100644 --- a/java/src/IceInternal/ProtocolPluginFacadeI.java +++ b/java/src/IceInternal/ProtocolPluginFacadeI.java @@ -87,6 +87,15 @@ public class ProtocolPluginFacadeI implements ProtocolPluginFacade return _instance.endpointFactoryManager().get(type); } + // + // Look up a Java class by name. + // + public Class<?> + findClass(String className) + { + return _instance.findClass(className); + } + private Instance _instance; private Ice.Communicator _communicator; } diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java index 8a5cd336ad8..49146a1383a 100644 --- a/java/src/IceInternal/UdpTransceiver.java +++ b/java/src/IceInternal/UdpTransceiver.java @@ -457,7 +457,7 @@ final class UdpTransceiver implements Transceiver { Class<?> cls; - cls = Util.findClass("java.net.PlainDatagramSocketImpl"); + cls = Util.findClass("java.net.PlainDatagramSocketImpl", null); if(cls == null) { throw new Ice.SocketException(); @@ -474,7 +474,7 @@ final class UdpTransceiver implements Transceiver m.setAccessible(true); m.invoke(socketImpl); - cls = Util.findClass("sun.nio.ch.DatagramChannelImpl"); + cls = Util.findClass("sun.nio.ch.DatagramChannelImpl", null); if(cls == null) { throw new Ice.SocketException(); diff --git a/java/src/IceInternal/Util.java b/java/src/IceInternal/Util.java index 15c8ed0d181..a9eebf126d2 100644 --- a/java/src/IceInternal/Util.java +++ b/java/src/IceInternal/Util.java @@ -61,44 +61,66 @@ public final class Util } public static Class<?> - findClass(String className) + findClass(String className, ClassLoader cl) throws LinkageError { - Class<?> c = null; - + // + // Try to load the class using the given class loader (if any). If that fails (or + // none is provided), we try to load the class a few more ways before giving up. // // Calling Class.forName() doesn't always work. For example, if Ice.jar is installed // as an extension (in $JAVA_HOME/jre/lib/ext), calling Class.forName(name) uses the // extension class loader, which will not look in CLASSPATH for the target class. // - // First we try using the system class loader (which knows about CLASSPATH). Next we - // try the current thread's class loader, and finally we fall back to Class.forName(). + + Class<?> c = null; + + if(cl != null) + { + c = loadClass(className, cl); + } + // - try + // Try using the system class loader (which knows about CLASSPATH). + // + if(c == null) { try { - ClassLoader cl = ClassLoader.getSystemClassLoader(); + cl = ClassLoader.getSystemClassLoader(); if(cl != null) { - c = findClass(className, cl); + c = loadClass(className, cl); } } catch(SecurityException ex) { } + } - if(c == null) + // + // Try using the current thread's class loader. + // + if(c == null) + { + try { - try - { - c = findClass(className, Thread.currentThread().getContextClassLoader()); - } - catch(SecurityException ex) + cl = Thread.currentThread().getContextClassLoader(); + if(cl != null) { + c = loadClass(className, cl); } } + catch(SecurityException ex) + { + } + } + // + // Fall back to Class.forName(). + // + try + { if(c == null) { c = Class.forName(className); @@ -113,9 +135,10 @@ public final class Util } private static Class<?> - findClass(String className, ClassLoader cl) + loadClass(String className, ClassLoader cl) throws LinkageError { + assert(cl != null); try { return cl.loadClass(className); diff --git a/java/src/IceSSL/Instance.java b/java/src/IceSSL/Instance.java index 76ad215de76..ee33751ae49 100644 --- a/java/src/IceSSL/Instance.java +++ b/java/src/IceSSL/Instance.java @@ -114,7 +114,7 @@ class Instance Class<?> cls = null; try { - cls = IceInternal.Util.findClass(certVerifierClass); + cls = _facade.findClass(certVerifierClass); } catch(Throwable ex) { @@ -153,7 +153,7 @@ class Instance Class<?> cls = null; try { - cls = IceInternal.Util.findClass(passwordCallbackClass); + cls = _facade.findClass(passwordCallbackClass); } catch(Throwable ex) { |