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;
}
}