org.springframework.remoting.rmi

Class CodebaseAwareObjectInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.DataInput, java.io.ObjectInput, java.io.ObjectStreamConstants, java.lang.AutoCloseable


    public class CodebaseAwareObjectInputStream
    extends ConfigurableObjectInputStream
    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, RemoteInvocationSerializingExporter.createObjectInputStream(java.io.InputStream), HttpInvokerClientInterceptor.setCodebaseUrl(java.lang.String)
    • Nested Class Summary

      • Nested classes/interfaces inherited from class java.io.ObjectInputStream

        java.io.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

      Constructors 
      Constructor and Description
      CodebaseAwareObjectInputStream(java.io.InputStream in, java.lang.ClassLoader classLoader, boolean acceptProxyClasses)
      Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
      CodebaseAwareObjectInputStream(java.io.InputStream in, java.lang.ClassLoader classLoader, java.lang.String codebaseUrl)
      Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
      CodebaseAwareObjectInputStream(java.io.InputStream in, java.lang.String codebaseUrl)
      Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method and Description
      protected java.lang.ClassLoader getFallbackClassLoader()
      Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default class loader failed.
      protected java.lang.Class<?> resolveFallbackIfPossible(java.lang.String className, java.lang.ClassNotFoundException ex)
      Resolve the given class name against a fallback class loader.
      • 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(java.io.InputStream in,
                                              java.lang.String codebaseUrl)
                                       throws java.io.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:
        java.io.IOException
        See Also:
        ObjectInputStream.ObjectInputStream(java.io.InputStream)
      • CodebaseAwareObjectInputStream

        public CodebaseAwareObjectInputStream(java.io.InputStream in,
                                              @Nullable
                                              java.lang.ClassLoader classLoader,
                                              java.lang.String codebaseUrl)
                                       throws java.io.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:
        java.io.IOException
        See Also:
        ObjectInputStream.ObjectInputStream(java.io.InputStream)
      • CodebaseAwareObjectInputStream

        public CodebaseAwareObjectInputStream(java.io.InputStream in,
                                              @Nullable
                                              java.lang.ClassLoader classLoader,
                                              boolean acceptProxyClasses)
                                       throws java.io.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)
        acceptProxyClasses - whether to accept deserialization of proxy classes (may be deactivated as a security measure)
        Throws:
        java.io.IOException
        See Also:
        ObjectInputStream.ObjectInputStream(java.io.InputStream)
    • Method Detail

      • resolveFallbackIfPossible

        protected java.lang.Class<?> resolveFallbackIfPossible(java.lang.String className,
                                                               java.lang.ClassNotFoundException ex)
                                                        throws java.io.IOException,
                                                               java.lang.ClassNotFoundException
        Description copied from class: ConfigurableObjectInputStream
        Resolve the given class name against a fallback class loader.

        The default implementation simply rethrows the original exception, since there is no fallback available.

        Overrides:
        resolveFallbackIfPossible in class ConfigurableObjectInputStream
        Parameters:
        className - the class name to resolve
        ex - the original exception thrown when attempting to load the class
        Returns:
        the newly resolved class (never null)
        Throws:
        java.io.IOException
        java.lang.ClassNotFoundException
      • getFallbackClassLoader

        protected java.lang.ClassLoader getFallbackClassLoader()
                                                        throws java.io.IOException
        Description copied from class: ConfigurableObjectInputStream
        Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default class loader failed.

        The default implementation simply returns null, indicating that no specific fallback is available.

        Overrides:
        getFallbackClassLoader in class ConfigurableObjectInputStream
        Throws:
        java.io.IOException