Class CommittingOutputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable

    public final class CommittingOutputStream
    extends java.io.OutputStream
    A committing output stream with optional serialized entity buffering functionality which allows measuring of the entity size.

    When buffering functionality is enabled the output stream buffers the written bytes into an internal buffer of a configurable size. After the last written byte the commit() method is expected to be called to notify a callback with an actual measured entity size. If the entity is too large to fit into the internal buffer and the buffer exceeds before the commit() is called then the stream is automatically committed and the callback is called with parameter size value of -1.

    Callback method also returns the output stream in which the output will be written. The committing output stream must be initialized with the callback using setStreamProvider(org.glassfish.jersey.message.internal.OutboundMessageContext.StreamProvider) before first byte is written.

    The buffering is by default disabled and can be enabled by calling enableBuffering() or enableBuffering(int) before writing the first byte into this output stream. The former method enables buffering with the default size 8192 bytes specified in DEFAULT_BUFFER_SIZE.

    • Field Detail

      • LOGGER

        private static final java.util.logging.Logger LOGGER
      • DEFAULT_BUFFER_SIZE

        public static final int DEFAULT_BUFFER_SIZE
        Default size of the buffer which will be used if no user defined size is specified.
        See Also:
        Constant Field Values
      • adaptedOutput

        private java.io.OutputStream adaptedOutput
        Adapted output stream.
      • bufferSize

        private int bufferSize
        Internal buffer size.
      • buffer

        private java.io.ByteArrayOutputStream buffer
        Entity buffer.
      • directWrite

        private boolean directWrite
        When true, the data are written directly to output stream and not to the buffer.
      • isCommitted

        private boolean isCommitted
        When true, the stream is already committed (redirected to adaptedOutput).
      • isClosed

        private boolean isClosed
        When true, the stream is already closed.
      • STREAM_PROVIDER_NULL

        private static final java.lang.String STREAM_PROVIDER_NULL
      • COMMITTING_STREAM_BUFFERING_ILLEGAL_STATE

        private static final java.lang.String COMMITTING_STREAM_BUFFERING_ILLEGAL_STATE
    • Constructor Detail

      • CommittingOutputStream

        public CommittingOutputStream()
        Creates new committing output stream. The returned stream instance still needs to be initialized before writing first bytes.
    • Method Detail

      • setStreamProvider

        public void setStreamProvider​(OutboundMessageContext.StreamProvider streamProvider)
        Set the buffering output stream provider. If the committing output stream works in buffering mode this method must be called before first bytes are written into this stream.
        Parameters:
        streamProvider - non-null stream provider callback.
      • enableBuffering

        public void enableBuffering​(int bufferSize)
        Enable buffering of the serialized entity.
        Parameters:
        bufferSize - size of the buffer. When the value is less or equal to zero the buffering will be disabled and -1 will be passed to the callback.
      • enableBuffering

        void enableBuffering()
        Enable buffering of the serialized entity with the default buffer size .
      • isCommitted

        public boolean isCommitted()
        Determine whether the stream was already committed or not.
        Returns:
        true if this stream was already committed, false otherwise.
      • commitStream

        private void commitStream()
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • commitStream

        private void commitStream​(int currentSize)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • write

        public void write​(byte[] b)
                   throws java.io.IOException
        Overrides:
        write in class java.io.OutputStream
        Throws:
        java.io.IOException
      • write

        public void write​(byte[] b,
                          int off,
                          int len)
                   throws java.io.IOException
        Overrides:
        write in class java.io.OutputStream
        Throws:
        java.io.IOException
      • write

        public void write​(int b)
                   throws java.io.IOException
        Specified by:
        write in class java.io.OutputStream
        Throws:
        java.io.IOException
      • commit

        public void commit()
                    throws java.io.IOException
        Commit the output stream.
        Throws:
        java.io.IOException - when underlying stream returned from the callback method throws the io exception.
      • close

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

        public boolean isClosed()
        Check if the committing output stream has been closed already.
        Returns:
        true if the stream has been closed, false otherwise.
      • flush

        public void flush()
                   throws java.io.IOException
        Specified by:
        flush in interface java.io.Flushable
        Overrides:
        flush in class java.io.OutputStream
        Throws:
        java.io.IOException
      • flushBuffer

        private void flushBuffer​(boolean endOfStream)
                          throws java.io.IOException
        Throws:
        java.io.IOException