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 04e6e0e  REST refactoring.
04e6e0e is described below

commit 04e6e0e7e722f8bcf65ebcf565e4c9046a46d57d
Author: JamesBognar <[email protected]>
AuthorDate: Thu Mar 11 15:53:49 2021 -0500

    REST refactoring.
---
 .../java/org/apache/juneau/http/header/Thrown.java | 119 +++++++++++----------
 .../juneau/http/response/HttpExceptionBuilder.java |   2 +-
 .../org/apache/juneau/rest/client/RestRequest.java |   8 +-
 3 files changed, 66 insertions(+), 63 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/Thrown.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/Thrown.java
index 354f161..a0545b9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/Thrown.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/Thrown.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http.header;
 
 import static org.apache.juneau.internal.StringUtils.*;
+import static java.util.Collections.*;
 
 import java.util.*;
 
@@ -26,15 +27,28 @@ import org.apache.juneau.http.annotation.*;
  *
  * <h5 class='figure'>Example</h5>
  * <p class='bcode w800'>
- *     Thrown: org.apache.juneau.http.response.NotFound, Resource was not found
+ *     Thrown: org.apache.juneau.http.response.NotFound;Resource was not found
  * </p>
  *
  * <p>
  * This header isn't part of the RFC2616 specification, but is provided to 
allow for Java exception information
  * to be delivered to remote REST Java interfaces.
+ * 
+ * <p>
+ * This header supports comma-delimited values for multiple thrown values.
+ * <p class='bcode w800'>
+ *     Thrown: org.apache.juneau.http.response.NotFound;Resource was not 
found,java.lang.RuntimeException;foo
+ * </p>
+ * 
+ * <p>
+ * Note that this is equivalent to specifying multiple header values.
+ * <p class='bcode w800'>
+ *     Thrown: org.apache.juneau.http.response.NotFound;Resource was not found
+ *     Thrown: java.lang.RuntimeException;foo
+ * </p>
  */
 @Header("Thrown")
-public class Thrown extends BasicHeader {
+public class Thrown extends BasicCsvArrayHeader {
 
        private static final long serialVersionUID = 1L;
 
@@ -43,19 +57,24 @@ public class Thrown extends BasicHeader {
         */
        public static final Thrown EMPTY = new Thrown((String)null);
 
-       private final String className, message;
+       private final List<Part> parts;
 
        /**
         * Convenience creator.
         *
-        * @param value
+        * @param values
         *      The header value.
         * @return A new {@link Exception} object.
         */
-       public static Thrown of(Throwable value) {
-               if (value == null)
-                       return null;
-               return new Thrown(value);
+       public static Thrown of(Throwable...values) {
+               StringBuilder sb = new StringBuilder();
+               for (int i = 0; i < values.length; i++) {
+                       if (i > 0)
+                               sb.append(", ");
+                       Throwable t = values[i];
+                       
sb.append(urlEncode(t.getClass().getName())).append(";").append(urlEncode(t.getMessage()));
+               }
+               return new Thrown(sb.toString());
        }
 
        /**
@@ -77,40 +96,18 @@ public class Thrown extends BasicHeader {
         * @param value
         *      The header value.
         */
-       public Thrown(Throwable value) {
-               super("Thrown", value);
-               className = 
stripInvalidHttpHeaderChars(value.getClass().getName());
-               message = stripInvalidHttpHeaderChars(value.getMessage());
-       }
-
-       @Override /* Header */
-       public String getValue() {
-               if (message == null)
-                       return className;
-               return className + ", " + message;
-       }
-
-       /**
-        * Constructor.
-        *
-        * @param value
-        *      The header value.
-        */
        public Thrown(String value) {
                super("Thrown", value);
-               if (value != null) {
-                       int i = value.indexOf(',');
+               List<Part> l = new ArrayList<>();
+               for (String s : asList().orElse(emptyList())) {
+                       int i = value.indexOf(';');
                        if (i != -1) {
-                               className = value.substring(0, i).trim();
-                               message = value.substring(i+1).trim();
+                               l.add(new Part(urlDecode(s.substring(0, 
i).trim()), urlDecode(s.substring(i+1).trim())));
                        } else {
-                               className = value;
-                               message = null;
+                               l.add(new Part(urlDecode(s), null));
                        }
-               } else {
-                       className = null;
-                       message = null;
                }
+               parts = unmodifiableList(l);
        }
 
        /**
@@ -118,34 +115,38 @@ public class Thrown extends BasicHeader {
         *
         * @return The class name portion of the header, or <jk>null</jk> if 
not there.
         */
-       public String getClassName() {
-               return className;
+       public List<Part> getParts() {
+               return parts;
        }
 
        /**
-        * Returns the class name portion of the header.
-        *
-        * @return The class name portion of the header, never <jk>null</jk>.
+        * Represents a single entry in this header.
         */
-       public Optional<String> className() {
-               return Optional.ofNullable(className);
-       }
+       public static class Part {
 
-       /**
-        * Returns the message portion of the header.
-        *
-        * @return The message portion of the header, or <jk>null</jk> if not 
there.
-        */
-       public String getMessage() {
-               return message;
-       }
+               String className, message;
 
-       /**
-        * Returns the message portion of the header.
-        *
-        * @return The message portion of the header, never <jk>null</jk>.
-        */
-       public Optional<String> message() {
-               return Optional.ofNullable(message);
+               Part(String className, String message) {
+                       this.className = className;
+                       this.message = message;
+               }
+
+               /**
+                * Returns the message portion of the header.
+                *
+                * @return The message portion of the header, or <jk>null</jk> 
if not there.
+                */
+               public String getClassName() {
+                       return className;
+               }
+
+               /**
+                * Returns the message portion of the header.
+                *
+                * @return The message portion of the header, or <jk>null</jk> 
if not there.
+                */
+               public String getMessage() {
+                       return message;
+               }
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpExceptionBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpExceptionBuilder.java
index 3eac8ce..8dfead4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpExceptionBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpExceptionBuilder.java
@@ -87,7 +87,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
        public HttpExceptionBuilder<?> copyFrom(HttpResponse response) {
                Header h = response.getLastHeader("Thrown");
                if (h != null)
-                       message(thrown(h.getValue()).message().orElse(null));
+                       
message(thrown(h.getValue()).getParts().get(0).getMessage());
                headers(response.getAllHeaders());
                body(response.getEntity());
                return this;
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
index 86a2ce3..9442560 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
@@ -2944,7 +2944,9 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
 
                        Thrown thrown = 
response.getHeader("Thrown").asHeader(Thrown.class);
                        if (thrown.isPresent() && rethrow != null) {
-                               String className = 
thrown.className().orElse(null);
+                               Thrown.Part thrownPart = 
thrown.getParts().get(0);
+                               String className = thrownPart.getClassName();
+                               String message = thrownPart.getMessage();
                                for (Class<? extends Throwable> t : rethrow) {
                                        if (t.getName().equals(className)) {
                                                ConstructorInfo c = null;
@@ -2954,10 +2956,10 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
                                                        throw 
c.<Throwable>invoke(response);
                                                c = 
ci.getPublicConstructor(String.class);
                                                if (c != null)
-                                                       throw 
c.<Throwable>invoke(thrown.message().orElse(response.getBody().asString()));
+                                                       throw 
c.<Throwable>invoke(message != null ? message : response.getBody().asString());
                                                c = 
ci.getPublicConstructor(String.class,Throwable.class);
                                                if (c != null)
-                                                       throw 
c.<Throwable>invoke(thrown.message().orElse(response.getBody().asString()), 
null);
+                                                       throw 
c.<Throwable>invoke(message != null ? message : response.getBody().asString(), 
null);
                                                c = ci.getPublicConstructor();
                                                if (c != null)
                                                        throw 
c.<Throwable>invoke();

Reply via email to