Top Description Fields Constructors Methods
org.eclipse.jetty.io.content

public abstract Class ContentSourceTransformer

extends Object
implements Source
Class Inheritance
All Implemented Interfaces
org.eclipse.jetty.io.Content.Source
Imports
java.util.Objects, org.eclipse.jetty.io.Content, org.eclipse.jetty.util.thread.SerializedInvoker

This abstract Content.Source wraps another Content.Source and implementers need only to implement the transform(Content.Chunk) method, which is used to transform Content.Chunk read from the wrapped source.

The demand(Runnable) conversation is passed directly to the wrapped Content.Source, which means that transformations that may fully consume bytes read can result in a null return from Content.Source#read() even after a callback to the demand Runnable (as per spurious invocation in Content.Source#demand(Runnable).

Field Summary

Modifier and TypeField and Description
private volatile Runnable
private final SerializedInvoker
private volatile boolean
private Content.Chunk
private final Content.Source
private Content.Chunk

Constructor Summary

AccessConstructor and Description
protected
protected

Method Summary

Modifier and TypeMethod and Description
public void
demand(Runnable
the demand callback to invoke where there is a content chunk available
demandCallback
)

Implements org.eclipse.jetty.io.Content.Source.demand.

Demands to invoke the given demand callback parameter when a chunk of content is available.

public void
fail(Throwable
the cause of the failure
failure
)

Implements org.eclipse.jetty.io.Content.Source.fail.

Fails this content source with a last failure chunk, failing and discarding accumulated content chunks that were not yet read.

protected Content.Source
private void
private Content.Chunk
process(Content.Chunk rawChunk)

public Content.Chunk
read()

Implements org.eclipse.jetty.io.Content.Source.read.

Reads a chunk of content.

private void
runDemandCallback(Runnable demandCallback)

protected abstract Content.Chunk

Returns:

a transformed chunk or null
transform
(Content.Chunk
a chunk read from the wrapped Content.Source
inputChunk
)

Transforms the input chunk parameter into an output chunk.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

demandCallbackback to summary
private volatile Runnable demandCallback
invokerback to summary
private final SerializedInvoker invoker
needsRawReadback to summary
private volatile boolean needsRawRead
rawChunkback to summary
private Content.Chunk rawChunk
rawSourceback to summary
private final Content.Source rawSource
transformedChunkback to summary
private Content.Chunk transformedChunk

Constructor Detail

ContentSourceTransformerback to summary
protected ContentSourceTransformer(Content.Source rawSource)
ContentSourceTransformerback to summary
protected ContentSourceTransformer(Content.Source rawSource, SerializedInvoker invoker)

Method Detail

demandback to summary
public void demand(Runnable demandCallback)

Implements org.eclipse.jetty.io.Content.Source.demand.

Doc from org.eclipse.jetty.io.Content.Source.demand.

Demands to invoke the given demand callback parameter when a chunk of content is available.

See how to use this method idiomatically.

Implementations guarantee that calls to this method are safely reentrant so that stack overflows are avoided in the case of mutual recursion between the execution of the Runnable callback and a call to this method. Invocations of the passed Runnable are serialized and a callback for demand call is not invoked until any previous demand callback has returned. Thus the Runnable should not block waiting for a callback of a future demand call.

The demand callback may be invoked spuriously: a subsequent call to read() may return null.

Calling this method establishes a pending demand, which is fulfilled when the demand callback is invoked.

Calling this method when there is already a pending demand results in an IllegalStateException to be thrown.

If the invocation of the demand callback throws an exception, then fail(Throwable) is called.

Parameters
demandCallback:Runnable

the demand callback to invoke where there is a content chunk available

Annotations
@Override
failback to summary
public void fail(Throwable failure)

Implements org.eclipse.jetty.io.Content.Source.fail.

Doc from org.eclipse.jetty.io.Content.Source.fail.

Fails this content source with a last failure chunk, failing and discarding accumulated content chunks that were not yet read.

The failure may be notified to the content reader at a later time, when the content reader reads a content chunk, via a Chunk instance with a non null Chunk#getFailure().

If read() has returned a last chunk, this is a no operation.

Typical failure: the content being aborted by user code, or idle timeouts.

If this method has already been called, then it is a no operation.

Parameters
failure:Throwable

the cause of the failure

Annotations
@Override
getContentSourceback to summary
protected Content.Source getContentSource()
invokeDemandCallbackback to summary
private void invokeDemandCallback()
processback to summary
private Content.Chunk process(Content.Chunk rawChunk)
readback to summary
public Content.Chunk read()

Implements org.eclipse.jetty.io.Content.Source.read.

Doc from org.eclipse.jetty.io.Content.Source.read.

Reads a chunk of content.

See how to use this method idiomatically.

The returned chunk could be:

  • null, to signal that there isn't a chunk of content available
  • an Chunk instance with non null Chunk#getFailure(), to signal that there was a failure trying to produce a chunk of content, or that the content production has been failed externally
  • a Chunk instance, containing the chunk of content.

Once a read returns an Chunk instance with non-null Chunk#getFailure() then if the failure is last further reads will continue to return the same failure chunk instance, otherwise further read() operations may return different non-failure chunks.

Once a read returns a last chunk, further reads will continue to return a last chunk (although the instance may be different).

The content reader code must ultimately arrange for a call to Chunk#release() on the returned Chunk.

Additionally, prior to the ultimate call to Chunk#release(), the reader code may make additional calls to Chunk#retain(), that must ultimately be matched by a correspondent number of calls to Chunk#release().

Concurrent reads from different threads are not recommended, as they are inherently in a race condition.

Reads performed outside the invocation context of a demand callback are allowed. However, reads performed with a pending demand are inherently in a race condition (the thread that reads with the thread that invokes the demand callback).

Returns:Content.Chunk

a chunk of content, possibly a failure instance, or null

Annotations
@Override
runDemandCallbackback to summary
private void runDemandCallback(Runnable demandCallback)
transformback to summary
protected abstract Content.Chunk transform(Content.Chunk inputChunk)

Transforms the input chunk parameter into an output chunk.

When this method produces a non-null, non-last chunk, it is subsequently invoked with a null input chunk to try to produce more output chunks from the previous input chunk. For example, a single compressed input chunk may be transformed into multiple uncompressed output chunks.

The input chunk is released as soon as this method returns, so implementations that must hold onto the input chunk must arrange to call Content.Chunk#retain() and its correspondent Content.Chunk#release().

Implementations should return an Content.Chunk with non-null Content.Chunk#getFailure() in case of transformation errors.

Exceptions thrown by this method are equivalent to returning an error chunk.

Implementations of this method may return:

  • null, if more input chunks are necessary to produce an output chunk
  • the inputChunk itself, typically in case of non-null Content.Chunk#getFailure(), or when no transformation is required
  • a new Content.Chunk derived from inputChunk.
Parameters
inputChunk:Content.Chunk

a chunk read from the wrapped Content.Source

Returns:Content.Chunk

a transformed chunk or null