summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2009-06-26 14:59:11 -0700
committerMark Spruiell <mes@zeroc.com>2009-06-26 14:59:11 -0700
commit3a5f968f8487eb1f91769ab8704a9609dcbe9efe (patch)
tree469fc394f1e1e9ba0ef615c991faa524af4a21d0
parentupdating CHANGES for bug 4126 (diff)
downloadice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.bz2
ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.xz
ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.zip
more fixes for bug 4126
-rw-r--r--java/src/Ice/PluginManagerI.java15
-rw-r--r--java/src/IceBox/ServiceManagerI.java15
-rw-r--r--java/src/IceInternal/BasicStream.java84
-rw-r--r--java/src/IceInternal/InputStreamWrapper.java21
-rw-r--r--java/src/IceInternal/Instance.java6
-rw-r--r--java/src/IceInternal/ObjectInputStream.java45
-rw-r--r--java/src/IceInternal/UdpTransceiver.java21
-rw-r--r--java/src/IceInternal/Util.java64
-rw-r--r--java/src/IceSSL/Instance.java4
9 files changed, 177 insertions, 98 deletions
diff --git a/java/src/Ice/PluginManagerI.java b/java/src/Ice/PluginManagerI.java
index 15c916bcdd4..dbba9f1a117 100644
--- a/java/src/Ice/PluginManagerI.java
+++ b/java/src/Ice/PluginManagerI.java
@@ -311,7 +311,13 @@ public final class PluginManagerI implements PluginManager
PluginFactory pluginFactory = null;
try
{
- Class<?> c = Class.forName(className);
+ Class<?> c = IceInternal.Util.findClass(className);
+ if(c == null)
+ {
+ PluginInitializationException e = new PluginInitializationException();
+ e.reason = "class " + className + " not found";
+ throw e;
+ }
java.lang.Object obj = c.newInstance();
try
{
@@ -325,13 +331,6 @@ public final class PluginManagerI implements PluginManager
throw e;
}
}
- catch(ClassNotFoundException ex)
- {
- PluginInitializationException e = new PluginInitializationException();
- e.reason = "class " + className + " not found";
- e.initCause(ex);
- throw e;
- }
catch(IllegalAccessException ex)
{
PluginInitializationException e = new PluginInitializationException();
diff --git a/java/src/IceBox/ServiceManagerI.java b/java/src/IceBox/ServiceManagerI.java
index 57c5ba9cf14..0f12e9263e3 100644
--- a/java/src/IceBox/ServiceManagerI.java
+++ b/java/src/IceBox/ServiceManagerI.java
@@ -481,7 +481,13 @@ public class ServiceManagerI extends _ServiceManagerDisp
info.args = args;
try
{
- Class<?> c = Class.forName(className);
+ Class<?> c = IceInternal.Util.findClass(className);
+ if(c == null)
+ {
+ FailureException e = new FailureException();
+ e.reason = "ServiceManager: class " + className + " not found";
+ throw e;
+ }
java.lang.Object obj = c.newInstance();
try
{
@@ -494,13 +500,6 @@ public class ServiceManagerI extends _ServiceManagerDisp
throw e;
}
}
- catch(ClassNotFoundException ex)
- {
- FailureException e = new FailureException();
- e.reason = "ServiceManager: class " + className + " not found";
- e.initCause(ex);
- throw e;
- }
catch(IllegalAccessException ex)
{
FailureException e = new FailureException();
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java
index 25d40228962..57827762773 100644
--- a/java/src/IceInternal/BasicStream.java
+++ b/java/src/IceInternal/BasicStream.java
@@ -820,12 +820,14 @@ public class BasicStream
try
{
InputStreamWrapper w = new InputStreamWrapper(sz, this);
- java.io.ObjectInputStream in = new java.io.ObjectInputStream(w);
+ ObjectInputStream in = new ObjectInputStream(w);
return (java.io.Serializable)in.readObject();
}
catch(java.lang.Exception ex)
{
- throw new Ice.MarshalException("cannot deserialize object: " + ex);
+ Ice.MarshalException e = new Ice.MarshalException("cannot deserialize object");
+ e.initCause(ex);
+ throw e;
}
}
@@ -2358,58 +2360,10 @@ public class BasicStream
getConcreteClass(String className)
throws LinkageError
{
- Class<?> c = null;
-
- //
- // 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().
- //
- try
- {
- try
- {
- c = getConcreteClass(className, ClassLoader.getSystemClassLoader());
- }
- catch(SecurityException ex)
- {
- }
-
- if(c == null)
- {
- try
- {
- c = getConcreteClass(className, Thread.currentThread().getContextClassLoader());
- }
- catch(SecurityException ex)
- {
- }
- }
+ Class<?> c = Util.findClass(className);
- if(c == null)
- {
- c = Class.forName(className);
- }
- }
- catch(ClassNotFoundException ex)
+ if(c != null)
{
- // Ignore
- }
-
- return c;
- }
-
- private Class<?>
- getConcreteClass(String className, ClassLoader cl)
- throws LinkageError
- {
- try
- {
- Class<?> c = cl.loadClass(className);
-
//
// Ensure the class is instantiable. The constants are
// defined in the JVM specification (0x200 = interface,
@@ -2421,10 +2375,6 @@ public class BasicStream
return c;
}
}
- catch(ClassNotFoundException ex)
- {
- // Ignore
- }
return null;
}
@@ -2597,14 +2547,20 @@ public class BasicStream
{
Class<?> cls;
Class<?>[] types = new Class<?>[1];
- cls = Class.forName("org.apache.tools.bzip2.CBZip2InputStream");
- types[0] = java.io.InputStream.class;
- _bzInputStreamCtor = cls.getDeclaredConstructor(types);
- cls = Class.forName("org.apache.tools.bzip2.CBZip2OutputStream");
- types = new Class[2];
- types[0] = java.io.OutputStream.class;
- types[1] = Integer.TYPE;
- _bzOutputStreamCtor = cls.getDeclaredConstructor(types);
+ cls = Util.findClass("org.apache.tools.bzip2.CBZip2InputStream");
+ if(cls != null)
+ {
+ types[0] = java.io.InputStream.class;
+ _bzInputStreamCtor = cls.getDeclaredConstructor(types);
+ }
+ cls = Util.findClass("org.apache.tools.bzip2.CBZip2OutputStream");
+ if(cls != null)
+ {
+ types = new Class[2];
+ types[0] = java.io.OutputStream.class;
+ types[1] = Integer.TYPE;
+ _bzOutputStreamCtor = cls.getDeclaredConstructor(types);
+ }
}
catch(Exception ex)
{
diff --git a/java/src/IceInternal/InputStreamWrapper.java b/java/src/IceInternal/InputStreamWrapper.java
index 1188d96d165..81b202d4d21 100644
--- a/java/src/IceInternal/InputStreamWrapper.java
+++ b/java/src/IceInternal/InputStreamWrapper.java
@@ -9,8 +9,6 @@
package IceInternal;
-import java.io.*;
-
//
// Class to provide a java.io.InputStream on top of a BasicStream.
// We use this to deserialize arbitrary Java serializable classes from
@@ -28,7 +26,8 @@ public class InputStreamWrapper extends java.io.InputStream
}
public int
- read() throws IOException
+ read()
+ throws java.io.IOException
{
try
{
@@ -36,18 +35,20 @@ public class InputStreamWrapper extends java.io.InputStream
}
catch(java.lang.Exception ex)
{
- throw new IOException(ex.toString());
+ throw new java.io.IOException(ex.toString());
}
}
public int
- read(byte[] b) throws IOException
+ read(byte[] b)
+ throws java.io.IOException
{
return read(b, 0, b.length);
}
public int
- read(byte[] b, int offset, int count) throws IOException
+ read(byte[] b, int offset, int count)
+ throws java.io.IOException
{
try
{
@@ -55,7 +56,7 @@ public class InputStreamWrapper extends java.io.InputStream
}
catch(java.lang.Exception ex)
{
- throw new IOException(ex.toString());
+ throw new java.io.IOException(ex.toString());
}
return count;
}
@@ -73,7 +74,8 @@ public class InputStreamWrapper extends java.io.InputStream
}
public void
- reset() throws IOException
+ reset()
+ throws java.io.IOException
{
_s.pos(_markPos);
}
@@ -85,7 +87,8 @@ public class InputStreamWrapper extends java.io.InputStream
}
public void
- close() throws IOException
+ close()
+ throws java.io.IOException
{
}
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index dbe3ed6a9cb..bc6ec340ee1 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -1063,12 +1063,16 @@ public final class Instance
}
String module = key.substring(prefix.length());
String className = pkg + "." + module + "._Marker";
+ Class<?> cls = null;
try
{
- Class.forName(className);
+ cls = Util.findClass(className);
}
catch(java.lang.Exception ex)
{
+ }
+ if(cls == null)
+ {
_initData.logger.warning("unable to validate package: " + key + "=" + pkg);
}
}
diff --git a/java/src/IceInternal/ObjectInputStream.java b/java/src/IceInternal/ObjectInputStream.java
new file mode 100644
index 00000000000..e5fa8e0b45a
--- /dev/null
+++ b/java/src/IceInternal/ObjectInputStream.java
@@ -0,0 +1,45 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package IceInternal;
+
+//
+// We need to override the resolveClass method of ObjectInputStream so
+// that we can use the same class-lookup mechanism as elsewhere in the
+// Ice run time.
+//
+
+public class ObjectInputStream extends java.io.ObjectInputStream
+{
+ public
+ ObjectInputStream(java.io.InputStream in)
+ throws java.io.IOException
+ {
+ super(in);
+ }
+
+ protected Class<?>
+ resolveClass(java.io.ObjectStreamClass cls)
+ throws java.io.IOException, ClassNotFoundException
+ {
+ try
+ {
+ Class<?> c = Util.findClass(cls.getName());
+ if(c != null)
+ {
+ return c;
+ }
+ throw new ClassNotFoundException("unable to resolve class" + cls.getName());
+ }
+ catch(Exception ex)
+ {
+ throw new ClassNotFoundException("unable to resolve class " + cls.getName(), ex);
+ }
+ }
+}
diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java
index e0076beed55..1dec5fde575 100644
--- a/java/src/IceInternal/UdpTransceiver.java
+++ b/java/src/IceInternal/UdpTransceiver.java
@@ -455,8 +455,14 @@ final class UdpTransceiver implements Transceiver
{
try
{
- java.lang.reflect.Constructor<?> c =
- Class.forName("java.net.PlainDatagramSocketImpl").getDeclaredConstructor((Class<?>[])null);
+ Class<?> cls;
+
+ cls = Util.findClass("java.net.PlainDatagramSocketImpl");
+ if(cls == null)
+ {
+ throw new Ice.SocketException();
+ }
+ java.lang.reflect.Constructor<?> c = cls.getDeclaredConstructor((Class<?>[])null);
c.setAccessible(true);
java.net.DatagramSocketImpl socketImpl = (java.net.DatagramSocketImpl)c.newInstance((Object[])null);
@@ -464,13 +470,16 @@ final class UdpTransceiver implements Transceiver
// We have to invoke the protected create() method on the PlainDatagramSocketImpl object so
// that this hack works properly when IPv6 is enabled on Windows.
//
- java.lang.reflect.Method m =
- Class.forName("java.net.PlainDatagramSocketImpl").getDeclaredMethod("create", (Class<?>[])null);
+ java.lang.reflect.Method m = cls.getDeclaredMethod("create", (Class<?>[])null);
m.setAccessible(true);
m.invoke(socketImpl);
- java.lang.reflect.Field channelFd =
- Class.forName("sun.nio.ch.DatagramChannelImpl").getDeclaredField("fd");
+ cls = Util.findClass("sun.nio.ch.DatagramChannelImpl");
+ if(cls == null)
+ {
+ throw new Ice.SocketException();
+ }
+ java.lang.reflect.Field channelFd = cls.getDeclaredField("fd");
channelFd.setAccessible(true);
java.lang.reflect.Field socketFd = java.net.DatagramSocketImpl.class.getDeclaredField("fd");
diff --git a/java/src/IceInternal/Util.java b/java/src/IceInternal/Util.java
index 2a1f70ce69c..b55c23fdca5 100644
--- a/java/src/IceInternal/Util.java
+++ b/java/src/IceInternal/Util.java
@@ -59,4 +59,68 @@ public final class Util
return stream;
}
+
+ public static Class<?>
+ findClass(String className)
+ throws LinkageError
+ {
+ Class<?> c = null;
+
+ //
+ // 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().
+ //
+ try
+ {
+ try
+ {
+ c = findClass(className, ClassLoader.getSystemClassLoader());
+ }
+ catch(SecurityException ex)
+ {
+ }
+
+ if(c == null)
+ {
+ try
+ {
+ c = findClass(className, Thread.currentThread().getContextClassLoader());
+ }
+ catch(SecurityException ex)
+ {
+ }
+ }
+
+ if(c == null)
+ {
+ c = Class.forName(className);
+ }
+ }
+ catch(ClassNotFoundException ex)
+ {
+ // Ignore
+ }
+
+ return c;
+ }
+
+ private static Class<?>
+ findClass(String className, ClassLoader cl)
+ throws LinkageError
+ {
+ try
+ {
+ return cl.loadClass(className);
+ }
+ catch(ClassNotFoundException ex)
+ {
+ // Ignore
+ }
+
+ return null;
+ }
}
diff --git a/java/src/IceSSL/Instance.java b/java/src/IceSSL/Instance.java
index d91c25735e9..e86fce50900 100644
--- a/java/src/IceSSL/Instance.java
+++ b/java/src/IceSSL/Instance.java
@@ -109,7 +109,7 @@ class Instance
Class<?> cls = null;
try
{
- cls = Class.forName(certVerifierClass);
+ cls = IceInternal.Util.findClass(certVerifierClass);
}
catch(Throwable ex)
{
@@ -148,7 +148,7 @@ class Instance
Class<?> cls = null;
try
{
- cls = Class.forName(passwordCallbackClass);
+ cls = IceInternal.Util.findClass(passwordCallbackClass);
}
catch(Throwable ex)
{