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 3fd6ba6 REST refactoring.
3fd6ba6 is described below
commit 3fd6ba6c7141a85b53f651dc263d16deeb7905e3
Author: JamesBognar <[email protected]>
AuthorDate: Thu Mar 11 15:19:11 2021 -0500
REST refactoring.
---
.../java/org/apache/juneau/http/HttpHeaders.java | 63 ++++++++++++++++++++++
.../org/apache/juneau/http/header/HeaderList.java | 50 +++++++++++++++++
2 files changed, 113 insertions(+)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpHeaders.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpHeaders.java
index 82a0aa5..6f4acfb 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpHeaders.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpHeaders.java
@@ -12,13 +12,18 @@
//
***************************************************************************************************************************
package org.apache.juneau.http;
+import static org.apache.juneau.internal.StringUtils.*;
+
+import java.lang.reflect.*;
import java.time.*;
import java.util.*;
+import java.util.concurrent.*;
import java.util.function.*;
import org.apache.http.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.header.Date;
+import org.apache.juneau.reflect.*;
/**
* Standard predefined HTTP headers.
@@ -3157,6 +3162,44 @@ public class HttpHeaders {
}
/**
+ * Creates a new {@link Header} of the specified type.
+ *
+ * <p>
+ * The implementation class must have a public constructor taking in
one of the following argument lists:
+ * <ul>
+ * <li><c>X(String <jv>value</jv>)</c>
+ * <li><c>X(Object <jv>value</jv>)</c>
+ * <li><c>X(String <jv>name</jv>, String <jv>value</jv>)</c>
+ * <li><c>X(String <jv>name</jv>, Object <jv>value</jv>)</c>
+ * </ul>
+ *
+ * @param type The header implementation class.
+ * @param name The header name.
+ * @param value The header value.
+ * @return A new unmodifiable instance, never <jk>null</jk>.
+ */
+ public static final <T extends Header> T header(Class<T> type, String
name, Object value) {
+ Constructor<T> c = findConstructor(type);
+ if (c == null)
+ throw new UnsupportedOperationException("Constructor
for type "+type.getClass().getName()+" could not be found.");
+
+ Class<?>[] pt = c.getParameterTypes();
+ Object[] args = new Object[pt.length];
+ if (pt.length == 1) {
+ args[0] = pt[0] == String.class ? stringify(value) :
value;
+ } else {
+ args[0] = name;
+ args[1] = pt[1] == String.class ? stringify(value) :
value;
+ }
+
+ try {
+ return c.newInstance(args);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Instantiates a new {@link HeaderListBuilder}.
*
* @return A new empty builder.
@@ -3197,4 +3240,24 @@ public class HttpHeaders {
public static HeaderList headerList(Object...pairs) {
return HeaderList.ofPairs(pairs);
}
+
+ private static final ConcurrentHashMap<Class<? extends
Header>,Optional<Constructor<? extends Header>>> HEADER_CONSTRUCTORS = new
ConcurrentHashMap<>();
+
+ @SuppressWarnings("unchecked")
+ private static final <T extends Header> Constructor<T>
findConstructor(Class<T> c) {
+ Optional<Constructor<? extends Header>> o =
HEADER_CONSTRUCTORS.get(c);
+ if (o == null) {
+ ClassInfo ci = ClassInfo.of(c);
+ ConstructorInfo cci =
ci.getPublicConstructor(String.class);
+ if (cci == null)
+ cci = ci.getPublicConstructor(Object.class);
+ if (cci == null)
+ cci = ci.getPublicConstructor(String.class,
String.class);
+ if (cci == null)
+ cci = ci.getPublicConstructor(String.class,
Object.class);
+ o = Optional.ofNullable(cci == null ? null :
cci.inner());
+ HEADER_CONSTRUCTORS.put(c, o);
+ }
+ return (Constructor<T>)o.orElse(null);
+ }
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
index 43db16a..a2f8a5a 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -23,6 +23,7 @@ import org.apache.http.message.*;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.*;
import org.apache.juneau.*;
+import org.apache.juneau.http.HttpHeaders;
/**
* An unmodifiable list of HTTP headers.
@@ -165,6 +166,55 @@ public class HeaderList implements Iterable<Header> {
}
/**
+ * Gets a header representing all of the header values with the given
name.
+ *
+ * <p>
+ * If more that one header with the given name exists the values will be
+ * combined with a "," as per RFC 2616.
+ *
+ * <p>Header name comparison is case insensitive.
+ *
+ * <p>
+ * The implementation class must have a public constructor taking in
one of the following argument lists:
+ * <ul>
+ * <li><c>X(String <jv>value</jv>)</c>
+ * <li><c>X(Object <jv>value</jv>)</c>
+ * <li><c>X(String <jv>name</jv>, String <jv>value</jv>)</c>
+ * <li><c>X(String <jv>name</jv>, Object <jv>value</jv>)</c>
+ * </ul>
+ *
+ * @param type The header implementation class.
+ * @param name The header name.
+ * @return A header with a condensed value or <jk>null</jk> if no
headers by the given name are present
+ */
+ @SuppressWarnings("unchecked")
+ public <T extends Header> T getCondensed(Class<T> type, String name) {
+ List<Header> hdrs = get(name);
+
+ if (hdrs.isEmpty())
+ return null;
+
+ String value = null;
+
+ if (hdrs.size() == 1) {
+ Header h = hdrs.get(0);
+ if (type.isInstance(h))
+ return (T)h;
+ value = h.getValue();
+ } else {
+ CharArrayBuffer sb = new CharArrayBuffer(128);
+ sb.append(hdrs.get(0).getValue());
+ for (int i = 1; i < hdrs.size(); i++) {
+ sb.append(", ");
+ sb.append(hdrs.get(i).getValue());
+ }
+ value = sb.toString();
+ }
+
+ return HttpHeaders.header(type, name, value);
+ }
+
+ /**
* Gets all of the headers with the given name.
*
* <p>