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();