This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new 1333ff1 REST refactoring.
1333ff1 is described below
commit 1333ff1681a18c4839e01cb5fdcfaed51671f891
Author: JamesBognar <[email protected]>
AuthorDate: Tue Mar 9 18:41:02 2021 -0500
REST refactoring.
---
.../java/org/apache/juneau/reflect/ClassInfo.java | 3 +
...ResponseHandler.java => ResponseProcessor.java} | 41 ++++-----
...HandlerList.java => ResponseProcessorList.java} | 16 ++--
.../main/java/org/apache/juneau/rest/RestCall.java | 11 ++-
.../java/org/apache/juneau/rest/RestContext.java | 102 +++++++++++----------
.../org/apache/juneau/rest/RestContextBuilder.java | 32 ++++---
.../java/org/apache/juneau/rest/RestResponse.java | 34 +++----
.../org/apache/juneau/rest/annotation/Rest.java | 8 +-
.../juneau/rest/annotation/RestAnnotation.java | 18 ++--
.../DefaultProcessor.java} | 8 +-
.../HttpEntityProcessor.java} | 35 +++----
.../HttpResourceProcessor.java} | 38 ++++----
.../InputStreamProcessor.java} | 17 ++--
.../ReaderProcessor.java} | 14 +--
.../{reshandlers => processors}/package-info.java | 4 +-
.../rest/annotation/RestAnnotation_Test.java | 10 +-
16 files changed, 199 insertions(+), 192 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index 0d46965..6f220b6 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -55,6 +55,9 @@ import org.apache.juneau.internal.*;
*/
public final class ClassInfo {
+ /** Reusable ClassInfo for Object class. */
+ public static final ClassInfo OBJECT = ClassInfo.of(Object.class);
+
private final Type t;
final Class<?> c;
private final boolean isParameterizedType;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
similarity index 70%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
index bac7865..a6599de 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
@@ -18,42 +18,39 @@ import javax.servlet.http.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.reshandlers.*;
+import org.apache.juneau.rest.processors.*;
/**
- * Defines the interface for handlers that convert POJOs to appropriate HTTP
responses.
+ * Defines the interface for processors that convert POJOs to appropriate HTTP
responses.
*
* <p>
- * The REST Server API uses the concept of registered response handlers for
converting objects returned by REST
+ * The REST Server API uses the concept of registered response processors for
converting objects returned by REST
* methods or set through {@link RestResponse#setOutput(Object)} into
appropriate HTTP responses.
*
* <p>
- * Response handlers can be associated with REST resources via the following:
+ * Response processors can be associated with REST resources via the following:
* <ul>
- * <li class='ja'>{@link Rest#responseHandlers}
- * <li class='jm'>{@link RestContextBuilder#responseHandlers(Class...)}
- * <li class='jm'>{@link
RestContextBuilder#responseHandlers(ResponseHandler...)}
+ * <li class='ja'>{@link Rest#responseProcessors}
+ * <li class='jm'>{@link RestContextBuilder#responseProcessors(Class...)}
+ * <li class='jm'>{@link
RestContextBuilder#responseProcessors(ResponseProcessor...)}
* </ul>
*
* <p>
- * By default, REST resources are registered with the following response
handlers:
+ * By default, REST resources are registered with the following response
processors:
* <ul class='spaced-list'>
- * <li class='jc'>
- * {@link DefaultHandler} - Serializes POJOs using the Juneau
serializer API.
- * <li class='jc'>
- * {@link ReaderHandler} - Pipes the output of {@link Reader
Readers} to the response writer
- * ({@link RestResponse#getWriter()}).
- * <li class='jc'>
- * {@link InputStreamHandler} - Pipes the output of {@link
InputStream InputStreams} to the response output
- * stream ({@link RestResponse#getOutputStream()}).
+ * <li class='jc'>{@link ReaderProcessor}
+ * <li class='jc'>{@link InputStreamProcessor}
+ * <li class='jc'>{@link HttpResourceProcessor}
+ * <li class='jc'>{@link HttpEntityProcessor}
+ * <li class='jc'>{@link DefaultProcessor}
* </ul>
*
* <p>
- * Response handlers can be used to process POJOs that cannot normally be
handled through Juneau serializers, or
- * because it's simply easier to define response handlers for special cases.
+ * Response processors can be used to process POJOs that cannot normally be
handled through Juneau serializers, or
+ * because it's simply easier to define response processors for special cases.
*
* <p>
- * The following example shows how to create a response handler to handle
special <c>Foo</c> objects outside the
+ * The following example shows how to create a response processor to handle
special <c>Foo</c> objects outside the
* normal Juneau architecture.
* <p class='bcode w800'>
* <ja>@Rest</ja>(
@@ -87,14 +84,14 @@ import org.apache.juneau.rest.reshandlers.*;
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*/
-public interface ResponseHandler {
+public interface ResponseProcessor {
/**
* Process this response if possible.
* This method should return <jk>false</jk> if it wasn't able to
process the response.
*
* @param call The HTTP call.
- * @return true If this handler handled the response.
+ * @return true If this processor handled the response.
* @throws IOException
* If low-level exception occurred on output stream.
* Results in a {@link
HttpServletResponse#SC_INTERNAL_SERVER_ERROR} error.
@@ -102,5 +99,5 @@ public interface ResponseHandler {
* If some other exception occurred.
* Can be used to provide an appropriate HTTP response code and
message.
*/
- boolean handle(RestCall call) throws IOException, BasicHttpException;
+ boolean process(RestCall call) throws IOException, BasicHttpException;
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandlerList.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
similarity index 80%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandlerList.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
index 27d97df..8c4dacd 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseHandlerList.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessorList.java
@@ -15,9 +15,9 @@ package org.apache.juneau.rest;
import org.apache.juneau.collections.*;
/**
- * A list of {@Link ResponseHandler} objects.
+ * A list of {@Link ResponseProcessor} objects.
*/
-public class ResponseHandlerList extends AList<ResponseHandler> {
+public class ResponseProcessorList extends AList<ResponseProcessor> {
private static final long serialVersionUID = 1L;
@@ -27,16 +27,16 @@ public class ResponseHandlerList extends
AList<ResponseHandler> {
* @return An empty list.
*/
@SuppressWarnings("unchecked")
- public static ResponseHandlerList create() {
- return new ResponseHandlerList();
+ public static ResponseProcessorList create() {
+ return new ResponseProcessorList();
}
/**
- * Returns the contents of this list as a {@link ResponseHandler} array.
+ * Returns the contents of this list as a {@link ResponseProcessor}
array.
*
- * @return The contents of this list as a {@link ResponseHandler} array.
+ * @return The contents of this list as a {@link ResponseProcessor}
array.
*/
- public ResponseHandler[] asArray() {
- return asArrayOf(ResponseHandler.class);
+ public ResponseProcessor[] asArray() {
+ return asArrayOf(ResponseProcessor.class);
}
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
index 53445ae..b7c2698 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCall.java
@@ -23,6 +23,7 @@ import javax.servlet.http.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.httppart.bean.*;
+import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.logging.*;
import org.apache.juneau.rest.util.*;
@@ -271,7 +272,6 @@ public class RestCall {
return Optional.ofNullable(rreq).orElseThrow(()->new
InternalServerError("RestRequest object has not yet been created."));
}
-
/**
* Returns the REST response of this REST call.
*
@@ -282,6 +282,15 @@ public class RestCall {
}
/**
+ * Returns information about the output POJO.
+ *
+ * @return The metadata on the object returned by the REST Java method,
or {@link ClassInfo#OBJECT} if nothing was set.
+ */
+ public ClassInfo getOutputInfo() {
+ return
getRestResponse().getOutputInfo().orElse(ClassInfo.OBJECT);
+ }
+
+ /**
* Returns the method context of this call.
*
* @return The method context of this call.
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 3174887..a62c935 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -63,9 +63,9 @@ import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.args.*;
import org.apache.juneau.rest.converters.*;
import org.apache.juneau.rest.logging.*;
+import org.apache.juneau.rest.processors.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.response.*;
-import org.apache.juneau.rest.reshandlers.*;
import org.apache.juneau.rest.util.*;
import org.apache.juneau.rest.vars.*;
import org.apache.juneau.serializer.*;
@@ -2267,46 +2267,48 @@ public class RestContext extends BeanContext {
public static final String REST_renderResponseStackTraces = PREFIX +
".renderResponseStackTraces.b";
/**
- * Configuration property: Response handlers.
+ * Configuration property: Response processors.
*
* <h5 class='section'>Property:</h5>
* <ul class='spaced-list'>
- * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_responseHandlers REST_responseHandlers}
- * <li><b>Name:</b> <js>"RestContext.responseHandlers.lo"</js>
- * <li><b>Data type:</b> <c>List<{@link
org.apache.juneau.rest.ResponseHandler}|Class<{@link
org.apache.juneau.rest.ResponseHandler}>></c>
+ * <li><b>ID:</b> {@link
org.apache.juneau.rest.RestContext#REST_responseProcessors
REST_responseHandlers}
+ * <li><b>Name:</b> <js>"RestContext.responseProcessors.lo"</js>
+ * <li><b>Data type:</b> <c>List<{@link
org.apache.juneau.rest.ResponseProcessor}|Class<{@link
org.apache.juneau.rest.ResponseProcessor}>></c>
* <li><b>Default:</b> empty list
* <li><b>Session property:</b> <jk>false</jk>
* <li><b>Annotations:</b>
* <ul>
- * <li class='ja'>{@link
org.apache.juneau.rest.annotation.Rest#responseHandlers()}
+ * <li class='ja'>{@link
org.apache.juneau.rest.annotation.Rest#responseProcessors()}
* </ul>
* <li><b>Methods:</b>
* <ul>
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#responseHandlers(Class...)}
- * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#responseHandlers(ResponseHandler...)}
+ * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#responseProcessors(Class...)}
+ * <li class='jm'>{@link
org.apache.juneau.rest.RestContextBuilder#responseProcessors(ResponseProcessor...)}
* </ul>
* </ul>
*
* <h5 class='section'>Description:</h5>
* <p>
- * Specifies a list of {@link ResponseHandler} classes that know how to
convert POJOs returned by REST methods or
+ * Specifies a list of {@link ResponseProcessor} classes that know how
to convert POJOs returned by REST methods or
* set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
*
* <p>
* By default, the following response handlers are provided
out-of-the-box:
* <ul>
- * <li class='jc'>{@link ReaderHandler} - {@link Reader} objects.
- * <li class='jc'>{@link InputStreamHandler} - {@link InputStream}
objects.
- * <li class='jc'>{@link DefaultHandler} - All other POJOs.
+ * <li class='jc'>{@link ReaderProcessor}
+ * <li class='jc'>{@link InputStreamProcessor}
+ * <li class='jc'>{@link HttpResourceProcessor}
+ * <li class='jc'>{@link HttpEntityProcessor}
+ * <li class='jc'>{@link DefaultProcessor}
* </ul>
*
* <h5 class='section'>Example:</h5>
* <p class='bcode w800'>
- * <jc>// Our custom response handler for MySpecialObject objects.
</jc>
- * <jk>public class</jk> MyResponseHandler <jk>implements</jk>
ResponseHandler {
+ * <jc>// Our custom response processor for MySpecialObject
objects. </jc>
+ * <jk>public class</jk> MyResponseProcessor <jk>implements</jk>
ResponseProcessor {
*
* <ja>@Override</ja>
- * <jk>public boolean</jk> handle(RestRequest
<jv>req</jv>, RestResponse <jv>res</jv>, Object <jv>output</jv>)
<jk>throws</jk> IOException, RestException {
+ * <jk>public boolean</jk> process(RestRequest
<jv>req</jv>, RestResponse <jv>res</jv>, Object <jv>output</jv>)
<jk>throws</jk> IOException, RestException {
* <jk>if</jk> (output <jk>instanceof</jk>
MySpecialObject) {
* <jk>try</jk> (Writer <jv>w</jv> =
<jv>res</jv>.getNegotiatedWriter()) {
* <jc>//Pipe it to the writer
ourselves.</jc>
@@ -2318,23 +2320,23 @@ public class RestContext extends BeanContext {
* }
*
* <jc>// Option #1 - Defined via annotation.</jc>
- *
<ja>@Rest</ja>(responseHandlers=MyResponseHandler.<jk>class</jk>)
+ *
<ja>@Rest</ja>(responseProcessors=MyResponseProcessor.<jk>class</jk>)
* <jk>public class</jk> MyResource {
*
* <jc>// Option #2 - Defined via builder passed in
through resource constructor.</jc>
* <jk>public</jk> MyResource(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
*
* <jc>// Using method on builder.</jc>
- *
<jv>builder</jv>.responseHandlers(MyResponseHandler.<jk>class</jk>);
+ *
<jv>builder</jv>.responseProcessors(MyResponseProcessor.<jk>class</jk>);
*
* <jc>// Same, but using property.</jc>
- *
<jv>builder</jv>.addTo(<jsf>REST_responseHandlers</jsf>,
MyResponseHandler.<jk>class</jk>);
+ *
<jv>builder</jv>.addTo(<jsf>REST_responseProcessors</jsf>,
MyResponseProcessor.<jk>class</jk>);
* }
*
* <jc>// Option #3 - Defined via builder passed in
through init method.</jc>
* <ja>@RestHook</ja>(<jsf>INIT</jsf>)
* <jk>public void</jk> init(RestContextBuilder
<jv>builder</jv>) <jk>throws</jk> Exception {
- *
<jv>builder</jv>.responseHandlers(MyResponseHandler.<jk>class</jk>);
+ *
<jv>builder</jv>.responseProcessors(MyResponseProcessors.<jk>class</jk>);
* }
*
* <ja>@RestGet</ja>(...)
@@ -2347,7 +2349,7 @@ public class RestContext extends BeanContext {
*
* <ul class='notes'>
* <li>
- * Response handlers resolvers are always inherited from
ascendant resources.
+ * Response processors are always inherited from ascendant
resources.
* <li>
* When defined as a class, the implementation must have
one of the following constructors:
* <ul>
@@ -2360,7 +2362,7 @@ public class RestContext extends BeanContext {
* Inner classes of the REST resource class are allowed.
* </ul>
*/
- public static final String REST_responseHandlers = PREFIX +
".responseHandlers.lo";
+ public static final String REST_responseProcessors = PREFIX +
".responseProcessors.lo";
/**
* Configuration property: REST children class.
@@ -3367,7 +3369,7 @@ public class RestContext extends BeanContext {
produces;
private final HeaderList defaultRequestHeaders, defaultResponseHeaders;
private final List<NamedAttribute> defaultRequestAttributes;
- private final List<ResponseHandler> responseHandlers;
+ private final List<ResponseProcessor> responseProcessors;
private final Messages messages;
private final Config config;
private final VarResolver varResolver;
@@ -3490,7 +3492,7 @@ public class RestContext extends BeanContext {
config = builder.config.resolving(vr.createSession());
bf.addBean(Config.class, config);
- responseHandlers =
unmodifiableList(createResponseHandlers(r, cp, bf));
+ responseProcessors =
unmodifiableList(createResponseProcessors(r, cp, bf));
callLogger = createCallLogger(r, cp, bf, l, ts);
bf.addBean(RestLogger.class, callLogger);
@@ -4119,12 +4121,12 @@ public class RestContext extends BeanContext {
* <p>
* Instantiates based on the following logic:
* <ul>
- * <li>Looks for {@link #REST_responseHandlers} value set via any
of the following:
+ * <li>Looks for {@link #REST_responseProcessors} value set via
any of the following:
* <ul>
- * <li>{@link
RestContextBuilder#responseHandlers(Class...)}/{@link
RestContextBuilder#responseHandlers(ResponseHandler...)}
- * <li>{@link Rest#responseHandlers()}.
+ * <li>{@link
RestContextBuilder#responseProcessors(Class...)}/{@link
RestContextBuilder#responseProcessors(ResponseProcessor...)}
+ * <li>{@link Rest#responseProcessors()}.
* </ul>
- * <li>Looks for a static or non-static
<c>createResponseHandlers()</> method that returns <c>{@link
ResponseHandler}[]</c> on the
+ * <li>Looks for a static or non-static
<c>createResponseProcessors()</> method that returns <c>{@link
ResponseProcessor}[]</c> on the
* resource class with any of the following arguments:
* <ul>
* <li>{@link RestContext}
@@ -4132,11 +4134,11 @@ public class RestContext extends BeanContext {
* <li>Any {@doc RestInjection injected beans}.
* </ul>
* <li>Resolves it via the bean store registered in this context.
- * <li>Instantiates a <c>ResponseHandler[0]</c>.
+ * <li>Instantiates a <c>ResponseProcessor[0]</c>.
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link #REST_responseHandlers}
+ * <li class='jf'>{@link #REST_responseProcessors}
* </ul>
*
* @param resource
@@ -4150,20 +4152,20 @@ public class RestContext extends BeanContext {
* @return The response handlers for this REST resource.
* @throws Exception If response handlers could not be instantiated.
*/
- protected ResponseHandlerList createResponseHandlers(Object resource,
ContextProperties properties, BeanStore beanStore) throws Exception {
+ protected ResponseProcessorList createResponseProcessors(Object
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
- ResponseHandlerList x = ResponseHandlerList.create();
+ ResponseProcessorList x = ResponseProcessorList.create();
- x.append(properties.getInstanceArray(REST_responseHandlers,
ResponseHandler.class, beanStore).orElse(new ResponseHandler[0]));
+ x.append(properties.getInstanceArray(REST_responseProcessors,
ResponseProcessor.class, beanStore).orElse(new ResponseProcessor[0]));
if (x.isEmpty())
-
x.append(beanStore.getBean(ResponseHandlerList.class).orElse(null));
+
x.append(beanStore.getBean(ResponseProcessorList.class).orElse(null));
x = BeanStore
.of(beanStore, resource)
- .addBean(ResponseHandlerList.class, x)
- .beanCreateMethodFinder(ResponseHandlerList.class,
resource)
- .find("createResponseHandlers")
+ .addBean(ResponseProcessorList.class, x)
+ .beanCreateMethodFinder(ResponseProcessorList.class,
resource)
+ .find("createResponseProcessors")
.withDefault(x)
.run();
@@ -6342,18 +6344,18 @@ public class RestContext extends BeanContext {
}
/**
- * Returns the response handlers associated with this resource.
+ * Returns the response processors associated with this resource.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_responseHandlers}
+ * <li class='jf'>{@link RestContext#REST_responseProcessors}
* </ul>
*
* @return
- * The response handlers associated with this resource.
+ * The response processors associated with this resource.
* <br>Never <jk>null</jk>.
*/
- protected List<ResponseHandler> getResponseHandlers() {
- return responseHandlers;
+ protected List<ResponseProcessor> getResponseProcessors() {
+ return responseProcessors;
}
/**
@@ -6731,7 +6733,7 @@ public class RestContext extends BeanContext {
if (call.getOutput().isPresent()) {
// Now serialize the output if there was any.
// Some subclasses may write to the
OutputStream or Writer directly.
- handleResponse(call);
+ processResponse(call);
}
@@ -6768,23 +6770,23 @@ public class RestContext extends BeanContext {
*
* <p>
* The default implementation simply iterates through the response
handlers on this resource
- * looking for the first one whose {@link
ResponseHandler#handle(RestCall)} method returns
+ * looking for the first one whose {@link
ResponseProcessor#process(RestCall)} method returns
* <jk>true</jk>.
*
* @param call The HTTP call.
* @throws IOException Thrown by underlying stream.
* @throws BasicHttpException Non-200 response.
- * @throws NotImplemented No registered response handlers could handle
the call.
+ * @throws NotImplemented No registered response processors could
handle the call.
*/
- public void handleResponse(RestCall call) throws IOException,
BasicHttpException, NotImplemented {
+ public void processResponse(RestCall call) throws IOException,
BasicHttpException, NotImplemented {
- // Loop until we find the correct handler for the POJO.
- for (ResponseHandler h : getResponseHandlers())
- if (h.handle(call))
+ // Loop until we find the correct processor for the POJO.
+ for (ResponseProcessor x : getResponseProcessors())
+ if (x.process(call))
return;
Object output =
call.getRestResponse().getOutput().get().orElse(null);
- throw new NotImplemented("No response handlers found to process
output of type '"+(output == null ? null : output.getClass().getName())+"'");
+ throw new NotImplemented("No response processors found to
process output of type '"+(output == null ? null :
output.getClass().getName())+"'");
}
/**
@@ -7133,7 +7135,7 @@ public class RestContext extends BeanContext {
.a("partSerializer", partSerializer)
.a("produces", produces)
.a("renderResponseStackTraces",
renderResponseStackTraces)
- .a("responseHandlers", responseHandlers)
+ .a("responseProcessors",
responseProcessors)
.a("serializers", serializers)
.a("staticFiles", staticFiles)
.a("swaggerProvider", swaggerProvider)
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 6fda991..45df3e6 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -44,7 +44,7 @@ import org.apache.juneau.parser.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.logging.*;
-import org.apache.juneau.rest.reshandlers.*;
+import org.apache.juneau.rest.processors.*;
import org.apache.juneau.rest.vars.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.svl.*;
@@ -125,10 +125,12 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
partSerializer(OpenApiSerializer.class);
partParser(OpenApiParser.class);
encoders(IdentityEncoder.INSTANCE);
- responseHandlers(
- ReaderHandler.class,
- InputStreamHandler.class,
- DefaultHandler.class
+ responseProcessors(
+ ReaderProcessor.class,
+ InputStreamProcessor.class,
+ HttpResourceProcessor.class,
+ HttpEntityProcessor.class,
+ DefaultProcessor.class
);
// Pass-through default values.
@@ -1571,40 +1573,40 @@ public class RestContextBuilder extends
BeanContextBuilder implements ServletCon
}
/**
- * <i><l>RestContext</l> configuration property: </i> Response
handlers.
+ * <i><l>RestContext</l> configuration property: </i> Response
processors.
*
* <p>
- * Specifies a list of {@link ResponseHandler} classes that know how to
convert POJOs returned by REST methods or
+ * Specifies a list of {@link ResponseProcessor} classes that know how
to convert POJOs returned by REST methods or
* set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_responseHandlers}
+ * <li class='jf'>{@link RestContext#REST_responseProcessors}
* </ul>
*
* @param values The values to add to this setting.
* @return This object (for method chaining).
*/
@FluentSetter
- public RestContextBuilder responseHandlers(Class<?>...values) {
- return prependTo(REST_responseHandlers, values);
+ public RestContextBuilder responseProcessors(Class<?>...values) {
+ return prependTo(REST_responseProcessors, values);
}
/**
- * <i><l>RestContext</l> configuration property: </i> Response
handlers.
+ * <i><l>RestContext</l> configuration property: </i> Response
processors.
*
* <p>
- * Same as {@link #responseHandlers(Class...)} except input is
pre-constructed instances.
+ * Same as {@link #responseProcessors(Class...)} except input is
pre-constructed instances.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_responseHandlers}
+ * <li class='jf'>{@link RestContext#REST_responseProcessors}
* </ul>
*
* @param values The values to add to this setting.
* @return This object (for method chaining).
*/
@FluentSetter
- public RestContextBuilder responseHandlers(ResponseHandler...values) {
- return prependTo(REST_responseHandlers, values);
+ public RestContextBuilder
responseProcessors(ResponseProcessor...values) {
+ return prependTo(REST_responseProcessors, values);
}
/**
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index 326dc6f..46bdb4e 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -29,6 +29,7 @@ import org.apache.juneau.collections.*;
import org.apache.juneau.encoders.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.httppart.bean.*;
+import org.apache.juneau.reflect.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.rest.logging.*;
@@ -64,6 +65,7 @@ public final class RestResponse {
private final RestRequest request;
private Optional<Optional<Object>> output = empty(); // The POJO being
sent to the output.
+ private Optional<ClassInfo> outputInfo = empty();
private ServletOutputStream sos;
private FinishableServletOutputStream os;
private FinishablePrintWriter w;
@@ -165,7 +167,7 @@ public final class RestResponse {
* </ul>
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_responseHandlers}
+ * <li class='jf'>{@link RestContext#REST_responseProcessors}
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*
@@ -174,6 +176,7 @@ public final class RestResponse {
*/
public RestResponse setOutput(Object output) {
this.output = of(ofNullable(output));
+ this.outputInfo = ofNullable(ClassInfo.ofc(output));
return this;
}
@@ -199,26 +202,6 @@ public final class RestResponse {
}
/**
- * Shortcut method that allows you to use var-args to simplify setting
array output.
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bcode w800'>
- * <jc>// Instead of...</jc>
- * <jv>response</jv>.setOutput(<jk>new</jk>
Object[]{<jv>x</jv>,<jv>y</jv>,<jv>z</jv>});
- *
- * <jc>// ...call this...</jc>
- * <jv>response</jv>.setOutput(<jv>x</jv>,<jv>y</jv>,<jv>z</jv>);
- * </p>
- *
- * @param output The output to serialize to the connection.
- * @return This object (for method chaining).
- */
- public RestResponse setOutputs(Object...output) {
- this.output = of(of(output));
- return this;
- }
-
- /**
* Returns the output that was set by calling {@link
#setOutput(Object)}.
*
* <p>
@@ -233,6 +216,15 @@ public final class RestResponse {
}
/**
+ * Returns metadata about the output object.
+ *
+ * @return Metadata about the output object.
+ */
+ public Optional<ClassInfo> getOutputInfo() {
+ return outputInfo;
+ }
+
+ /**
* Sets the output to a plain-text message regardless of the content
type.
*
* @param text The output text to send.
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
index e49a54a..58aac16 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
@@ -909,17 +909,17 @@ public @interface Rest {
String renderResponseStackTraces() default "";
/**
- * Response handlers.
+ * Response processors.
*
* <p>
- * Specifies a list of {@link ResponseHandler} classes that know how to
convert POJOs returned by REST methods or
+ * Specifies a list of {@link ResponseProcessor} classes that know how
to convert POJOs returned by REST methods or
* set via {@link RestResponse#setOutput(Object)} into appropriate HTTP
responses.
*
* <ul class='seealso'>
- * <li class='jf'>{@link RestContext#REST_responseHandlers}
+ * <li class='jf'>{@link RestContext#REST_responseProcessors}
* </ul>
*/
- Class<? extends ResponseHandler>[] responseHandlers() default {};
+ Class<? extends ResponseProcessor>[] responseProcessors() default {};
/**
* REST children class.
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index 2ebe006..02d11e7 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -85,7 +85,7 @@ public class RestAnnotation {
Class<? extends HttpPartSerializer> partSerializer =
HttpPartSerializer.Null.class;
Class<? extends FileFinder> fileFinder = FileFinder.Null.class;
Class<? extends StaticFiles> staticFiles =
StaticFiles.Null.class;
- Class<? extends ResponseHandler>[] responseHandlers = new
Class[0];
+ Class<? extends ResponseProcessor>[] responseProcessors = new
Class[0];
Class<? extends RestLogger> callLogger = RestLogger.Null.class;
Class<? extends RestContext> contextClass =
RestContext.Null.class;
Class<? extends RestConverter>[] converters = new Class[0];
@@ -482,13 +482,13 @@ public class RestAnnotation {
}
/**
- * Sets the {@link Rest#responseHandlers()} property on this
annotation.
+ * Sets the {@link Rest#responseProcessors()} property on this
annotation.
*
* @param value The new value for this property.
* @return This object (for method chaining).
*/
- public Builder responseHandlers(Class<? extends
ResponseHandler>...value) {
- this.responseHandlers = value;
+ public Builder responseProcessors(Class<? extends
ResponseProcessor>...value) {
+ this.responseProcessors = value;
return this;
}
@@ -698,7 +698,7 @@ public class RestAnnotation {
private final Class<? extends HttpPartSerializer>
partSerializer;
private final Class<? extends FileFinder> fileFinder;
private final Class<? extends StaticFiles> staticFiles;
- private final Class<? extends ResponseHandler>[]
responseHandlers;
+ private final Class<? extends ResponseProcessor>[]
responseProcessors;
private final Class<? extends RestLogger> callLogger;
private final Class<? extends RestContext> contextClass;
private final Class<? extends RestConverter>[] converters;
@@ -750,7 +750,7 @@ public class RestAnnotation {
this.path = b.path;
this.produces = copyOf(b.produces);
this.renderResponseStackTraces =
b.renderResponseStackTraces;
- this.responseHandlers = copyOf(b.responseHandlers);
+ this.responseProcessors = copyOf(b.responseProcessors);
this.restChildrenClass = b.restChildrenClass;
this.restOperationContextClass =
b.restOperationContextClass;
this.restOperationsClass = b.restOperationsClass;
@@ -936,8 +936,8 @@ public class RestAnnotation {
}
@Override /* Rest */
- public Class<? extends ResponseHandler>[] responseHandlers() {
- return responseHandlers;
+ public Class<? extends ResponseProcessor>[]
responseProcessors() {
+ return responseProcessors;
}
@Override /* Rest */
@@ -1053,7 +1053,7 @@ public class RestAnnotation {
stringStream(a.defaultResponseHeaders()).map(x ->
basicHeader(x)).forEach(x -> cpb.appendTo(REST_defaultResponseHeaders, x));
cpb.appendToIfNotEmpty(REST_defaultRequestHeaders,
accept(string(a.defaultAccept())));
cpb.appendToIfNotEmpty(REST_defaultRequestHeaders,
contentType(string(a.defaultContentType())));
- cpb.prependTo(REST_responseHandlers,
a.responseHandlers());
+ cpb.prependTo(REST_responseProcessors,
a.responseProcessors());
cpb.prependTo(REST_converters, a.converters());
cpb.prependTo(REST_guards, reverse(a.guards()));
cpb.prependTo(REST_children, a.children());
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
similarity index 95%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
index 35823ac..9de6018 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
@@ -10,7 +10,7 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
// * specific language governing permissions and limitations under the
License. *
//
***************************************************************************************************************************
-package org.apache.juneau.rest.reshandlers;
+package org.apache.juneau.rest.processors;
import static org.apache.juneau.internal.StringUtils.*;
import static org.apache.juneau.http.HttpHeaders.*;
@@ -34,7 +34,7 @@ import
org.apache.juneau.rest.util.FinishableServletOutputStream;
import org.apache.juneau.serializer.*;
/**
- * Response handler for POJOs not handled by other handlers.
+ * Response processor for POJOs not handled by other processors.
*
* <p>
* This uses the serializers defined on the response to serialize the POJO.
@@ -50,11 +50,11 @@ import org.apache.juneau.serializer.*;
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*/
-public class DefaultHandler implements ResponseHandler {
+public class DefaultProcessor implements ResponseProcessor {
@SuppressWarnings("resource")
@Override /* ResponseHandler */
- public boolean handle(RestCall call) throws IOException,
InternalServerError, NotAcceptable {
+ public boolean process(RestCall call) throws IOException,
InternalServerError, NotAcceptable {
RestRequest req = call.getRestRequest();
RestResponse res = call.getRestResponse();
SerializerGroup g = res.getOpContext().getSerializers();
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
similarity index 66%
copy from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
copy to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
index a0abb36..cd1509e 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
@@ -10,33 +10,34 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
// * specific language governing permissions and limitations under the
License. *
//
***************************************************************************************************************************
-package org.apache.juneau.rest.reshandlers;
+package org.apache.juneau.rest.processors;
-import static org.apache.juneau.internal.IOUtils.*;
+import static org.apache.juneau.http.HttpHeaders.*;
import java.io.*;
import org.apache.juneau.rest.*;
+import org.apache.http.*;
import org.apache.juneau.http.response.*;
/**
- * Response handler for {@link Reader} objects.
- *
- * <p>
- * Simply pipes the contents of the {@link Reader} to {@link
RestResponse#getNegotiatedWriter()}.
- *
- * <ul class='seealso'>
- * <li class='link'>{@doc RestmReturnTypes}
- * </ul>
+ * Response handler for {@link HttpEntity} objects.
*/
-public final class ReaderHandler implements ResponseHandler {
+public final class HttpEntityProcessor implements ResponseProcessor {
- @Override /* ResponseHandler */
- public boolean handle(RestCall call) throws IOException, NotAcceptable,
BasicHttpException {
- RestResponse res = call.getRestResponse();
- if (res.isOutputType(Reader.class)) {
- try (Reader r = res.getOutput(Reader.class); Writer w =
res.getNegotiatedWriter()) {
- pipe(r, w);
+ @Override /* ResponseProcessor */
+ public boolean process(RestCall call) throws IOException,
NotAcceptable, BasicHttpException {
+ if (call.getOutputInfo().isChildOf(HttpEntity.class)) {
+ RestResponse res = call.getRestResponse();
+ HttpEntity e = res.getOutput(HttpEntity.class);
+
+
res.header(e.getContentType()).header(e.getContentEncoding());
+ long contentLength = e.getContentLength();
+ if (contentLength >= 0)
+ res.header(contentLength(contentLength));
+ try (OutputStream os = res.getNegotiatedOutputStream())
{
+ e.writeTo(os);
+ os.flush();
}
return true;
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
similarity index 63%
copy from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
copy to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
index a0abb36..9a32ad8 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
@@ -10,33 +10,37 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
// * specific language governing permissions and limitations under the
License. *
//
***************************************************************************************************************************
-package org.apache.juneau.rest.reshandlers;
+package org.apache.juneau.rest.processors;
-import static org.apache.juneau.internal.IOUtils.*;
+import static org.apache.juneau.http.HttpHeaders.*;
import java.io.*;
import org.apache.juneau.rest.*;
+import org.apache.http.*;
+import org.apache.juneau.http.resource.*;
import org.apache.juneau.http.response.*;
/**
- * Response handler for {@link Reader} objects.
- *
- * <p>
- * Simply pipes the contents of the {@link Reader} to {@link
RestResponse#getNegotiatedWriter()}.
- *
- * <ul class='seealso'>
- * <li class='link'>{@doc RestmReturnTypes}
- * </ul>
+ * Response handler for {@link HttpResource} objects.
*/
-public final class ReaderHandler implements ResponseHandler {
+public final class HttpResourceProcessor implements ResponseProcessor {
- @Override /* ResponseHandler */
- public boolean handle(RestCall call) throws IOException, NotAcceptable,
BasicHttpException {
- RestResponse res = call.getRestResponse();
- if (res.isOutputType(Reader.class)) {
- try (Reader r = res.getOutput(Reader.class); Writer w =
res.getNegotiatedWriter()) {
- pipe(r, w);
+ @Override /* ResponseProcessor */
+ public boolean process(RestCall call) throws IOException,
NotAcceptable, BasicHttpException {
+ if (call.getOutputInfo().isChildOf(HttpResource.class)) {
+ RestResponse res = call.getRestResponse();
+ HttpResource e = res.getOutput(HttpResource.class);
+
+
res.header(e.getContentType()).header(e.getContentEncoding());
+ long contentLength = e.getContentLength();
+ if (contentLength >= 0)
+ res.header(contentLength(contentLength));
+ for (Header h : e.getHeaders())
+ res.addHeader(h);
+ try (OutputStream os = res.getNegotiatedOutputStream())
{
+ e.writeTo(os);
+ os.flush();
}
return true;
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
similarity index 78%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
index caae090..a4eafe3 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/InputStreamHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
@@ -10,7 +10,7 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
// * specific language governing permissions and limitations under the
License. *
//
***************************************************************************************************************************
-package org.apache.juneau.rest.reshandlers;
+package org.apache.juneau.rest.processors;
import static org.apache.juneau.internal.IOUtils.*;
@@ -20,24 +20,21 @@ import org.apache.juneau.rest.*;
import org.apache.juneau.http.response.*;
/**
- * Response handler for {@link InputStream} objects.
+ * Response processor for {@link InputStream} objects.
*
* <p>
* Simply pipes the contents of the {@link InputStream} to {@link
RestResponse#getNegotiatedOutputStream()}.
*
- * <p>
- * Sets the <c>Content-Type</c> response header to whatever was set via {@link
RestResponse#setContentType(String)}.
- *
* <ul class='seealso'>
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*/
-public final class InputStreamHandler implements ResponseHandler {
+public final class InputStreamProcessor implements ResponseProcessor {
- @Override /* ResponseHandler */
- public boolean handle(RestCall call) throws IOException, NotAcceptable,
BasicHttpException {
- RestResponse res = call.getRestResponse();
- if (res.isOutputType(InputStream.class)) {
+ @Override /* ResponseProcessor */
+ public boolean process(RestCall call) throws IOException,
NotAcceptable, BasicHttpException {
+ if (call.getOutputInfo().isChildOf(InputStream.class)) {
+ RestResponse res = call.getRestResponse();
try (InputStream is = res.getOutput(InputStream.class);
OutputStream os = res.getNegotiatedOutputStream()) {
pipe(is, os);
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
similarity index 82%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
index a0abb36..0c03816 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/ReaderHandler.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
@@ -10,7 +10,7 @@
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the *
// * specific language governing permissions and limitations under the
License. *
//
***************************************************************************************************************************
-package org.apache.juneau.rest.reshandlers;
+package org.apache.juneau.rest.processors;
import static org.apache.juneau.internal.IOUtils.*;
@@ -20,7 +20,7 @@ import org.apache.juneau.rest.*;
import org.apache.juneau.http.response.*;
/**
- * Response handler for {@link Reader} objects.
+ * Response processor for {@link Reader} objects.
*
* <p>
* Simply pipes the contents of the {@link Reader} to {@link
RestResponse#getNegotiatedWriter()}.
@@ -29,12 +29,12 @@ import org.apache.juneau.http.response.*;
* <li class='link'>{@doc RestmReturnTypes}
* </ul>
*/
-public final class ReaderHandler implements ResponseHandler {
+public final class ReaderProcessor implements ResponseProcessor {
- @Override /* ResponseHandler */
- public boolean handle(RestCall call) throws IOException, NotAcceptable,
BasicHttpException {
- RestResponse res = call.getRestResponse();
- if (res.isOutputType(Reader.class)) {
+ @Override /* ResponseProcessor */
+ public boolean process(RestCall call) throws IOException,
NotAcceptable, BasicHttpException {
+ if (call.getOutputInfo().isChildOf(Reader.class)) {
+ RestResponse res = call.getRestResponse();
try (Reader r = res.getOutput(Reader.class); Writer w =
res.getNegotiatedWriter()) {
pipe(r, w);
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/package-info.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/package-info.java
similarity index 93%
rename from
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/package-info.java
rename to
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/package-info.java
index 3d47527..ad807fc 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/package-info.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/package-info.java
@@ -13,6 +13,6 @@
***************************************************************************************************************************/
/**
- * HTTP Response Handlers
+ * HTTP Response Processors
*/
-package org.apache.juneau.rest.reshandlers;
\ No newline at end of file
+package org.apache.juneau.rest.processors;
\ No newline at end of file
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
index 279904a..7771216 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
@@ -72,7 +72,7 @@ public class RestAnnotation_Test {
.path("path")
.produces("produces")
.renderResponseStackTraces("renderResponseStackTraces")
- .responseHandlers(ResponseHandler.class)
+ .responseProcessors(ResponseProcessor.class)
.restChildrenClass(RestChildren.class)
.restOperationContextClass(RestOperationContext.class)
.restOperationArgs(RestOperationArg.class)
@@ -127,7 +127,7 @@ public class RestAnnotation_Test {
.path("path")
.produces("produces")
.renderResponseStackTraces("renderResponseStackTraces")
- .responseHandlers(ResponseHandler.class)
+ .responseProcessors(ResponseProcessor.class)
.restChildrenClass(RestChildren.class)
.restOperationContextClass(RestOperationContext.class)
.restOperationArgs(RestOperationArg.class)
@@ -185,7 +185,7 @@ public class RestAnnotation_Test {
+ "path:'path',"
+ "produces:['produces'],"
+
"renderResponseStackTraces:'renderResponseStackTraces',"
- +
"responseHandlers:['org.apache.juneau.rest.ResponseHandler'],"
+ +
"responseProcessors:['org.apache.juneau.rest.ResponseProcessor'],"
+
"restChildrenClass:'org.apache.juneau.rest.RestChildren',"
+
"restOperationArgs:['org.apache.juneau.rest.RestOperationArg'],"
+
"restOperationContextClass:'org.apache.juneau.rest.RestOperationContext',"
@@ -285,7 +285,7 @@ public class RestAnnotation_Test {
path="path",
produces="produces",
renderResponseStackTraces="renderResponseStackTraces",
- responseHandlers=ResponseHandler.class,
+ responseProcessors=ResponseProcessor.class,
restChildrenClass=RestChildren.class,
restOperationContextClass=RestOperationContext.class,
restOperationArgs=RestOperationArg.class,
@@ -342,7 +342,7 @@ public class RestAnnotation_Test {
path="path",
produces="produces",
renderResponseStackTraces="renderResponseStackTraces",
- responseHandlers=ResponseHandler.class,
+ responseProcessors=ResponseProcessor.class,
restChildrenClass=RestChildren.class,
restOperationContextClass=RestOperationContext.class,
restOperationArgs=RestOperationArg.class,