org.springframework.remoting.rmi

## Class CodebaseAwareObjectInputStream

- java.lang.Object
- - java.io.InputStream
  - - java.io.ObjectInputStream
    - - org.springframework.core.ConfigurableObjectInputStream
      - - org.springframework.remoting.rmi.CodebaseAwareObjectInputStream

- All Implemented Interfaces:
    Closeable, DataInput, ObjectInput, ObjectStreamConstants, 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

      `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(InputStream in, ClassLoader classLoader, boolean acceptProxyClasses)` Create a new CodebaseAwareObjectInputStream for the given InputStream and codebase.
    `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

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected ClassLoader` | `getFallbackClassLoader()` Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default ClassLoader failed.
    `protected Class` | `resolveFallbackIfPossible(String className, ClassNotFoundException ex)` Resolve the given class name against a fallback class loader.

    - ### Methods inherited from class org.springframework.core.ConfigurableObjectInputStream

      `resolveClass, resolveProxyClass`

    - ### 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)`

    - #### CodebaseAwareObjectInputStream

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

  - ### Method Detail

    - #### resolveFallbackIfPossible

          protected Class resolveFallbackIfPossible(String className,
                                        ClassNotFoundException ex)
                                             throws IOException,
                                                    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:
        `IOException`
        `ClassNotFoundException`

    - #### getFallbackClassLoader

          protected ClassLoader getFallbackClassLoader()
                                                throws IOException

      Description copied from class: `ConfigurableObjectInputStream`
      Return the fallback ClassLoader to use when no ClassLoader was specified and ObjectInputStream's own default ClassLoader failed.

      The default implementation simply returns `null`.

      Overrides:
        `getFallbackClassLoader` in class `ConfigurableObjectInputStream`
      Throws:
        `IOException`