Class ReplicationStream

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

    public final class ReplicationStream
    extends java.io.ObjectInputStream
    Custom subclass of ObjectInputStream that loads from the class loader for this web application. This allows classes defined only with the web application to be found correctly.
    Author:
    Craig R. McClanahan, Bip Thelin
    • 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, SERIAL_FILTER_PERMISSION, 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 Description
      ReplicationStream​(java.io.InputStream stream, java.lang.ClassLoader[] classLoaders)
      Construct a new instance of CustomObjectInputStream
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()  
      java.lang.Class<?> findExternalClass​(java.lang.String name)  
      java.lang.Class<?> findReplicationClass​(java.lang.String name)  
      java.lang.Class<?> resolveClass​(java.io.ObjectStreamClass classDesc)
      Load the local class equivalent of the specified stream class description, by using the class loader assigned to this Context.
      java.lang.Class<?> resolveClass​(java.lang.String name)  
      protected java.lang.Class<?> resolveProxyClass​(java.lang.String[] interfaces)
      ObjectInputStream.resolveProxyClass has some funky way of using the incorrect class loader to resolve proxy classes, let's do it our way instead
      • Methods inherited from class java.io.ObjectInputStream

        available, defaultReadObject, enableResolveObject, getObjectInputFilter, read, read, readBoolean, readByte, readChar, readClassDescriptor, readDouble, readFields, readFloat, readFully, readFully, readInt, readLine, readLong, readObject, readObjectOverride, readShort, readStreamHeader, readUnshared, readUnsignedByte, readUnsignedShort, readUTF, registerValidation, resolveObject, setObjectInputFilter, skipBytes
      • Methods inherited from class java.io.InputStream

        mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, transferTo
      • 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

      • ReplicationStream

        public ReplicationStream​(java.io.InputStream stream,
                                 java.lang.ClassLoader[] classLoaders)
                          throws java.io.IOException
        Construct a new instance of CustomObjectInputStream
        Parameters:
        stream - The input stream we will read from
        classLoaders - The class loader array used to instantiate objects
        Throws:
        java.io.IOException - if an input/output error occurs
    • Method Detail

      • resolveClass

        public java.lang.Class<?> resolveClass​(java.io.ObjectStreamClass classDesc)
                                        throws java.lang.ClassNotFoundException,
                                               java.io.IOException
        Load the local class equivalent of the specified stream class description, by using the class loader assigned to this Context.
        Overrides:
        resolveClass in class java.io.ObjectInputStream
        Parameters:
        classDesc - Class description from the input stream
        Throws:
        java.lang.ClassNotFoundException - if this class cannot be found
        java.io.IOException - if an input/output error occurs
      • resolveClass

        public java.lang.Class<?> resolveClass​(java.lang.String name)
                                        throws java.lang.ClassNotFoundException
        Throws:
        java.lang.ClassNotFoundException
      • resolveProxyClass

        protected java.lang.Class<?> resolveProxyClass​(java.lang.String[] interfaces)
                                                throws java.io.IOException,
                                                       java.lang.ClassNotFoundException
        ObjectInputStream.resolveProxyClass has some funky way of using the incorrect class loader to resolve proxy classes, let's do it our way instead
        Overrides:
        resolveProxyClass in class java.io.ObjectInputStream
        Throws:
        java.io.IOException
        java.lang.ClassNotFoundException
      • findReplicationClass

        public java.lang.Class<?> findReplicationClass​(java.lang.String name)
                                                throws java.lang.ClassNotFoundException
        Throws:
        java.lang.ClassNotFoundException
      • findExternalClass

        public java.lang.Class<?> findExternalClass​(java.lang.String name)
                                             throws java.lang.ClassNotFoundException
        Throws:
        java.lang.ClassNotFoundException
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Specified by:
        close in interface java.io.ObjectInput
        Overrides:
        close in class java.io.ObjectInputStream
        Throws:
        java.io.IOException