Class CommittingOutputStream

java.lang.Object
java.io.OutputStream
org.glassfish.jersey.message.internal.CommittingOutputStream
All Implemented Interfaces:
Closeable, Flushable, AutoCloseable

public final class CommittingOutputStream extends 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 Details

    • LOGGER

      private static final Logger LOGGER
    • NULL_STREAM_PROVIDER

      private static final OutboundMessageContext.StreamProvider NULL_STREAM_PROVIDER
      Null stream provider.
    • 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:
    • adaptedOutput

      private OutputStream adaptedOutput
      Adapted output stream.
    • streamProvider

      private OutboundMessageContext.StreamProvider streamProvider
      Buffering stream provider.
    • bufferSize

      private int bufferSize
      Internal buffer size.
    • buffer

      private 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 String STREAM_PROVIDER_NULL
    • COMMITTING_STREAM_BUFFERING_ILLEGAL_STATE

      private static final String COMMITTING_STREAM_BUFFERING_ILLEGAL_STATE
  • Constructor Details

    • CommittingOutputStream

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

    • 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 IOException
      Throws:
      IOException
    • commitStream

      private void commitStream(int currentSize) throws IOException
      Throws:
      IOException
    • write

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

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

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

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

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Overrides:
      close in class OutputStream
      Throws:
      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 IOException
      Specified by:
      flush in interface Flushable
      Overrides:
      flush in class OutputStream
      Throws:
      IOException
    • flushBuffer

      private void flushBuffer(boolean endOfStream) throws IOException
      Throws:
      IOException