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 88ced6a  REST refactoring.
88ced6a is described below

commit 88ced6a390c491c8fff2748bef864702f2fa263a
Author: JamesBognar <[email protected]>
AuthorDate: Thu Mar 4 11:51:08 2021 -0500

    REST refactoring.
---
 .../main/ConfigurablePropertyCodeGenerator.java    |   2 +-
 .../header/{HeaderGroup.java => HeaderList.java}   | 101 ++++++++++-----------
 ...derGroupBuilder.java => HeaderListBuilder.java} |  50 +++++-----
 .../http/part/{PartGroup.java => PartList.java}    |  60 ++++++------
 ...{PartGroupBuilder.java => PartListBuilder.java} |  50 +++++-----
 .../juneau/http/response/BasicHttpException.java   |  57 ++++++------
 .../juneau/http/response/BasicHttpResponse.java    |  60 ++++++------
 .../juneau/http/response/HttpExceptionBuilder.java |  60 ++++++------
 .../juneau/http/response/HttpResponseBuilder.java  |  60 ++++++------
 .../java/org/apache/juneau/rest/RestContext.java   |  22 ++---
 .../apache/juneau/rest/RestOperationContext.java   |  48 +++++-----
 .../java/org/apache/juneau/rest/RestRequest.java   |   8 +-
 .../java/org/apache/juneau/rest/RestResponse.java  |   4 +-
 13 files changed, 289 insertions(+), 293 deletions(-)

diff --git a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java 
b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
index c281f0e..7d69922 100644
--- a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
+++ b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
@@ -118,7 +118,7 @@ public class ConfigurablePropertyCodeGenerator {
                FluentThrowableAssertion.class,
                FluentZonedDateTimeAssertion.class,
                Found.class,
-               HeaderGroupBuilder.class,
+               HeaderListBuilder.class,
                HtmlDocSerializerBuilder.class,
                HtmlParserBuilder.class,
                HtmlSchemaSerializerBuilder.class,
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroup.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
similarity index 66%
rename from 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroup.java
rename to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
index 619afae..97b6d81 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroup.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -12,8 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http.header;
 
-import static java.util.Optional.*;
-
+import static java.util.Collections.*;
 import java.util.*;
 
 import org.apache.http.*;
@@ -22,17 +21,15 @@ import org.apache.http.message.BasicHeader;
 import org.apache.http.util.*;
 
 /**
- * An unmodifiable group of HTTP headers.
+ * An unmodifiable list of HTTP headers.
  *
  * <p>
- * Similar to {@link HeaderGroup} but uses a builder-based approach for 
building header groups.
+ * Similar to {@link HeaderGroup} but uses a builder-based approach for 
building header lists.
  */
-public class HeaderGroup {
+public class HeaderList implements Iterable<Header> {
 
        /** Predefined instance. */
-       public static final HeaderGroup INSTANCE = create().build();
-
-       private static final Header[] EMPTY = new Header[] {};
+       public static final HeaderList EMPTY = create().build();
 
        private final List<Header> headers;
 
@@ -41,8 +38,8 @@ public class HeaderGroup {
         *
         * @return A new builder.
         */
-       public static HeaderGroupBuilder create() {
-               return new HeaderGroupBuilder();
+       public static HeaderListBuilder create() {
+               return new HeaderListBuilder();
        }
 
        /**
@@ -50,7 +47,7 @@ public class HeaderGroup {
         *
         * @param builder The builder containing the settings for this bean.
         */
-       public HeaderGroup(HeaderGroupBuilder builder) {
+       public HeaderList(HeaderListBuilder builder) {
                this.headers = new ArrayList<>(builder.headers);
        }
 
@@ -59,7 +56,7 @@ public class HeaderGroup {
         *
         * @return A new builder object.
         */
-       public HeaderGroupBuilder builder() {
+       public HeaderListBuilder builder() {
                return create().add(headers);
        }
 
@@ -75,23 +72,23 @@ public class HeaderGroup {
         * @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
         */
-       public Optional<Header> getCondensedHeader(final String name) {
-               Header[] hdrs = getHeaders(name);
+       public Header getCondensed(String name) {
+               List<Header> hdrs = get(name);
 
-               if (hdrs.length == 0)
-                       return empty();
+               if (hdrs.isEmpty())
+                       return null;
 
-               if (hdrs.length == 1)
-                       return of(hdrs[0]);
+               if (hdrs.size() == 1)
+                       return hdrs.get(0);
 
-               CharArrayBuffer valueBuffer = new CharArrayBuffer(128);
-               valueBuffer.append(hdrs[0].getValue());
-               for (int i = 1; i < hdrs.length; i++) {
-                       valueBuffer.append(", ");
-                       valueBuffer.append(hdrs[i].getValue());
+               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());
                }
 
-               return of(new BasicHeader(name.toLowerCase(Locale.ROOT), 
valueBuffer.toString()));
+               return new BasicHeader(name.toLowerCase(Locale.ROOT), 
sb.toString());
        }
 
        /**
@@ -107,12 +104,9 @@ public class HeaderGroup {
         *
         * @return An array containing all matching headers, or an empty array 
if none are found.
         */
-       public Header[] getHeaders(final String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Header header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
+       public List<Header> get(String name) {
                List<Header> l = null;
-               for (int i = 0; i < headers.size(); i++) {
+               for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
                        Header x = headers.get(i);
                        if (x.getName().equalsIgnoreCase(name)) {
                                if (l == null)
@@ -120,7 +114,7 @@ public class HeaderGroup {
                                l.add(x);
                        }
                }
-               return l != null ? l.toArray(new Header[l.size()]) : EMPTY;
+               return l == null ? emptyList() : l;
        }
 
        /**
@@ -132,11 +126,8 @@ public class HeaderGroup {
         * @param name The header name.
         * @return The first matching header, or <jk>null</jk> if not found.
         */
-       public Header getFirstHeader(String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Header header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
-               for (int i = 0; i < headers.size(); i++) {
+       public Header getFirst(String name) {
+               for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
                        Header x = headers.get(i);
                        if (x.getName().equalsIgnoreCase(name))
                                return x;
@@ -153,7 +144,7 @@ public class HeaderGroup {
         * @param name The header name.
         * @return The last matching header, or <jk>null</jk> if not found.
         */
-       public Header getLastHeader(String name) {
+       public Header getLast(String name) {
                for (int i = headers.size() - 1; i >= 0; i--) {
                        Header x = headers.get(i);
                        if (x.getName().equalsIgnoreCase(name))
@@ -163,16 +154,16 @@ public class HeaderGroup {
        }
 
        /**
-        * Gets all of the headers contained within this group.
+        * Gets all of the headers contained within this list.
         *
-        * @return An array containing all the headers within this group, or an 
empty array if no headers are present.
+        * @return An unmodifiable list of all the headers in this list, or an 
empty list if no headers are present.
         */
-       public List<Header> getAllHeaders() {
-               return Collections.unmodifiableList(headers);
+       public List<Header> getAll() {
+               return unmodifiableList(headers);
        }
 
        /**
-        * Tests if headers with the given name are contained within this group.
+        * Tests if headers with the given name are contained within this list.
         *
         * <p>
         * Header name comparison is case insensitive.
@@ -180,11 +171,8 @@ public class HeaderGroup {
         * @param name The header name.
         * @return <jk>true</jk> if at least one header with the name is 
present.
         */
-       public boolean containsHeader(String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Header header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
-               for (int i = 0; i < headers.size(); i++) {
+       public boolean contains(String name) {
+               for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
                        Header x = headers.get(i);
                        if (x.getName().equalsIgnoreCase(name))
                                return true;
@@ -193,22 +181,22 @@ public class HeaderGroup {
        }
 
        /**
-        * Returns an iterator over this group of headers.
+        * Returns an iterator over this list of headers.
         *
-        * @return A new iterator over this group of headers.
+        * @return A new iterator over this list of headers.
         */
-       public HeaderIterator iterator() {
-               return new BasicListHeaderIterator(this.headers, null);
+       public HeaderIterator headerIterator() {
+               return new BasicListHeaderIterator(headers, null);
        }
 
        /**
-        * Returns an iterator over the headers with a given name in this group.
+        * Returns an iterator over the headers with a given name in this list.
         *
         * @param name The name of the headers over which to iterate, or 
<jk>null</jk> for all headers
         *
-        * @return A new iterator over the matching headers in this group.
+        * @return A new iterator over the matching headers in this list.
         */
-       public HeaderIterator iterator(String name) {
+       public HeaderIterator headerIterator(String name) {
                return new BasicListHeaderIterator(headers, name);
        }
 
@@ -220,10 +208,15 @@ public class HeaderGroup {
         *
         * @return A copy of this object.
         */
-       public HeaderGroup copy() {
+       public HeaderList copy() {
                return builder().build();
        }
 
+       @Override /* Iterable */
+       public Iterator<Header> iterator() {
+               return getAll().iterator();
+       }
+
        @Override /* Object */
        public String toString() {
                return headers.toString();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroupBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
similarity index 85%
rename from 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroupBuilder.java
rename to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
index 0d8a6e0..9f5e3e0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderGroupBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
@@ -18,25 +18,25 @@ import org.apache.http.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Builder for {@link HeaderGroup} objects.
+ * Builder for {@link HeaderList} objects.
  */
 @FluentSetters
-public class HeaderGroupBuilder {
+public class HeaderListBuilder {
 
        final List<Header> headers = new ArrayList<>();
 
        /**
         * Constructor.
         */
-       public HeaderGroupBuilder() {}
+       public HeaderListBuilder() {}
 
        /**
-        * Creates a new {@link HeaderGroup} bean based on the contents of this 
builder.
+        * Creates a new {@link HeaderList} bean based on the contents of this 
builder.
         *
-        * @return A new {@link HeaderGroup} bean.
+        * @return A new {@link HeaderList} bean.
         */
-       public HeaderGroup build() {
-               return new HeaderGroup(this);
+       public HeaderList build() {
+               return new HeaderList(this);
        }
 
        /**
@@ -45,7 +45,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder clear() {
+       public HeaderListBuilder clear() {
                headers.clear();
                return this;
        }
@@ -57,7 +57,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder add(Header value) {
+       public HeaderListBuilder add(Header value) {
                if (value != null)
                        headers.add(value);
                return this;
@@ -71,7 +71,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder add(String name, String value) {
+       public HeaderListBuilder add(String name, String value) {
                headers.add(new BasicHeader(name, value));
                return this;
        }
@@ -83,7 +83,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder add(Header...values) {
+       public HeaderListBuilder add(Header...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        add(values[i]);
                return this;
@@ -96,7 +96,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder add(List<Header> values) {
+       public HeaderListBuilder add(List<Header> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        add(values.get(i));
                return this;
@@ -109,7 +109,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder remove(Header value) {
+       public HeaderListBuilder remove(Header value) {
                if (value != null)
                        headers.remove(value);
                return this;
@@ -122,7 +122,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder remove(Header...values) {
+       public HeaderListBuilder remove(Header...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        remove(values[i]);
                return this;
@@ -135,7 +135,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder remove(List<Header> values) {
+       public HeaderListBuilder remove(List<Header> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        remove(values.get(i));
                return this;
@@ -148,7 +148,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder remove(String name) {
+       public HeaderListBuilder remove(String name) {
                for (int i = 0; i < headers.size(); i++) /* See HTTPCORE-361 */
                        if (headers.get(i).getName().equalsIgnoreCase(name))
                                headers.remove(i--);
@@ -165,7 +165,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder update(Header value) {
+       public HeaderListBuilder update(Header value) {
                if (value == null)
                        return this;
 
@@ -191,7 +191,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder update(Header...values) {
+       public HeaderListBuilder update(Header...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        update(values[i]);
                return this;
@@ -207,14 +207,14 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder update(List<Header> values) {
+       public HeaderListBuilder update(List<Header> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        update(values.get(i));
                return this;
        }
 
        /**
-        * Sets all of the headers contained within this group overriding any 
existing headers.
+        * Sets all of the headers contained within this list overriding any 
existing headers.
         *
         * <p>
         * The headers are added in the order in which they appear in the array.
@@ -223,14 +223,14 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder set(Header...values) {
+       public HeaderListBuilder set(Header...values) {
                clear();
                Collections.addAll(headers, values);
                return this;
        }
 
        /**
-        * Sets all of the headers contained within this group overriding any 
existing headers.
+        * Sets all of the headers contained within this list overriding any 
existing headers.
         *
         * <p>
         * The headers are added in the order in which they appear in the list.
@@ -239,7 +239,7 @@ public class HeaderGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderGroupBuilder set(List<Header> values) {
+       public HeaderListBuilder set(List<Header> values) {
                clear();
                headers.addAll(values);
                return this;
@@ -255,7 +255,7 @@ public class HeaderGroupBuilder {
         * @param values The values to append or replace in this list.
         * @return This object (for method chaining).
         */
-       public HeaderGroupBuilder appendUnique(Header...values) {
+       public HeaderListBuilder appendUnique(Header...values) {
                for (Header h : values) {
                        boolean replaced = false;
                        for (ListIterator<Header> li = headers.listIterator(); 
li.hasNext();) {
@@ -283,7 +283,7 @@ public class HeaderGroupBuilder {
         * @param values The values to append or replace in this list.
         * @return This object (for method chaining).
         */
-       public HeaderGroupBuilder appendUnique(Collection<Header> values) {
+       public HeaderListBuilder appendUnique(Collection<Header> values) {
                for (Header h : values) {
                        boolean replaced = false;
                        for (ListIterator<Header> li = headers.listIterator(); 
li.hasNext();) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroup.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java
similarity index 72%
rename from 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroup.java
rename to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java
index 6b5e517..fc8a473 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroup.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartList.java
@@ -12,17 +12,17 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http.part;
 
+import static java.util.Collections.*;
+
 import java.util.*;
 
 /**
- * An unmodifiable group of HTTP parts.
+ * An unmodifiable list of HTTP parts.
  */
-public class PartGroup {
+public class PartList implements Iterable<Part> {
 
        /** Predefined instance. */
-       public static final PartGroup INSTANCE = create().build();
-
-       private static final Part[] EMPTY = new Part[] {};
+       public static final PartList EMPTY = create().build();
 
        private final List<Part> parts;
 
@@ -31,8 +31,8 @@ public class PartGroup {
         *
         * @return A new builder.
         */
-       public static PartGroupBuilder create() {
-               return new PartGroupBuilder();
+       public static PartListBuilder create() {
+               return new PartListBuilder();
        }
 
        /**
@@ -40,7 +40,7 @@ public class PartGroup {
         *
         * @param builder The builder containing the settings for this bean.
         */
-       public PartGroup(PartGroupBuilder builder) {
+       public PartList(PartListBuilder builder) {
                this.parts = new ArrayList<>(builder.parts);
        }
 
@@ -49,7 +49,7 @@ public class PartGroup {
         *
         * @return A new builder object.
         */
-       public PartGroupBuilder builder() {
+       public PartListBuilder builder() {
                return create().add(parts);
        }
 
@@ -66,12 +66,9 @@ public class PartGroup {
         *
         * @return An array containing all matching headers, or an empty array 
if none are found.
         */
-       public Part[] getParts(final String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Part header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
+       public List<Part> get(String name) {
                List<Part> l = null;
-               for (int i = 0; i < parts.size(); i++) {
+               for (int i = 0; i < parts.size(); i++) {  // See HTTPCORE-361
                        Part x = parts.get(i);
                        if (x.getName().equals(name)) {
                                if (l == null)
@@ -79,7 +76,7 @@ public class PartGroup {
                                l.add(x);
                        }
                }
-               return l != null ? l.toArray(new Part[l.size()]) : EMPTY;
+               return l == null ? emptyList() : l;
        }
 
        /**
@@ -91,11 +88,8 @@ public class PartGroup {
         * @param name The header name.
         * @return The first matching header, or <jk>null</jk> if not found.
         */
-       public Part getFirstPart(String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Part header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
-               for (int i = 0; i < parts.size(); i++) {
+       public Part getFirst(String name) {
+               for (int i = 0; i < parts.size(); i++) {  // See HTTPCORE-361
                        Part x = parts.get(i);
                        if (x.getName().equals(name))
                                return x;
@@ -112,7 +106,7 @@ public class PartGroup {
         * @param name The header name.
         * @return The last matching header, or <jk>null</jk> if not found.
         */
-       public Part getLastPart(String name) {
+       public Part getLast(String name) {
                for (int i = parts.size() - 1; i >= 0; i--) {
                        Part x = parts.get(i);
                        if (x.getName().equals(name))
@@ -122,16 +116,16 @@ public class PartGroup {
        }
 
        /**
-        * Gets all of the headers contained within this group.
+        * Gets all of the headers contained within this list.
         *
-        * @return An array containing all the headers within this group, or an 
empty array if no headers are present.
+        * @return An array containing all the headers within this list, or an 
empty array if no headers are present.
         */
-       public List<Part> getAllParts() {
-               return Collections.unmodifiableList(parts);
+       public List<Part> getAll() {
+               return unmodifiableList(parts);
        }
 
        /**
-        * Tests if headers with the given name are contained within this group.
+        * Tests if headers with the given name are contained within this list.
         *
         * <p>
         * Part name comparison is case insensitive.
@@ -139,11 +133,8 @@ public class PartGroup {
         * @param name The header name.
         * @return <jk>true</jk> if at least one header with the name is 
present.
         */
-       public boolean containsPart(String name) {
-               // HTTPCORE-361 : we don't use the for-each syntax, i.e.
-               //       for (Part header : headers)
-               // as that creates an Iterator that needs to be 
garbage-collected
-               for (int i = 0; i < parts.size(); i++) {
+       public boolean contains(String name) {
+               for (int i = 0; i < parts.size(); i++) {  // See HTTPCORE-361
                        Part x = parts.get(i);
                        if (x.getName().equals(name))
                                return true;
@@ -159,10 +150,15 @@ public class PartGroup {
         *
         * @return A copy of this object.
         */
-       public PartGroup copy() {
+       public PartList copy() {
                return builder().build();
        }
 
+       @Override /* Iterable */
+       public Iterator<Part> iterator() {
+               return getAll().iterator();
+       }
+
        @Override /* Object */
        public String toString() {
                return parts.toString();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroupBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartListBuilder.java
similarity index 85%
rename from 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroupBuilder.java
rename to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartListBuilder.java
index 8d8893f..20b81ae 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartGroupBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/PartListBuilder.java
@@ -17,25 +17,25 @@ import java.util.*;
 import org.apache.juneau.internal.*;
 
 /**
- * Builder for {@link PartGroup} objects.
+ * Builder for {@link PartList} objects.
  */
 @FluentSetters
-public class PartGroupBuilder {
+public class PartListBuilder {
 
        final List<Part> parts = new ArrayList<>();
 
        /**
         * Constructor.
         */
-       public PartGroupBuilder() {}
+       public PartListBuilder() {}
 
        /**
-        * Creates a new {@link PartGroup} bean based on the contents of this 
builder.
+        * Creates a new {@link PartList} bean based on the contents of this 
builder.
         *
-        * @return A new {@link PartGroup} bean.
+        * @return A new {@link PartList} bean.
         */
-       public PartGroup build() {
-               return new PartGroup(this);
+       public PartList build() {
+               return new PartList(this);
        }
 
        /**
@@ -44,7 +44,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder clear() {
+       public PartListBuilder clear() {
                parts.clear();
                return this;
        }
@@ -56,7 +56,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder add(Part value) {
+       public PartListBuilder add(Part value) {
                if (value != null)
                        parts.add(value);
                return this;
@@ -70,7 +70,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder add(String name, String value) {
+       public PartListBuilder add(String name, String value) {
                parts.add(new BasicPart(name, value));
                return this;
        }
@@ -82,7 +82,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder add(Part...values) {
+       public PartListBuilder add(Part...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        add(values[i]);
                return this;
@@ -95,7 +95,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder add(List<Part> values) {
+       public PartListBuilder add(List<Part> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        add(values.get(i));
                return this;
@@ -108,7 +108,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder remove(Part value) {
+       public PartListBuilder remove(Part value) {
                if (value != null)
                        parts.remove(value);
                return this;
@@ -121,7 +121,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder remove(Part...values) {
+       public PartListBuilder remove(Part...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        remove(values[i]);
                return this;
@@ -134,7 +134,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder remove(List<Part> values) {
+       public PartListBuilder remove(List<Part> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        remove(values.get(i));
                return this;
@@ -147,7 +147,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder remove(String name) {
+       public PartListBuilder remove(String name) {
                for (int i = 0; i < parts.size(); i++) /* See HTTPCORE-361 */
                        if (parts.get(i).getName().equals(name))
                                parts.remove(i--);
@@ -164,7 +164,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder update(Part value) {
+       public PartListBuilder update(Part value) {
                if (value == null)
                        return this;
 
@@ -190,7 +190,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder update(Part...values) {
+       public PartListBuilder update(Part...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
                        update(values[i]);
                return this;
@@ -206,14 +206,14 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder update(List<Part> values) {
+       public PartListBuilder update(List<Part> values) {
                for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
                        update(values.get(i));
                return this;
        }
 
        /**
-        * Sets all of the headers contained within this group overriding any 
existing headers.
+        * Sets all of the headers contained within this list overriding any 
existing headers.
         *
         * <p>
         * The headers are added in the order in which they appear in the array.
@@ -222,14 +222,14 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder set(Part...values) {
+       public PartListBuilder set(Part...values) {
                clear();
                Collections.addAll(parts, values);
                return this;
        }
 
        /**
-        * Sets all of the headers contained within this group overriding any 
existing headers.
+        * Sets all of the headers contained within this list overriding any 
existing headers.
         *
         * <p>
         * The headers are added in the order in which they appear in the list.
@@ -238,7 +238,7 @@ public class PartGroupBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public PartGroupBuilder set(List<Part> values) {
+       public PartListBuilder set(List<Part> values) {
                clear();
                parts.addAll(values);
                return this;
@@ -254,7 +254,7 @@ public class PartGroupBuilder {
         * @param values The values to append or replace in this list.
         * @return This object (for method chaining).
         */
-       public PartGroupBuilder appendUnique(Part...values) {
+       public PartListBuilder appendUnique(Part...values) {
                for (Part h : values) {
                        boolean replaced = false;
                        for (ListIterator<Part> li = parts.listIterator(); 
li.hasNext();) {
@@ -282,7 +282,7 @@ public class PartGroupBuilder {
         * @param values The values to append or replace in this list.
         * @return This object (for method chaining).
         */
-       public PartGroupBuilder appendUnique(Collection<Part> values) {
+       public PartListBuilder appendUnique(Collection<Part> values) {
                for (Part h : values) {
                        boolean replaced = false;
                        for (ListIterator<Part> li = parts.listIterator(); 
li.hasNext();) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
index c870d17..279abdd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpException.java
@@ -48,10 +48,11 @@ import org.apache.juneau.http.header.*;
 public class BasicHttpException extends BasicRuntimeException implements 
HttpResponse {
 
        private static final long serialVersionUID = 1L;
+       private static final Header[] EMPTY_HEADERS = new Header[0];
 
-       HeaderGroup headerGroup;
+       HeaderList headerList;
        BasicStatusLine statusLine;
-       HeaderGroupBuilder headerGroupBuilder;
+       HeaderListBuilder headerListBuilder;
        BasicStatusLineBuilder statusLineBuilder;
        HttpEntity body;
 
@@ -72,7 +73,7 @@ public class BasicHttpException extends BasicRuntimeException 
implements HttpRes
         */
        public BasicHttpException(HttpExceptionBuilder<?> builder) {
                super(builder);
-               headerGroup = builder.headerGroup();
+               headerList = builder.headerList();
                statusLine = builder.statusLine();
                body = builder.body;
        }
@@ -254,73 +255,75 @@ public class BasicHttpException extends 
BasicRuntimeException implements HttpRes
 
        @Override /* HttpMessage */
        public boolean containsHeader(String name) {
-               return headerGroup().containsHeader(name);
+               return headerList().contains(name);
        }
 
        @Override /* HttpMessage */
        public Header[] getHeaders(String name) {
-               return headerGroup().getHeaders(name);
+               List<Header> l = headerList().get(name);
+               return l.isEmpty() ? EMPTY_HEADERS : l.toArray(new 
Header[l.size()]);
        }
 
        @Override /* HttpMessage */
        public Header getFirstHeader(String name) {
-               return headerGroup().getFirstHeader(name);
+               return headerList().getFirst(name);
        }
 
        @Override /* HttpMessage */
        public Header getLastHeader(String name) {
-               return headerGroup().getLastHeader(name);
+               return headerList().getLast(name);
        }
 
        @Override /* HttpMessage */
        @ResponseHeader("*")
        public Header[] getAllHeaders() {
-               return headerGroup().getAllHeaders().toArray(new Header[0]);
+               List<Header> l = headerList().getAll();
+               return l.isEmpty() ? EMPTY_HEADERS : l.toArray(new 
Header[l.size()]);
        }
 
        @Override /* HttpMessage */
        public void addHeader(Header value) {
-               headerGroupBuilder().add(value).build();
+               headerListBuilder().add(value).build();
        }
 
        @Override /* HttpMessage */
        public void addHeader(String name, String value) {
-               headerGroupBuilder().add(new BasicHeader(name, value)).build();
+               headerListBuilder().add(new BasicHeader(name, value)).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(Header value) {
-               headerGroupBuilder().update(value).build();
+               headerListBuilder().update(value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(String name, String value) {
-               headerGroupBuilder().update(new BasicHeader(name, 
value)).build();
+               headerListBuilder().update(new BasicHeader(name, 
value)).build();
        }
 
        @Override /* HttpMessage */
        public void setHeaders(Header[] values) {
-               headerGroupBuilder().set(values).build();
+               headerListBuilder().set(values).build();
        }
 
        @Override /* HttpMessage */
        public void removeHeader(Header value) {
-               headerGroupBuilder().remove(value).build();
+               headerListBuilder().remove(value).build();
        }
 
        @Override /* HttpMessage */
        public void removeHeaders(String name) {
-               headerGroupBuilder().remove(name).build();
+               headerListBuilder().remove(name).build();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return headerGroup().iterator();
+               return headerList().headerIterator();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return headerGroup().iterator(name);
+               return headerList().headerIterator(name);
        }
 
        @SuppressWarnings("deprecation")
@@ -402,12 +405,12 @@ public class BasicHttpException extends 
BasicRuntimeException implements HttpRes
                return statusLine;
        }
 
-       private HeaderGroup headerGroup() {
-               if (headerGroup == null) {
-                       headerGroup = headerGroupBuilder.build();
-                       headerGroupBuilder = null;
+       private HeaderList headerList() {
+               if (headerList == null) {
+                       headerList = headerListBuilder.build();
+                       headerListBuilder = null;
                }
-               return headerGroup;
+               return headerList;
        }
 
        private BasicStatusLineBuilder statusLineBuilder() {
@@ -419,12 +422,12 @@ public class BasicHttpException extends 
BasicRuntimeException implements HttpRes
                return statusLineBuilder;
        }
 
-       private HeaderGroupBuilder headerGroupBuilder() {
+       private HeaderListBuilder headerListBuilder() {
                assertModifiable();
-               if (headerGroupBuilder == null) {
-                       headerGroupBuilder = headerGroup.builder();
-                       headerGroup = null;
+               if (headerListBuilder == null) {
+                       headerListBuilder = headerList.builder();
+                       headerList = null;
                }
-               return headerGroupBuilder;
+               return headerListBuilder;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
index 416e85a..20039f3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/BasicHttpResponse.java
@@ -43,9 +43,11 @@ import org.apache.juneau.http.header.*;
 @BeanIgnore
 public class BasicHttpResponse implements HttpResponse {
 
-       HeaderGroup headerGroup;
+       private static final Header[] EMPTY_HEADERS = new Header[0];
+
+       HeaderList headerList;
        BasicStatusLine statusLine;
-       HeaderGroupBuilder headerGroupBuilder;
+       HeaderListBuilder headerListBuilder;
        BasicStatusLineBuilder statusLineBuilder;
        HttpEntity body;
        final boolean unmodifiable;
@@ -66,7 +68,7 @@ public class BasicHttpResponse implements HttpResponse {
         * @param builder The builder containing the arguments for this bean.
         */
        public BasicHttpResponse(HttpResponseBuilder<?> builder) {
-               headerGroup = builder.headerGroup();
+               headerList = builder.headerList();
                statusLine = builder.statusLine();
                body = builder.body;
                unmodifiable = builder.unmodifiable;
@@ -119,7 +121,7 @@ public class BasicHttpResponse implements HttpResponse {
 
        @Override /* Object */
        public String toString() {
-               StringBuilder sb = new 
StringBuilder().append(statusLine()).append(' ').append(headerGroup());
+               StringBuilder sb = new 
StringBuilder().append(statusLine()).append(' ').append(headerList());
                if (body != null)
                        sb.append(' ').append(body);
                return sb.toString();
@@ -132,73 +134,75 @@ public class BasicHttpResponse implements HttpResponse {
 
        @Override /* HttpMessage */
        public boolean containsHeader(String name) {
-               return headerGroup().containsHeader(name);
+               return headerList().contains(name);
        }
 
        @Override /* HttpMessage */
        public Header[] getHeaders(String name) {
-               return headerGroup().getHeaders(name);
+               List<Header> l = headerList().get(name);
+               return l.isEmpty() ? EMPTY_HEADERS : l.toArray(new 
Header[l.size()]);
        }
 
        @Override /* HttpMessage */
        public Header getFirstHeader(String name) {
-               return headerGroup().getFirstHeader(name);
+               return headerList().getFirst(name);
        }
 
        @Override /* HttpMessage */
        public Header getLastHeader(String name) {
-               return headerGroup().getLastHeader(name);
+               return headerList().getLast(name);
        }
 
        @Override /* HttpMessage */
        @ResponseHeader("*")
        public Header[] getAllHeaders() {
-               return headerGroup().getAllHeaders().toArray(new Header[0]);
+               List<Header> l = headerList().getAll();
+               return l.isEmpty() ? EMPTY_HEADERS : l.toArray(new 
Header[l.size()]);
        }
 
        @Override /* HttpMessage */
        public void addHeader(Header value) {
-               headerGroupBuilder().add(value).build();
+               headerListBuilder().add(value).build();
        }
 
        @Override /* HttpMessage */
        public void addHeader(String name, String value) {
-               headerGroupBuilder().add(new BasicHeader(name, value)).build();
+               headerListBuilder().add(new BasicHeader(name, value)).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(Header value) {
-               headerGroupBuilder().update(value).build();
+               headerListBuilder().update(value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(String name, String value) {
-               headerGroupBuilder().update(new BasicHeader(name, 
value)).build();
+               headerListBuilder().update(new BasicHeader(name, 
value)).build();
        }
 
        @Override /* HttpMessage */
        public void setHeaders(Header[] values) {
-               headerGroupBuilder().set(values).build();
+               headerListBuilder().set(values).build();
        }
 
        @Override /* HttpMessage */
        public void removeHeader(Header value) {
-               headerGroupBuilder().remove(value).build();
+               headerListBuilder().remove(value).build();
        }
 
        @Override /* HttpMessage */
        public void removeHeaders(String name) {
-               headerGroupBuilder().remove(name).build();
+               headerListBuilder().remove(name).build();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator() {
-               return headerGroup().iterator();
+               return headerList().headerIterator();
        }
 
        @Override /* HttpMessage */
        public HeaderIterator headerIterator(String name) {
-               return headerGroup().iterator(name);
+               return headerList().headerIterator(name);
        }
 
        @SuppressWarnings("deprecation")
@@ -280,12 +284,12 @@ public class BasicHttpResponse implements HttpResponse {
                return statusLine;
        }
 
-       private HeaderGroup headerGroup() {
-               if (headerGroup == null) {
-                       headerGroup = headerGroupBuilder.build();
-                       headerGroupBuilder = null;
+       private HeaderList headerList() {
+               if (headerList == null) {
+                       headerList = headerListBuilder.build();
+                       headerListBuilder = null;
                }
-               return headerGroup;
+               return headerList;
        }
 
        private BasicStatusLineBuilder statusLineBuilder() {
@@ -297,13 +301,13 @@ public class BasicHttpResponse implements HttpResponse {
                return statusLineBuilder;
        }
 
-       private HeaderGroupBuilder headerGroupBuilder() {
+       private HeaderListBuilder headerListBuilder() {
                assertModifiable();
-               if (headerGroupBuilder == null) {
-                       headerGroupBuilder = headerGroup.builder();
-                       headerGroup = null;
+               if (headerListBuilder == null) {
+                       headerListBuilder = headerList.builder();
+                       headerList = null;
                }
-               return headerGroupBuilder;
+               return headerListBuilder;
        }
 
        /**
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 462c8c6..316ba80 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
@@ -32,9 +32,9 @@ import org.apache.juneau.internal.*;
 public class HttpExceptionBuilder<T extends BasicHttpException> extends 
BasicRuntimeExceptionBuilder {
 
        BasicStatusLine statusLine;
-       HeaderGroup headerGroup = HeaderGroup.INSTANCE;
+       HeaderList headerList = HeaderList.EMPTY;
        BasicStatusLineBuilder statusLineBuilder;
-       HeaderGroupBuilder headerGroupBuilder;
+       HeaderListBuilder headerListBuilder;
        HttpEntity body;
 
        private final Class<? extends BasicHttpException> implClass;
@@ -88,7 +88,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
        public HttpExceptionBuilder<T> copyFrom(BasicHttpException value) {
                super.copyFrom(value);
                statusLine = value.statusLine;
-               headerGroup = value.headerGroup;
+               headerList = value.headerList;
                body = value.body;
                return this;
        }
@@ -99,12 +99,12 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
                return statusLine;
        }
 
-       HeaderGroup headerGroup() {
-               if (headerGroupBuilder != null)
-                       return headerGroupBuilder.build();
-               if (headerGroup == null)
-                       return HeaderGroup.INSTANCE;
-               return headerGroup;
+       HeaderList headerList() {
+               if (headerListBuilder != null)
+                       return headerListBuilder.build();
+               if (headerList == null)
+                       return HeaderList.EMPTY;
+               return headerList;
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -217,9 +217,9 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HttpExceptionBuilder<T> headerGroup(HeaderGroup value) {
-               headerGroup = value;
-               headerGroupBuilder = null;
+       public HttpExceptionBuilder<T> headerList(HeaderList value) {
+               headerList = value;
+               headerListBuilder = null;
                return this;
        }
 
@@ -229,7 +229,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> clearHeaders() {
-               headerGroupBuilder().clear();
+               headerListBuilder().clear();
                return this;
        }
 
@@ -240,7 +240,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> header(Header value) {
-               headerGroupBuilder().add(value);
+               headerListBuilder().add(value);
                return this;
        }
 
@@ -252,7 +252,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> header(String name, String value) {
-               headerGroupBuilder().add(name, value);
+               headerListBuilder().add(name, value);
                return this;
        }
 
@@ -263,7 +263,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> headers(Header...values) {
-               headerGroupBuilder().add(values);
+               headerListBuilder().add(values);
                return this;
        }
 
@@ -274,7 +274,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> headers(List<Header> values) {
-               headerGroupBuilder().add(values);
+               headerListBuilder().add(values);
                return this;
        }
 
@@ -285,7 +285,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> removeHeader(Header value) {
-               headerGroupBuilder().remove(value);
+               headerListBuilder().remove(value);
                return this;
        }
 
@@ -296,7 +296,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> removeHeaders(Header...values) {
-               headerGroupBuilder().remove(values);
+               headerListBuilder().remove(values);
                return this;
        }
 
@@ -307,7 +307,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> removeHeaders(List<Header> values) {
-               headerGroupBuilder().remove(values);
+               headerListBuilder().remove(values);
                return this;
        }
 
@@ -321,7 +321,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> updateHeader(Header value) {
-               headerGroupBuilder().update(value);
+               headerListBuilder().update(value);
                return this;
        }
 
@@ -335,7 +335,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> updateHeaders(Header...values) {
-               headerGroupBuilder().update(values);
+               headerListBuilder().update(values);
                return this;
        }
 
@@ -349,7 +349,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> updateHeaders(List<Header> values) {
-               headerGroupBuilder().update(values);
+               headerListBuilder().update(values);
                return this;
        }
 
@@ -363,7 +363,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> setHeaders(Header...values) {
-               headerGroupBuilder().set(values);
+               headerListBuilder().set(values);
                return this;
        }
 
@@ -377,7 +377,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> setHeaders(List<Header> values) {
-               headerGroupBuilder().set(values);
+               headerListBuilder().set(values);
                return this;
        }
 
@@ -421,12 +421,12 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
                return statusLineBuilder;
        }
 
-       private HeaderGroupBuilder headerGroupBuilder() {
-               if (headerGroupBuilder == null) {
-                       headerGroupBuilder = headerGroup == null ? 
HeaderGroup.create() : headerGroup.builder();
-                       headerGroup = null;
+       private HeaderListBuilder headerListBuilder() {
+               if (headerListBuilder == null) {
+                       headerListBuilder = headerList == null ? 
HeaderList.create() : headerList.builder();
+                       headerList = null;
                }
-               return headerGroupBuilder;
+               return headerListBuilder;
        }
 
        // <FluentSetters>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponseBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponseBuilder.java
index 72856f8..3c43891 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponseBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/response/HttpResponseBuilder.java
@@ -32,9 +32,9 @@ import org.apache.juneau.internal.*;
 public class HttpResponseBuilder<T extends BasicHttpResponse> {
 
        BasicStatusLine statusLine;
-       HeaderGroup headerGroup = HeaderGroup.INSTANCE;
+       HeaderList headerList = HeaderList.EMPTY;
        BasicStatusLineBuilder statusLineBuilder;
-       HeaderGroupBuilder headerGroupBuilder;
+       HeaderListBuilder headerListBuilder;
        HttpEntity body;
        boolean unmodifiable;
        
@@ -85,7 +85,7 @@ public class HttpResponseBuilder<T extends BasicHttpResponse> 
{
         */
        public HttpResponseBuilder<T> copyFrom(BasicHttpResponse value) {
                statusLine = value.statusLine;
-               headerGroup = value.headerGroup;
+               headerList = value.headerList;
                body = value.body;
                return this;
        }
@@ -96,12 +96,12 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
                return statusLine;
        }
 
-       HeaderGroup headerGroup() {
-               if (headerGroupBuilder != null)
-                       return headerGroupBuilder.build();
-               if (headerGroup == null)
-                       return HeaderGroup.INSTANCE;
-               return headerGroup;
+       HeaderList headerList() {
+               if (headerListBuilder != null)
+                       return headerListBuilder.build();
+               if (headerList == null)
+                       return HeaderList.EMPTY;
+               return headerList;
        }
 
        /**
@@ -225,9 +225,9 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HttpResponseBuilder<T> headerGroup(HeaderGroup value) {
-               headerGroup = value;
-               headerGroupBuilder = null;
+       public HttpResponseBuilder<T> headerList(HeaderList value) {
+               headerList = value;
+               headerListBuilder = null;
                return this;
        }
 
@@ -237,7 +237,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> clearHeaders() {
-               headerGroupBuilder().clear();
+               headerListBuilder().clear();
                return this;
        }
 
@@ -248,7 +248,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> header(Header value) {
-               headerGroupBuilder().add(value);
+               headerListBuilder().add(value);
                return this;
        }
 
@@ -260,7 +260,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> header(String name, String value) {
-               headerGroupBuilder().add(name, value);
+               headerListBuilder().add(name, value);
                return this;
        }
 
@@ -271,7 +271,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> headers(Header...values) {
-               headerGroupBuilder().add(values);
+               headerListBuilder().add(values);
                return this;
        }
 
@@ -282,7 +282,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> headers(List<Header> values) {
-               headerGroupBuilder().add(values);
+               headerListBuilder().add(values);
                return this;
        }
 
@@ -293,7 +293,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> removeHeader(Header value) {
-               headerGroupBuilder().remove(value);
+               headerListBuilder().remove(value);
                return this;
        }
 
@@ -304,7 +304,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> removeHeaders(Header...values) {
-               headerGroupBuilder().remove(values);
+               headerListBuilder().remove(values);
                return this;
        }
 
@@ -315,7 +315,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> removeHeaders(List<Header> values) {
-               headerGroupBuilder().remove(values);
+               headerListBuilder().remove(values);
                return this;
        }
 
@@ -329,7 +329,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeader(Header value) {
-               headerGroupBuilder().update(value);
+               headerListBuilder().update(value);
                return this;
        }
 
@@ -343,7 +343,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeaders(Header...values) {
-               headerGroupBuilder().update(values);
+               headerListBuilder().update(values);
                return this;
        }
 
@@ -357,7 +357,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeaders(List<Header> values) {
-               headerGroupBuilder().update(values);
+               headerListBuilder().update(values);
                return this;
        }
 
@@ -371,7 +371,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> setHeaders(Header...values) {
-               headerGroupBuilder().set(values);
+               headerListBuilder().set(values);
                return this;
        }
 
@@ -385,7 +385,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> setHeaders(List<Header> values) {
-               headerGroupBuilder().set(values);
+               headerListBuilder().set(values);
                return this;
        }
 
@@ -453,12 +453,12 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
                return statusLineBuilder;
        }
 
-       private HeaderGroupBuilder headerGroupBuilder() {
-               if (headerGroupBuilder == null) {
-                       headerGroupBuilder = headerGroup == null ? 
HeaderGroup.create() : headerGroup.builder();
-                       headerGroup = null;
+       private HeaderListBuilder headerListBuilder() {
+               if (headerListBuilder == null) {
+                       headerListBuilder = headerList == null ? 
HeaderList.create() : headerList.builder();
+                       headerList = null;
                }
-               return headerGroupBuilder;
+               return headerListBuilder;
        }
 
        // <FluentSetters>
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 f39260a..aa7e8ba 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
@@ -3366,7 +3366,7 @@ public class RestContext extends BeanContext {
        private final List<MediaType>
                consumes,
                produces;
-       private final HeaderGroup defaultRequestHeaders, defaultResponseHeaders;
+       private final HeaderList defaultRequestHeaders, defaultResponseHeaders;
        private final List<NamedAttribute> defaultRequestAttributes;
        private final List<ResponseHandler> responseHandlers;
        private final Messages messages;
@@ -5152,16 +5152,16 @@ public class RestContext extends BeanContext {
         * @return The default request headers for this REST object.
         * @throws Exception If stack trace store could not be instantiated.
         */
-       protected HeaderGroupBuilder createDefaultRequestHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
+       protected HeaderListBuilder createDefaultRequestHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
 
-               HeaderGroupBuilder x = HeaderGroup.create();
+               HeaderListBuilder x = HeaderList.create();
 
                
x.appendUnique(properties.getInstanceArray(REST_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(HeaderGroupBuilder.class, x)
-                       .beanCreateMethodFinder(HeaderGroupBuilder.class, 
resource)
+                       .addBean(HeaderListBuilder.class, x)
+                       .beanCreateMethodFinder(HeaderListBuilder.class, 
resource)
                        .find("createDefaultRequestHeaders")
                        .withDefault(x)
                        .run();
@@ -5183,16 +5183,16 @@ public class RestContext extends BeanContext {
         * @return The default response headers for this REST object.
         * @throws Exception If stack trace store could not be instantiated.
         */
-       protected HeaderGroupBuilder createDefaultResponseHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
+       protected HeaderListBuilder createDefaultResponseHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore) throws Exception {
 
-               HeaderGroupBuilder x = HeaderGroup.create();
+               HeaderListBuilder x = HeaderList.create();
 
                
x.appendUnique(properties.getInstanceArray(REST_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(HeaderGroupBuilder.class, x)
-                       .beanCreateMethodFinder(HeaderGroupBuilder.class, 
resource)
+                       .addBean(HeaderListBuilder.class, x)
+                       .beanCreateMethodFinder(HeaderListBuilder.class, 
resource)
                        .find("createDefaultResponseHeaders")
                        .withDefault(x)
                        .run();
@@ -6308,7 +6308,7 @@ public class RestContext extends BeanContext {
         *      The default request headers for this resource in an 
unmodifiable list.
         *      <br>Never <jk>null</jk>.
         */
-       public HeaderGroup getDefaultRequestHeaders() {
+       public HeaderList getDefaultRequestHeaders() {
                return defaultRequestHeaders;
        }
 
@@ -6338,7 +6338,7 @@ public class RestContext extends BeanContext {
         *      The default response headers for this resource in an 
unmodifiable list.
         *      <br>Never <jk>null</jk>.
         */
-       public HeaderGroup getDefaultResponseHeaders() {
+       public HeaderList getDefaultResponseHeaders() {
                return defaultResponseHeaders;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
index d6b9491..47328d9 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOperationContext.java
@@ -661,8 +661,8 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
        private final HttpPartSerializer partSerializer;
        private final HttpPartParser partParser;
        private final JsonSchemaGenerator jsonSchemaGenerator;
-       private final HeaderGroup defaultRequestHeaders, defaultResponseHeaders;
-       private final PartGroup defaultRequestQuery, defaultRequestFormData;
+       private final HeaderList defaultRequestHeaders, defaultResponseHeaders;
+       private final PartList defaultRequestQuery, defaultRequestFormData;
        private final List<NamedAttribute> defaultRequestAttributes;
        private final Charset defaultCharset;
        private final long maxInput;
@@ -1350,11 +1350,11 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         * @return The default request headers for this method.
         * @throws Exception If default request headers could not be 
instantiated.
         */
-       protected HeaderGroupBuilder createDefaultRequestHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore, Method method, 
RestContext context) throws Exception {
+       protected HeaderListBuilder createDefaultRequestHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore, Method method, 
RestContext context) throws Exception {
 
-               HeaderGroupBuilder x = HeaderGroup.create();
+               HeaderListBuilder x = HeaderList.create();
 
-               
x.appendUnique(context.getDefaultRequestHeaders().getAllHeaders());
+               x.appendUnique(context.getDefaultRequestHeaders().getAll());
 
                
x.appendUnique(properties.getInstanceArray(RESTOP_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
@@ -1376,8 +1376,8 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(HeaderGroupBuilder.class, x)
-                       .beanCreateMethodFinder(HeaderGroupBuilder.class, 
resource)
+                       .addBean(HeaderListBuilder.class, x)
+                       .beanCreateMethodFinder(HeaderListBuilder.class, 
resource)
                        .find("createDefaultRequestHeaders", Method.class)
                        .withDefault(x)
                        .run();
@@ -1396,18 +1396,18 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         * @return The default request headers for this method.
         * @throws Exception If default request headers could not be 
instantiated.
         */
-       protected HeaderGroupBuilder createDefaultResponseHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore, Method method, 
RestContext context) throws Exception {
+       protected HeaderListBuilder createDefaultResponseHeaders(Object 
resource, ContextProperties properties, BeanStore beanStore, Method method, 
RestContext context) throws Exception {
 
-               HeaderGroupBuilder x = HeaderGroup.create();
+               HeaderListBuilder x = HeaderList.create();
 
-               
x.appendUnique(context.getDefaultResponseHeaders().getAllHeaders());
+               x.appendUnique(context.getDefaultResponseHeaders().getAll());
 
                
x.appendUnique(properties.getInstanceArray(RESTOP_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(HeaderGroupBuilder.class, x)
-                       .beanCreateMethodFinder(HeaderGroupBuilder.class, 
resource)
+                       .addBean(HeaderListBuilder.class, x)
+                       .beanCreateMethodFinder(HeaderListBuilder.class, 
resource)
                        .find("createDefaultResponseHeaders", Method.class)
                        .withDefault(x)
                        .run();
@@ -1454,9 +1454,9 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         * @return The default request query parameters for this method.
         * @throws Exception If default request query parameters could not be 
instantiated.
         */
-       protected PartGroupBuilder createDefaultRequestQuery(Object resource, 
ContextProperties properties, BeanStore beanStore, Method method) throws 
Exception {
+       protected PartListBuilder createDefaultRequestQuery(Object resource, 
ContextProperties properties, BeanStore beanStore, Method method) throws 
Exception {
 
-               PartGroupBuilder x = PartGroup.create();
+               PartListBuilder x = PartList.create();
 
                x.appendUnique(properties.getInstanceArray(RESTOP_defaultQuery, 
Part.class, beanStore).orElse(new Part[0]));
 
@@ -1478,8 +1478,8 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(PartGroupBuilder.class, x)
-                       .beanCreateMethodFinder(PartGroupBuilder.class, 
resource)
+                       .addBean(PartListBuilder.class, x)
+                       .beanCreateMethodFinder(PartListBuilder.class, resource)
                        .find("createDefaultRequestQuery", Method.class)
                        .thenFind("createDefaultRequestQuery")
                        .withDefault(x)
@@ -1498,9 +1498,9 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         * @return The default request form-data parameters for this method.
         * @throws Exception If default request form-data parameters could not 
be instantiated.
         */
-       protected PartGroupBuilder createDefaultRequestFormData(Object 
resource, ContextProperties properties, BeanStore beanStore, Method method) 
throws Exception {
+       protected PartListBuilder createDefaultRequestFormData(Object resource, 
ContextProperties properties, BeanStore beanStore, Method method) throws 
Exception {
 
-               PartGroupBuilder x = PartGroup.create();
+               PartListBuilder x = PartList.create();
 
                
x.appendUnique(properties.getInstanceArray(RESTOP_defaultFormData, Part.class, 
beanStore).orElse(new Part[0]));
 
@@ -1522,8 +1522,8 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
 
                x = BeanStore
                        .of(beanStore, resource)
-                       .addBean(PartGroupBuilder.class, x)
-                       .beanCreateMethodFinder(PartGroupBuilder.class, 
resource)
+                       .addBean(PartListBuilder.class, x)
+                       .beanCreateMethodFinder(PartListBuilder.class, resource)
                        .find("createDefaultRequestFormData", Method.class)
                        .thenFind("createDefaultRequestFormData")
                        .withDefault(x)
@@ -1695,7 +1695,7 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         *
         * @return The default request headers.  Never <jk>null</jk>.
         */
-       public HeaderGroup getDefaultRequestHeaders() {
+       public HeaderList getDefaultRequestHeaders() {
                return defaultRequestHeaders;
        }
 
@@ -1704,7 +1704,7 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         *
         * @return The default response headers.  Never <jk>null</jk>.
         */
-       public HeaderGroup getDefaultResponseHeaders() {
+       public HeaderList getDefaultResponseHeaders() {
                return defaultResponseHeaders;
        }
 
@@ -1713,7 +1713,7 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         *
         * @return The default request query parameters.  Never <jk>null</jk>.
         */
-       public PartGroup getDefaultRequestQuery() {
+       public PartList getDefaultRequestQuery() {
                return defaultRequestQuery;
        }
 
@@ -1722,7 +1722,7 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
         *
         * @return The default form data parameters.  Never <jk>null</jk>.
         */
-       public PartGroup getDefaultRequestFormData() {
+       public PartList getDefaultRequestFormData() {
                return defaultRequestFormData;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index ab676ca..09de6f0 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -188,12 +188,12 @@ public final class RestRequest {
                pathParams.parser(partParserSession);
 
                queryParams
-                       
.addDefault(opContext.getDefaultRequestQuery().getAllParts())
+                       .addDefault(opContext.getDefaultRequestQuery().getAll())
                        .parser(partParserSession);
 
                headers
-                       
.addDefault(opContext.getDefaultRequestHeaders().getAllHeaders())
-                       
.addDefault(context.getDefaultRequestHeaders().getAllHeaders())
+                       
.addDefault(opContext.getDefaultRequestHeaders().getAll())
+                       .addDefault(context.getDefaultRequestHeaders().getAll())
                        .parser(partParserSession);
 
                body
@@ -1169,7 +1169,7 @@ public final class RestRequest {
                try {
                        if (formParams == null)
                                formParams = new RequestFormParams(this, 
true).parser(partParserSession);
-                       
formParams.addDefault(opContext.getDefaultRequestFormData().getAllParts());
+                       
formParams.addDefault(opContext.getDefaultRequestFormData().getAll());
                        return formParams;
                } catch (Exception e) {
                        throw new InternalServerError(e);
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
index 03897b0..326dc6f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -110,9 +110,9 @@ public final class RestResponse {
                        }
                }
 
-               for (Header e : 
request.getContext().getDefaultResponseHeaders().getAllHeaders())
+               for (Header e : 
request.getContext().getDefaultResponseHeaders().getAll())
                        setHeaderSafe(e.getName(), stringify(e.getValue()));
-               for (Header e : 
opContext.getDefaultResponseHeaders().getAllHeaders())
+               for (Header e : opContext.getDefaultResponseHeaders().getAll())
                        setHeaderSafe(e.getName(), stringify(e.getValue()));
 
                if (charset == null)

Reply via email to