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&lt;{@link 
org.apache.juneau.rest.ResponseHandler}|Class&lt;{@link 
org.apache.juneau.rest.ResponseHandler}&gt;&gt;</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&lt;{@link 
org.apache.juneau.rest.ResponseProcessor}|Class&lt;{@link 
org.apache.juneau.rest.ResponseProcessor}&gt;&gt;</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:&emsp;</i>  Response 
handlers.
+        * <i><l>RestContext</l> configuration property:&emsp;</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:&emsp;</i>  Response 
handlers.
+        * <i><l>RestContext</l> configuration property:&emsp;</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,

Reply via email to