T
- the type of message that will be written by instances of
this class; see createOutputStream(long,
ContainerResponse)
public abstract class AbstractContainerRequestHandlingResponseWriter<T> extends ChannelInboundHandlerAdapter implements ContainerResponseWriter
ChannelInboundHandlerAdapter
that is also a
ContainerResponseWriter
that processes incoming ContainerRequest
events, such as those dispatched by an AbstractContainerRequestDecoder
, by supplying them to the ApplicationHandler.handle(ContainerRequest)
method.
Instances of this class are in charge of properly invoking
ApplicationHandler.handle(ContainerRequest)
, thus adapting
Jersey to Netty's constraints and vice versa.
ContainerResponseWriter.TimeoutHandler
ChannelHandler.Sharable
Modifier | Constructor and Description |
---|---|
protected |
AbstractContainerRequestHandlingResponseWriter(ApplicationHandler applicationHandler)
Creates a new
AbstractContainerRequestHandlingResponseWriter . |
protected |
AbstractContainerRequestHandlingResponseWriter(ApplicationHandler applicationHandler,
int flushThreshold,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator byteBufCreator)
Creates a new
AbstractContainerRequestHandlingResponseWriter . |
protected |
AbstractContainerRequestHandlingResponseWriter(Supplier<? extends ApplicationHandler> applicationHandlerSupplier)
Creates a new
AbstractContainerRequestHandlingResponseWriter . |
protected |
AbstractContainerRequestHandlingResponseWriter(Supplier<? extends ApplicationHandler> applicationHandlerSupplier,
int flushThreshold,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator byteBufCreator)
Creates a new
AbstractContainerRequestHandlingResponseWriter . |
Modifier and Type | Method and Description |
---|---|
void |
channelActive(ChannelHandlerContext channelHandlerContext)
Overrides
ChannelInboundHandlerAdapter.channelActive(ChannelHandlerContext)
to ensure that a channel read is performed one way or another. |
void |
channelRead(ChannelHandlerContext channelHandlerContext,
Object message)
If the supplied
message is a ContainerRequest
then this method will install
itself as that request's ContainerResponseWriter
and will invoke ApplicationHandler.handle(ContainerRequest) . |
void |
channelReadComplete(ChannelHandlerContext channelHandlerContext)
Overrides the
ChannelInboundHandlerAdapter.channelReadComplete(ChannelHandlerContext)
method to call channelHandlerContext.flush() before calling the superclass
implementation. |
void |
commit()
Invoked by Jersey when a
ContainerRequest has been fully
handled
successfully. |
protected static void |
copyHeaders(Map<? extends String,? extends List<String>> headersSource,
UnaryOperator<String> keyTransformer,
BiConsumer<? super String,? super List<String>> headersTarget)
A utility function that copies entries from a source
Map
by passing each entry to the supplied BiConsumer ,
transforming the keys beforehand using the supplied UnaryOperator and that is intended in this framework to be used
to copy HTTP or HTTP/2 headers to and from the proper places. |
protected abstract AbstractChannelOutboundInvokingOutputStream<? extends T> |
createOutputStream(long contentLength,
ContainerResponse containerResponse)
Creates and returns a new
AbstractChannelOutboundInvokingOutputStream , or returns null if it is determined that no AbstractChannelOutboundInvokingOutputStream is required given
the supplied contentLength parameter value. |
boolean |
enableResponseBuffering()
Returns
true when invoked to indicate that buffering of
entity content is supported and can be configured to be on or
off. |
void |
failure(Throwable failureCause)
Handles any failure case encountered by the logic encapsulated by
the
ApplicationHandler.handle(ContainerRequest) method. |
protected AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator |
getByteBufCreator()
Returns a
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator that may be used to create the
AbstractChannelOutboundInvokingOutputStream
implementation that must be returned by an implementation of the
createOutputStream(long, ContainerResponse) method. |
protected ChannelHandlerContext |
getChannelHandlerContext()
|
protected int |
getFlushThreshold()
Returns the minimum number of bytes that an
AbstractChannelOutboundInvokingOutputStream returned by the
createOutputStream(long, ContainerResponse) method must
write before an automatic flush may
take place. |
void |
setSuspendTimeout(long timeout,
TimeUnit timeUnit) |
boolean |
suspend(long timeout,
TimeUnit timeUnit,
ContainerResponseWriter.TimeoutHandler timeoutHandler) |
protected abstract void |
writeFailureMessage(Throwable failureCause)
Writes an appropriate message, possibly using the
ChannelHandlerContext to do so. |
OutputStream |
writeResponseStatusAndHeaders(long contentLength,
ContainerResponse containerResponse)
Writes the status and headers portion of the response present in
the supplied
ContainerResponse by calling the writeStatusAndHeaders(long, ContainerResponse) method, and, if
the supplied contentLength is not 0L and that
method returns true indicating that output will be
forthcoming, returns the result of invoking createOutputStream(long, ContainerResponse) . |
protected abstract boolean |
writeStatusAndHeaders(long contentLength,
ContainerResponse containerResponse)
Writes the status and headers portion of the response present in
the supplied
ContainerResponse and returns true
if further output is forthcoming. |
channelInactive, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught, userEventTriggered
ensureNotSharable, handlerAdded, handlerRemoved, isSharable
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
handlerAdded, handlerRemoved
protected AbstractContainerRequestHandlingResponseWriter(ApplicationHandler applicationHandler)
AbstractContainerRequestHandlingResponseWriter
.applicationHandler
- an ApplicationHandler
representing a Jakarta RESTful Web Services application
whose ApplicationHandler.handle(ContainerRequest)
method
will serve as the bridge between Netty and Jersey; may be null
somewhat pathologically but normally is notAbstractContainerRequestHandlingResponseWriter(Supplier,
int,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator)
,
ApplicationHandler
,
ApplicationHandler.handle(ContainerRequest)
,
channelRead(ChannelHandlerContext, Object)
protected AbstractContainerRequestHandlingResponseWriter(ApplicationHandler applicationHandler, int flushThreshold, AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator byteBufCreator)
AbstractContainerRequestHandlingResponseWriter
.applicationHandler
- an ApplicationHandler
representing a Jakarta RESTful Web Services application
whose ApplicationHandler.handle(ContainerRequest)
method
will serve as the bridge between Netty and Jersey; may be null
somewhat pathologically but normally is notflushThreshold
- the minimum number of bytes that an AbstractByteBufBackedChannelOutboundInvokingOutputStream
returned by the createOutputStream(long,
ContainerResponse)
method must write before an automatic
flush may take place; if less than 0
0
will be
used instead; if Integer#MAX_VALUE
then it is suggested
that no automatic flushing will occurbyteBufCreator
- a AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator
that may be used
(but does not have to be used) by the implementation of the
createOutputStream(long, ContainerResponse)
method; may
be null
AbstractContainerRequestHandlingResponseWriter(Supplier,
int,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator)
,
ApplicationHandler
,
ApplicationHandler.handle(ContainerRequest)
,
channelRead(ChannelHandlerContext, Object)
,
getFlushThreshold()
,
getByteBufCreator()
,
createOutputStream(long, ContainerResponse)
protected AbstractContainerRequestHandlingResponseWriter(Supplier<? extends ApplicationHandler> applicationHandlerSupplier)
AbstractContainerRequestHandlingResponseWriter
.applicationHandlerSupplier
- a Supplier
of an ApplicationHandler
representing a Jakarta RESTful Web Services application
whose ApplicationHandler.handle(ContainerRequest)
method
will serve as the bridge between Netty and Jersey; may be null
somewhat pathologically but normally is notAbstractContainerRequestHandlingResponseWriter(Supplier,
int,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator)
,
ApplicationHandler
,
ApplicationHandler.handle(ContainerRequest)
,
channelRead(ChannelHandlerContext, Object)
protected AbstractContainerRequestHandlingResponseWriter(Supplier<? extends ApplicationHandler> applicationHandlerSupplier, int flushThreshold, AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator byteBufCreator)
AbstractContainerRequestHandlingResponseWriter
.applicationHandlerSupplier
- a Supplier
of an ApplicationHandler
representing a Jakarta RESTful Web Services application
whose ApplicationHandler.handle(ContainerRequest)
method
will serve as the bridge between Netty and Jersey; may be null
somewhat pathologically but normally is notflushThreshold
- the minimum number of bytes that an AbstractByteBufBackedChannelOutboundInvokingOutputStream
returned by the createOutputStream(long,
ContainerResponse)
method must write before an automatic
flush may take place; if less than 0
0
will be
used instead; if Integer#MAX_VALUE
then it is suggested
that no automatic flushing will occurbyteBufCreator
- a AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator
that may be used
(but does not have to be used) by the implementation of the
createOutputStream(long, ContainerResponse)
method; may
be null
ApplicationHandler
,
ApplicationHandler.handle(ContainerRequest)
,
channelRead(ChannelHandlerContext, Object)
,
getFlushThreshold()
,
getByteBufCreator()
,
createOutputStream(long, ContainerResponse)
public final void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception
ChannelInboundHandlerAdapter.channelActive(ChannelHandlerContext)
to ensure that a channel read is performed one way or another.
If autoread is active,
then the superclass' version of this method is executed with no
changes. If autoread is
inactive, then a call is made to ChannelHandlerContext.read()
.
channelActive
in interface ChannelInboundHandler
channelActive
in class ChannelInboundHandlerAdapter
channelHandlerContext
- the ChannelHandlerContext
in
effect; must not be null
NullPointerException
- if channelHandlerContext
is null
Exception
- if an error occursChannelConfig.isAutoRead()
,
Channel.read()
,
ChannelHandlerContext.read()
,
channelRead(ChannelHandlerContext, Object)
public final void channelRead(ChannelHandlerContext channelHandlerContext, Object message) throws Exception
message
is a ContainerRequest
then this method will install
itself as that request's ContainerResponseWriter
and will invoke ApplicationHandler.handle(ContainerRequest)
.
In all other cases this method will simply call ChannelInboundHandlerAdapter.channelRead(ChannelHandlerContext,
Object)
with the supplied message
.
channelRead
in interface ChannelInboundHandler
channelRead
in class ChannelInboundHandlerAdapter
channelHandlerContext
- the ChannelHandlerContext
in
effect; must not be null
message
- the incoming message, or event; may be null
NullPointerException
- if channelHandlerContext
is null
, or if the Supplier
of ApplicationHandler
instances supplied at construction time
returns null
Exception
- if message
is not an instance of
ContainerRequest
and ChannelInboundHandlerAdapter.channelRead(ChannelHandlerContext,
Object)
throws an Exception
ApplicationHandler.handle(ContainerRequest)
,
ContainerResponseWriter
,
ContainerRequest.setWriter(ContainerResponseWriter)
public final void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception
ChannelInboundHandlerAdapter.channelReadComplete(ChannelHandlerContext)
method to call channelHandlerContext.flush()
before calling the superclass
implementation.channelReadComplete
in interface ChannelInboundHandler
channelReadComplete
in class ChannelInboundHandlerAdapter
channelHandlerContext
- the ChannelHandlerContext
in
effect; must not be null
NullPointerException
- if channelHandlerContext
is null
Exception
- if ChannelInboundHandlerAdapter.channelReadComplete(ChannelHandlerContext)
throws an Exception
protected final ChannelHandlerContext getChannelHandlerContext()
ChannelHandlerContext
in effect, or null
if there is no such ChannelHandlerContext
.
This method may return null
.
ChannelHandlerContext
in effect, or null
if there is no such ChannelHandlerContext
public final boolean enableResponseBuffering()
true
when invoked to indicate that buffering of
entity content is supported and can be configured to be on or
off.
Note that the return value of this method is a default value
indicating that the concept of response buffering is
enabled. The actual configuration of response buffering
is a property of the application. Specifically, an application's
response buffering policy can be configured: if the application's
configuration sets the jersey.config.contentLength.buffer
property to a positive int
, then buffering will occur, and if the application's
configuration sets the jersey.config.contentLength.buffer
property to a negative int
, then buffering will not occur. If the application's
configuration does nothing in this regard, response buffering
will be enabled with a default buffer size of 8192
.
(If, instead, this method had been written to return false
, then no matter what configuration settings an application
might specify in the realm of response buffering settings,
response buffering of any kind would never be possible.)
enableResponseBuffering
in interface ContainerResponseWriter
true
when invoked; never false
ContainerResponseWriter.enableResponseBuffering()
,
ServerRuntime.java
,
ContainerResponse.java
,
OutboundMessageContext.java
public final OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerResponse containerResponse)
ContainerResponse
by calling the writeStatusAndHeaders(long, ContainerResponse)
method, and, if
the supplied contentLength
is not 0L
and that
method returns true
indicating that output will be
forthcoming, returns the result of invoking createOutputStream(long, ContainerResponse)
.
In all other cases, this method returns null
.
writeResponseStatusAndHeaders
in interface ContainerResponseWriter
contentLength
- the content length as determined by the
logic encapsulated by the ApplicationHandler.handle(ContainerRequest)
method; a value less
than zero indicates an unknown content lengthcontainerResponse
- the ContainerResponse
containing
status and headers information; must not be null
OutputStream
returned by the createOutputStream(long, ContainerResponse)
method, or null
NullPointerException
- if containerResponse
is
null
writeStatusAndHeaders(long, ContainerResponse)
,
createOutputStream(long, ContainerResponse)
,
ApplicationHandler.handle(ContainerRequest)
protected abstract boolean writeStatusAndHeaders(long contentLength, ContainerResponse containerResponse)
ContainerResponse
and returns true
if further output is forthcoming.
Implementations of this method must not call the writeResponseStatusAndHeaders(long, ContainerResponse)
method
or an infinite loop may result.
Implementations of this method must not call the createOutputStream(long, ContainerResponse)
method or undefined
behavior may result.
contentLength
- the content length as determined by the
logic encapsulated by the ApplicationHandler.handle(ContainerRequest)
method; a value less
than zero indicates an unknown content lengthcontainerResponse
- the ContainerResponse
containing
status and headers information; must not be null
true
if the createOutputStream(long,
ContainerResponse)
method should be invoked, i.e. if
further output is forthcomingNullPointerException
- if containerResponse
is
null
ApplicationHandler.handle(ContainerRequest)
,
createOutputStream(long, ContainerResponse)
protected abstract AbstractChannelOutboundInvokingOutputStream<? extends T> createOutputStream(long contentLength, ContainerResponse containerResponse)
AbstractChannelOutboundInvokingOutputStream
, or returns null
if it is determined that no AbstractChannelOutboundInvokingOutputStream
is required given
the supplied contentLength
parameter value.
Implementations of this method may return null
.
contentLength
- the content length as determined by the
logic encapsulated by the ApplicationHandler.handle(ContainerRequest)
method; a value less
than zero indicates an unknown content length; must not be equal
to 0L
containerResponse
- the ContainerResponse
containing
status and headers information; must not be null
; may be
(and often is) ignored by implementationsAbstractChannelOutboundInvokingOutputStream
implementation, or null
NullPointerException
- if containerResponse
is
null
IllegalArgumentException
- if contentLength
is
equal to 0L
protected final int getFlushThreshold()
AbstractChannelOutboundInvokingOutputStream
returned by the
createOutputStream(long, ContainerResponse)
method must
write before an automatic flush may
take place.
Note: Implementations of the createOutputStream(long, ContainerResponse)
method may choose
to ignore the return value of this method. It is supplied for
convenience only for use by implementors of the createOutputStream(long, ContainerResponse)
method.
AbstractChannelOutboundInvokingOutputStream
returned by the
createOutputStream(long, ContainerResponse)
method must
write before an automatic flush may
take place; always 0L
or a positive int
; if
0
it is suggested that automatic flushing occur after
every write; if Integer#MAX_VALUE
it is suggested that no
automatic flushing should occurcreateOutputStream(long, ContainerResponse)
,
AbstractContainerRequestHandlingResponseWriter(ApplicationHandler,
int,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator)
,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.AbstractByteBufBackedChannelOutboundInvokingOutputStream(ChannelOutboundInvoker,
int, boolean, ByteBufCreator)
protected final AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator getByteBufCreator()
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator
that may be used to create the
AbstractChannelOutboundInvokingOutputStream
implementation that must be returned by an implementation of the
createOutputStream(long, ContainerResponse)
method.
This method may return null
.
Note: Implementations of the createOutputStream(long, ContainerResponse)
method may choose
to ignore the return value of this method. It is supplied for
convenience only for use by implementors of the createOutputStream(long, ContainerResponse)
method.
AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator
, or null
createOutputStream(long, ContainerResponse)
,
AbstractContainerRequestHandlingResponseWriter(ApplicationHandler,
int, AbstractByteBufBackedChannelOutboundInvokingOutputStream.ByteBufCreator)
,
AbstractByteBufBackedChannelOutboundInvokingOutputStream.AbstractByteBufBackedChannelOutboundInvokingOutputStream(ChannelOutboundInvoker,
int, boolean, ByteBufCreator)
public void commit()
ContainerRequest
has been fully
handled
successfully.
Either commit()
or failure(Throwable)
will
be called by Jersey as the logically final operation in the logic
encapsulated by the ApplicationHandler.handle(ContainerRequest)
method, but not
both.
This implementation does nothing.
commit
in interface ContainerResponseWriter
ContainerResponseWriter.commit()
,
failure(Throwable)
public final boolean suspend(long timeout, TimeUnit timeUnit, ContainerResponseWriter.TimeoutHandler timeoutHandler)
suspend
in interface ContainerResponseWriter
public final void setSuspendTimeout(long timeout, TimeUnit timeUnit)
setSuspendTimeout
in interface ContainerResponseWriter
public final void failure(Throwable failureCause)
ApplicationHandler.handle(ContainerRequest)
method.
Either commit()
or failure(Throwable)
will
be called by Jersey as the logically final operation in the logic
encapsulated by the ApplicationHandler.handle(ContainerRequest)
method, but not
both.
This method calls the writeFailureMessage(Throwable)
method and takes great care to ensure that any Throwable
s
encountered along the way are properly recorded and suppressed.
This implementation never returns. A ContainerException
is always thrown by this method.
failure
in interface ContainerResponseWriter
failureCause
- the Throwable
encountered by the
ApplicationHandler.handle(ContainerRequest)
method; may
be null
ContainerException
- when this method is invoked; it
will have the supplied failureCause
as its causecommit()
,
ContainerResponseWriter.failure(Throwable)
protected abstract void writeFailureMessage(Throwable failureCause)
ChannelHandlerContext
to do so.
Implementations of this method must not call the failure(Throwable)
method or an infinite loop may result.
failureCause
- the Throwable
responsible for this
method's invocation; may be null
in pathological casesprotected static final void copyHeaders(Map<? extends String,? extends List<String>> headersSource, UnaryOperator<String> keyTransformer, BiConsumer<? super String,? super List<String>> headersTarget)
Map
by passing each entry to the supplied BiConsumer
,
transforming the keys beforehand using the supplied UnaryOperator
and that is intended in this framework to be used
to copy HTTP or HTTP/2 headers to and from the proper places.headersSource
- the source of the headers to copy; may be
null
in which case no action will be takenkeyTransformer
- a UnaryOperator
that transforms a
header name; if null
then the return value of UnaryOperator.identity()
will be used insteadheadersTarget
- where the headers will be copied to; may be
null
in which case no action will be takenCopyright © 2019–2020, microBean™. All rights reserved.