The Spring Framework

org.springframework.remoting.rmi
Class CodebaseAwareObjectInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by java.io.ObjectInputStream
          extended by org.springframework.remoting.rmi.CodebaseAwareObjectInputStream
All Implemented Interfaces:
Closeable, DataInput, ObjectInput, ObjectStreamConstants

public class CodebaseAwareObjectInputStream
extends ObjectInputStream

Special ObjectInputStream subclass that falls back to a specified codebase to load classes from if not found locally. In contrast to standard RMI conventions for dynamic class download, it is the client that determines the codebase URL here, rather than the "java.rmi.server.codebase" system property on the server.

Uses the JDK's RMIClassLoader to load classes from the specified codebase. The codebase can consist of multiple URLs, separated by spaces. Note that RMIClassLoader requires a SecurityManager to be set, like when using dynamic class download with standard RMI! (See the RMI documentation for details.)

Despite residing in the RMI package, this class is not used for RmiClientInterceptor, which uses the standard RMI infrastructure instead and thus is only able to rely on RMI's standard dynamic class download via "java.rmi.server.codebase". CodebaseAwareObjectInputStream is used by HttpInvokerClientInterceptor (see the "codebaseUrl" property there).

Thanks to Lionel Mestre for suggesting the option and providing a prototype!

Since:
1.1.3
Author:
Juergen Hoeller
See Also:
RMIClassLoader, HttpInvokerClientInterceptor.setCodebaseUrl(java.lang.String)

Nested Class Summary
 
Nested classes/interfaces inherited from class java.io.ObjectInputStream
ObjectInputStream.GetField
 
Field Summary
 
Fields inherited from interface java.io.ObjectStreamConstants
baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
 
Constructor Summary
CodebaseAwareObjectInputStream(InputStream in, ClassLoader classLoader, String codebaseUrl)
          Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
CodebaseAwareObjectInputStream(InputStream in, String codebaseUrl)
          Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
 
Method Summary
protected  Class resolveClass(ObjectStreamClass classDesc)
          Overridden version delegates to super class first, falling back to the specified codebase if not found locally.
protected  Class resolveProxyClass(String[] interfaces)
          Overridden version delegates to super class first, falling back to the specified codebase if not found locally.
 
Methods inherited from class java.io.ObjectInputStream
available, close, defaultReadObject, enableResolveObject, read, read, readBoolean, readByte, readChar, readClassDescriptor, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, skipBytes
 
Methods inherited from class java.io.InputStream
mark, markSupported, read, reset, skip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface java.io.ObjectInput
read, skip
 

Constructor Detail

CodebaseAwareObjectInputStream

public CodebaseAwareObjectInputStream(InputStream in,
                                      String codebaseUrl)
                               throws IOException
Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.

Parameters:
in - the InputStream to read from
codebaseUrl - the codebase URL to load classes from if not found locally (can consist of multiple URLs, separated by spaces)
Throws:
IOException
See Also:
ObjectInputStream.ObjectInputStream(java.io.InputStream)

CodebaseAwareObjectInputStream

public CodebaseAwareObjectInputStream(InputStream in,
                                      ClassLoader classLoader,
                                      String codebaseUrl)
                               throws IOException
Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.

Parameters:
in - the InputStream to read from
classLoader - the ClassLoader to use for loading local classes (may be null to indicate RMI's default ClassLoader)
codebaseUrl - the codebase URL to load classes from if not found locally (can consist of multiple URLs, separated by spaces)
Throws:
IOException
See Also:
ObjectInputStream.ObjectInputStream(java.io.InputStream)
Method Detail

resolveClass

protected Class resolveClass(ObjectStreamClass classDesc)
                      throws IOException,
                             ClassNotFoundException
Overridden version delegates to super class first, falling back to the specified codebase if not found locally.

Overrides:
resolveClass in class ObjectInputStream
Throws:
IOException
ClassNotFoundException

resolveProxyClass

protected Class resolveProxyClass(String[] interfaces)
                           throws IOException,
                                  ClassNotFoundException
Overridden version delegates to super class first, falling back to the specified codebase if not found locally.

Overrides:
resolveProxyClass in class ObjectInputStream
Throws:
IOException
ClassNotFoundException

The Spring Framework

Copyright © 2002-2007 The Spring Framework.