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 395b0da  REST refactoring.
395b0da is described below

commit 395b0da60d3f506e55963b13aa0edf72e6711e48
Author: JamesBognar <[email protected]>
AuthorDate: Tue Mar 9 19:07:15 2021 -0500

    REST refactoring.
---
 .../org/apache/juneau/rest/ResponseProcessor.java  | 11 +++++--
 .../java/org/apache/juneau/rest/RestContext.java   | 13 ++++++--
 .../org/apache/juneau/rest/RestContextBuilder.java |  3 ++
 .../juneau/rest/processors/DefaultProcessor.java   | 12 ++++----
 .../rest/processors/HttpEntityProcessor.java       | 32 +++++++++----------
 .../rest/processors/HttpResourceProcessor.java     | 36 +++++++++++-----------
 ...erProcessor.java => HttpResponseProcessor.java} | 30 ++++++------------
 .../rest/processors/InputStreamProcessor.java      | 18 +++++------
 .../{ReaderProcessor.java => PojoProcessor.java}   | 25 +++------------
 .../juneau/rest/processors/ReaderProcessor.java    | 18 +++++------
 ...erProcessor.java => ResponseBeanProcessor.java} | 30 ++++++------------
 11 files changed, 103 insertions(+), 125 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
index a6599de..0fa888e 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/ResponseProcessor.java
@@ -88,10 +88,15 @@ 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 processor handled the response.
+        * @return One of the following codes:
+        *      <ul>
+        *              <li><c>0</c> - The processor could not handle the 
request.
+        *              <li><c>1</c> - The processor was able to fully handle 
the request.
+        *              <li><c>2</c> - The processor was able to partially 
handle the request by replacing the output.
+        *                      The response processors should start over.
+        *      </ul>
         * @throws IOException
         *      If low-level exception occurred on output stream.
         *      Results in a {@link 
HttpServletResponse#SC_INTERNAL_SERVER_ERROR} error.
@@ -99,5 +104,5 @@ public interface ResponseProcessor {
         *      If some other exception occurred.
         *      Can be used to provide an appropriate HTTP response code and 
message.
         */
-       boolean process(RestCall call) throws IOException, BasicHttpException;
+       int process(RestCall call) throws IOException, BasicHttpException;
 }
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 a62c935..fae65ff 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
@@ -6781,9 +6781,18 @@ public class RestContext extends BeanContext {
        public void processResponse(RestCall call) throws IOException, 
BasicHttpException, NotImplemented {
 
                // Loop until we find the correct processor for the POJO.
-               for (ResponseProcessor x : getResponseProcessors())
-                       if (x.process(call))
+               List<ResponseProcessor> l = getResponseProcessors();
+               int loops = 5;
+               for (int i = 0; i < l.size(); i++) {
+                       int j = l.get(i).process(call);
+                       if (j == 1)
                                return;
+                       if (j == 2) {
+                               if (loops-- < 0)
+                                       throw new InternalServerError("Too many 
processing loops.");
+                               i = -1;  // Start over.
+                       }
+               }
 
                Object output = 
call.getRestResponse().getOutput().get().orElse(null);
                throw new NotImplemented("No response processors found to 
process output of type '"+(output == null ? null : 
output.getClass().getName())+"'");
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 45df3e6..5d4b7c3 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
@@ -128,8 +128,11 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                        responseProcessors(
                                ReaderProcessor.class,
                                InputStreamProcessor.class,
+                               HttpResponseProcessor.class,
                                HttpResourceProcessor.class,
                                HttpEntityProcessor.class,
+                               ResponseBeanProcessor.class,
+                               PojoProcessor.class,
                                DefaultProcessor.class
                        );
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
index 9de6018..727a329 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/DefaultProcessor.java
@@ -54,7 +54,7 @@ public class DefaultProcessor implements ResponseProcessor {
 
        @SuppressWarnings("resource")
        @Override /* ResponseHandler */
-       public boolean process(RestCall call) throws IOException, 
InternalServerError, NotAcceptable {
+       public int process(RestCall call) throws IOException, 
InternalServerError, NotAcceptable {
                RestRequest req = call.getRestRequest();
                RestResponse res = call.getRestResponse();
                SerializerGroup g = res.getOpContext().getSerializers();
@@ -161,7 +161,7 @@ public class DefaultProcessor implements ResponseProcessor {
                                                        m.invoke(o, 
res.getOutputStream());
                                                else if (ptt == Writer.class)
                                                        m.invoke(o, 
res.getWriter());
-                                               return true;
+                                               return 1;
                                        }
                                        o = m.invoke(o);
                                } catch (Exception e) {
@@ -182,7 +182,7 @@ public class DefaultProcessor implements ResponseProcessor {
                                e.writeTo(os);
                                os.flush();
                        }
-                       return true;
+                       return 1;
                }
 
                if (sm != null) {
@@ -242,7 +242,7 @@ public class DefaultProcessor implements ResponseProcessor {
                        } catch (SerializeException e) {
                                throw new InternalServerError(e);
                        }
-                       return true;
+                       return 1;
                }
 
                // Non-existent Accept or plain/text can just be serialized 
as-is.
@@ -266,11 +266,11 @@ public class DefaultProcessor implements 
ResponseProcessor {
                                w.flush();
                                w.finish();
                        }
-                       return true;
+                       return 1;
                }
 
                if (o == null)
-                       return true;
+                       return 1;
 
                throw new NotAcceptable(
                        "Unsupported media-type in request header ''Accept'': 
''{0}''\n\tSupported media-types: {1}",
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
index cd1509e..3089494 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpEntityProcessor.java
@@ -18,7 +18,6 @@ import java.io.*;
 
 import org.apache.juneau.rest.*;
 import org.apache.http.*;
-import org.apache.juneau.http.response.*;
 
 /**
  * Response handler for {@link HttpEntity} objects.
@@ -26,22 +25,23 @@ import org.apache.juneau.http.response.*;
 public final class HttpEntityProcessor implements ResponseProcessor {
 
        @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;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().isChildOf(HttpEntity.class))
+                       return 0;
+
+               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 false;
+               return 1;
        }
 }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
index 9a32ad8..a829e98 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResourceProcessor.java
@@ -19,7 +19,6 @@ 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 HttpResource} objects.
@@ -27,24 +26,25 @@ import org.apache.juneau.http.response.*;
 public final class HttpResourceProcessor implements ResponseProcessor {
 
        @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;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().isChildOf(HttpResource.class))
+                       return 0;
+
+               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 false;
+               return 1;
        }
 }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResponseProcessor.java
similarity index 68%
copy from 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
copy to 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResponseProcessor.java
index 0c03816..06d793f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/HttpResponseProcessor.java
@@ -12,35 +12,23 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.processors;
 
-import static org.apache.juneau.internal.IOUtils.*;
-
 import java.io.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.http.response.*;
+import org.apache.http.*;
 
 /**
- * Response processor 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 HttpResponse} objects.
  */
-public final class ReaderProcessor implements ResponseProcessor {
+public final class HttpResponseProcessor implements ResponseProcessor {
 
        @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);
-                       }
-                       return true;
-               }
-               return false;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().isChildOf(HttpResponse.class))
+                       return 0;
+
+               return 0;
        }
 }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
index a4eafe3..1a93e2f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/InputStreamProcessor.java
@@ -17,7 +17,6 @@ import static org.apache.juneau.internal.IOUtils.*;
 import java.io.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.http.response.*;
 
 /**
  * Response processor for {@link InputStream} objects.
@@ -32,14 +31,15 @@ import org.apache.juneau.http.response.*;
 public final class InputStreamProcessor implements ResponseProcessor {
 
        @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);
-                       }
-                       return true;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().isChildOf(InputStream.class))
+                       return 0;
+
+               RestResponse res = call.getRestResponse();
+               try (InputStream is = res.getOutput(InputStream.class); 
OutputStream os = res.getNegotiatedOutputStream()) {
+                       pipe(is, os);
                }
-               return false;
+               return 1;
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/PojoProcessor.java
similarity index 69%
copy from 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
copy to 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/PojoProcessor.java
index 0c03816..334b7f6 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/PojoProcessor.java
@@ -12,35 +12,20 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.processors;
 
-import static org.apache.juneau.internal.IOUtils.*;
-
 import java.io.*;
 
 import org.apache.juneau.rest.*;
 import org.apache.juneau.http.response.*;
 
 /**
- * Response processor 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 plain-old Java objects.
  */
-public final class ReaderProcessor implements ResponseProcessor {
+public final class PojoProcessor implements ResponseProcessor {
 
        @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);
-                       }
-                       return true;
-               }
-               return false;
+       public int process(RestCall call) throws IOException, NotAcceptable, 
BasicHttpException {
+
+               return 0;
        }
 }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
index 0c03816..42a5225 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
@@ -17,7 +17,6 @@ import static org.apache.juneau.internal.IOUtils.*;
 import java.io.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.http.response.*;
 
 /**
  * Response processor for {@link Reader} objects.
@@ -32,15 +31,16 @@ import org.apache.juneau.http.response.*;
 public final class ReaderProcessor implements ResponseProcessor {
 
        @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);
-                       }
-                       return true;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().isChildOf(Reader.class))
+                       return 0;
+
+               RestResponse res = call.getRestResponse();
+               try (Reader r = res.getOutput(Reader.class); Writer w = 
res.getNegotiatedWriter()) {
+                       pipe(r, w);
                }
-               return false;
+               return 1;
        }
 }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ResponseBeanProcessor.java
similarity index 68%
copy from 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
copy to 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ResponseBeanProcessor.java
index 0c03816..9990656 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ReaderProcessor.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processors/ResponseBeanProcessor.java
@@ -12,35 +12,23 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.processors;
 
-import static org.apache.juneau.internal.IOUtils.*;
-
 import java.io.*;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.http.response.*;
+import org.apache.juneau.http.annotation.*;
 
 /**
- * Response processor 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 Response @Response}-annotated objects.
  */
-public final class ReaderProcessor implements ResponseProcessor {
+public final class ResponseBeanProcessor implements ResponseProcessor {
 
        @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);
-                       }
-                       return true;
-               }
-               return false;
+       public int process(RestCall call) throws IOException {
+
+               if (! call.getOutputInfo().hasAnnotation(Response.class))
+                       return 0;
+
+               return 0;
        }
 }
 

Reply via email to