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>

Reply via email to