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 0f1b357  REST refactoring.
0f1b357 is described below

commit 0f1b35716961989733cf6da09a008d5f0d053e17
Author: JamesBognar <[email protected]>
AuthorDate: Fri Mar 12 14:49:38 2021 -0500

    REST refactoring.
---
 .../apache/juneau/config/event/ConfigEvents.java   |   4 +-
 .../apache/juneau/config/internal/ConfigMap.java   |   4 +-
 .../juneau/config/store/ConfigClasspathStore.java  |   4 +-
 .../juneau/config/store/ConfigFileStore.java       |   6 +-
 .../juneau/config/store/ConfigMemoryStore.java     |   4 +-
 .../java/org/apache/juneau/dto/html5/Select.java   |   5 +-
 .../org/apache/juneau/dto/swagger/Operation.java   |   4 +-
 .../apache/juneau/annotation/NotThreadSafe.java}   |  43 +---
 .../org/apache/juneau/annotation/ThreadSafe.java}  |  43 +---
 .../juneau/assertions/FluentBaseAssertion.java     |   4 +-
 .../juneau/assertions/FluentStringAssertion.java   |  12 +-
 .../juneau/http/header/BasicCsvArrayHeader.java    |   4 +-
 .../org/apache/juneau/http/header/BasicHeader.java |   2 +-
 .../org/apache/juneau/http/header/HeaderList.java  |  68 +++++--
 .../juneau/http/header/HeaderListBuilder.java      | 223 ++++++++++++---------
 .../juneau/http/header/SerializedHeader.java       |  21 ++
 .../apache/juneau/http/part/BasicCsvArrayPart.java |   4 +-
 .../juneau/http/resource/HttpResourceBuilder.java  |  18 +-
 .../juneau/http/response/BasicHttpException.java   |  10 +-
 .../juneau/http/response/BasicHttpResponse.java    |  10 +-
 .../juneau/http/response/HttpExceptionBuilder.java |  18 +-
 .../juneau/http/response/HttpResponseBuilder.java  |  18 +-
 .../org/apache/juneau/internal/ArrayUtils.java     |   2 +-
 .../org/apache/juneau/internal/StringUtils.java    |  21 +-
 .../org/apache/juneau/utils/ReflectionMap.java     |  12 +-
 .../apache/juneau/xml/XmlSerializerSession.java    |   4 +-
 .../org/apache/juneau/rest/client/RestClient.java  |   4 +-
 .../apache/juneau/rest/client/RestResponse.java    |   8 +-
 .../juneau/rest/client/remote/RemoteMeta.java      |   6 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   4 +-
 .../apache/juneau/rest/RestOperationContext.java   |  10 +-
 .../apache/juneau/config/ConfigImportsTest.java    |   4 +-
 .../org/apache/juneau/http/HeaderList_Test.java    |  37 ++--
 .../org/apache/juneau/http/remote/Remote_Test.java |   4 +-
 .../juneau/transforms/OneWayStringSwapTest.java    |   2 +-
 .../juneau/transforms/RoundTripStringSwapTest.java |   4 +-
 36 files changed, 350 insertions(+), 301 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
index 2aea3d6..f671885 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
@@ -30,7 +30,7 @@ public class ConfigEvents extends ArrayList<ConfigEvent> {
         */
        public boolean isSectionModified(String name) {
                for (ConfigEvent ce : this)
-                       if (isEquals(name, ce.getSection()))
+                       if (eq(name, ce.getSection()))
                                return true;
                return false;
        }
@@ -44,7 +44,7 @@ public class ConfigEvents extends ArrayList<ConfigEvent> {
         */
        public boolean isKeyModified(String section, String key) {
                for (ConfigEvent ce : this)
-                       if (isEquals(section, ce.getSection()) && isEquals(key, 
ce.getKey()))
+                       if (eq(section, ce.getSection()) && eq(key, 
ce.getKey()))
                                return true;
                return false;
        }
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMap.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMap.java
index 105fe3f..318e3bc 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMap.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMap.java
@@ -613,7 +613,7 @@ public class ConfigMap implements ConfigStoreListener {
                ConfigEvents changes = null;
                writeLock();
                try {
-                       if (! StringUtils.isEquals(contents, newContents)) {
+                       if (ne(contents, newContents)) {
                                changes = findDiffs(newContents);
                                load(newContents);
 
@@ -831,7 +831,7 @@ public class ConfigMap implements ConfigStoreListener {
                        } else {
                                for (ConfigEntry ne : ns.oentries.values()) {
                                        ConfigEntry e = s.oentries.get(ne.key);
-                                       if (e == null || ! isEquals(e.value, 
ne.value)) {
+                                       if (e == null || ne(e.value, ne.value)) 
{
                                                
changes.add(ConfigEvent.setEntry(name, s.name, ne.key, ne.value, ne.modifiers, 
ne.comment, ne.preLines));
                                        }
                                }
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
index 73eceb9..e7a7af9 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigClasspathStore.java
@@ -95,12 +95,12 @@ public class ConfigClasspathStore extends ConfigStore {
        public synchronized String write(String name, String expectedContents, 
String newContents) throws IOException {
 
                // This is a no-op.
-               if (isEquals(expectedContents, newContents))
+               if (eq(expectedContents, newContents))
                        return null;
 
                String currentContents = read(name);
 
-               if (expectedContents != null && ! isEquals(currentContents, 
expectedContents))
+               if (expectedContents != null && ! eq(currentContents, 
expectedContents))
                        return currentContents;
 
                update(name, newContents);
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
index bad1445..1cc1148 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigFileStore.java
@@ -294,7 +294,7 @@ public class ConfigFileStore extends ConfigStore {
                name = resolveName(name);
 
                // This is a no-op.
-               if (isEquals(expectedContents, newContents))
+               if (eq(expectedContents, newContents))
                        return null;
 
                dir.mkdirs();
@@ -324,7 +324,7 @@ public class ConfigFileStore extends ConfigStore {
                                                        }
                                                        currentContents = 
sb.toString();
                                                }
-                                               if (expectedContents != null && 
! isEquals(currentContents, expectedContents)) {
+                                               if (expectedContents != null && 
! eq(currentContents, expectedContents)) {
                                                        if (currentContents == 
null)
                                                                
cache.remove(name);
                                                        else
@@ -493,7 +493,7 @@ public class ConfigFileStore extends ConfigStore {
                String oldContents = cache.get(fn);
                cache.remove(fn);
                String newContents = read(fn);
-               if (! isEquals(oldContents, newContents)) {
+               if (! eq(oldContents, newContents)) {
                        update(fn, newContents);
                }
        }
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
index 7dcf7c0..0984cdd 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigMemoryStore.java
@@ -82,12 +82,12 @@ public class ConfigMemoryStore extends ConfigStore {
        public synchronized String write(String name, String expectedContents, 
String newContents) {
 
                // This is a no-op.
-               if (isEquals(expectedContents, newContents))
+               if (eq(expectedContents, newContents))
                        return null;
 
                String currentContents = read(name);
 
-               if (expectedContents != null && ! isEquals(currentContents, 
expectedContents))
+               if (expectedContents != null && ! eq(currentContents, 
expectedContents))
                        return currentContents;
 
                update(name, newContents);
diff --git 
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java 
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
index 975d1fe..8750801 100644
--- 
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
+++ 
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
@@ -12,8 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.dto.html5;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import org.apache.juneau.annotation.*;
-import org.apache.juneau.internal.*;
 
 /**
  * DTO for an HTML {@doc ExtHTML5.forms#the-select-element <select>}
@@ -160,7 +161,7 @@ public class Select extends HtmlElementContainer {
                        for (Object o : getChildren()) {
                                if (o instanceof Option) {
                                        Option o2 = (Option)o;
-                                       if 
(StringUtils.isEquals(optionValue.toString(), o2.getAttr(String.class, 
"value")))
+                                       if (eq(optionValue.toString(), 
o2.getAttr(String.class, "value")))
                                                o2.selected(true);
                                }
                        }
diff --git 
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
 
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
index 89abfcc..817af3d 100644
--- 
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
+++ 
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
@@ -640,8 +640,8 @@ public class Operation extends SwaggerElement {
        public ParameterInfo getParameter(String in, String name) {
                if (parameters != null)
                        for (ParameterInfo pi : parameters)
-                               if (StringUtils.isEquals(pi.getIn(), in))
-                                       if (StringUtils.isEquals(pi.getName(), 
name) || "body".equals(pi.getIn()))
+                               if (eq(pi.getIn(), in))
+                                       if (eq(pi.getName(), name) || 
"body".equals(pi.getIn()))
                                                return pi;
                return null;
        }
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/NotThreadSafe.java
similarity index 58%
copy from 
juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
copy to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/NotThreadSafe.java
index 2aea3d6..fb941ca 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/NotThreadSafe.java
@@ -10,42 +10,17 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the 
License.                                              *
 // 
***************************************************************************************************************************
-package org.apache.juneau.config.event;
+package org.apache.juneau.annotation;
 
-import static org.apache.juneau.internal.StringUtils.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-import java.util.*;
+import java.lang.annotation.*;
 
 /**
- * Represents a list of {@link ConfigEvent} objects.
+ * Identifies a class as not thread safe.
  */
-public class ConfigEvents extends ArrayList<ConfigEvent> {
-       private static final long serialVersionUID = 1L;
-
-       /**
-        * Returns <jk>true</jk> if the specified section was modified in this 
list of events.
-        *
-        * @param name The section name.
-        * @return <jk>true</jk> if the specified section was modified in this 
list of events.
-        */
-       public boolean isSectionModified(String name) {
-               for (ConfigEvent ce : this)
-                       if (isEquals(name, ce.getSection()))
-                               return true;
-               return false;
-       }
-
-       /**
-        * Returns <jk>true</jk> if the specified key was modified in this list 
of events.
-        *
-        * @param section The section name.
-        * @param key The key name.
-        * @return <jk>true</jk> if the specified key was modified in this list 
of events.
-        */
-       public boolean isKeyModified(String section, String key) {
-               for (ConfigEvent ce : this)
-                       if (isEquals(section, ce.getSection()) && isEquals(key, 
ce.getKey()))
-                               return true;
-               return false;
-       }
-}
+@Documented
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface NotThreadSafe {}
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/ThreadSafe.java
similarity index 58%
copy from 
juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
copy to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/ThreadSafe.java
index 2aea3d6..823e88f 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvents.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/ThreadSafe.java
@@ -10,42 +10,17 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the 
License.                                              *
 // 
***************************************************************************************************************************
-package org.apache.juneau.config.event;
+package org.apache.juneau.annotation;
 
-import static org.apache.juneau.internal.StringUtils.*;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
 
-import java.util.*;
+import java.lang.annotation.*;
 
 /**
- * Represents a list of {@link ConfigEvent} objects.
+ * Identifies a class as thread safe.
  */
-public class ConfigEvents extends ArrayList<ConfigEvent> {
-       private static final long serialVersionUID = 1L;
-
-       /**
-        * Returns <jk>true</jk> if the specified section was modified in this 
list of events.
-        *
-        * @param name The section name.
-        * @return <jk>true</jk> if the specified section was modified in this 
list of events.
-        */
-       public boolean isSectionModified(String name) {
-               for (ConfigEvent ce : this)
-                       if (isEquals(name, ce.getSection()))
-                               return true;
-               return false;
-       }
-
-       /**
-        * Returns <jk>true</jk> if the specified key was modified in this list 
of events.
-        *
-        * @param section The section name.
-        * @param key The key name.
-        * @return <jk>true</jk> if the specified key was modified in this list 
of events.
-        */
-       public boolean isKeyModified(String section, String key) {
-               for (ConfigEvent ce : this)
-                       if (isEquals(section, ce.getSection()) && isEquals(key, 
ce.getKey()))
-                               return true;
-               return false;
-       }
-}
+@Documented
+@Retention(RUNTIME)
+@Target(TYPE)
+public @interface ThreadSafe {}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentBaseAssertion.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentBaseAssertion.java
index 163c36d..7e56364 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentBaseAssertion.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentBaseAssertion.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.assertions;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.io.*;
 import java.util.function.*;
 
@@ -224,7 +226,7 @@ public class FluentBaseAssertion<V,R> extends 
FluentAssertion<R> {
                try {
                        String s1 = serializer.serialize(this.value);
                        String s2 = serializer.serialize(o);
-                       if (! StringUtils.isEquals(s1, s2))
+                       if (ne(s1, s2))
                                throw error("Unexpected 
comparison.\n\tExpect=[{0}]\n\tActual=[{1}]", s2, s1);
                } catch (SerializeException e) {
                        throw new RuntimeException(e);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
index a27b7e9..f9e0ed1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
@@ -173,7 +173,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
         * @throws AssertionError If assertion failed.
         */
        public R isEqualTo(String value) throws AssertionError {
-               if (! StringUtils.isEquals(value, text))
+               if (ne(value, text))
                        throw error("Text differed at position 
{0}.\n\tExpect=[{1}]\n\tActual=[{2}]", diffPosition(value, text), fix(value), 
fix(text));
                return returns();
        }
@@ -203,7 +203,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
        public R isEqualLinesTo(String...lines) throws AssertionError {
                assertNotNull("lines", lines);
                String v = join(lines, '\n');
-               if (! StringUtils.isEquals(v, text))
+               if (ne(v, text))
                        throw error("Text differed at position 
{0}.\n\tExpect=[{1}]\n\tActual=[{2}]", diffPosition(v, text), fix(v), 
fix(text));
                return returns();
        }
@@ -272,7 +272,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
         * @throws AssertionError If assertion failed.
         */
        public R is(String value) throws AssertionError {
-               if (! StringUtils.isEquals(value, text))
+               if (ne(value, text))
                        throw error("Unexpected 
value.\n\tExpect=[{0}]\n\tActual=[{1}]", fix(value), fix(text));
                return isEqualTo(value);
        }
@@ -285,7 +285,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
         * @throws AssertionError If assertion failed.
         */
        public R isEqualIgnoreCaseTo(String value) throws AssertionError {
-               if (! StringUtils.isEqualsIc(value, text))
+               if (neic(value, text))
                        throw error("Text differed at position 
{0}.\n\tExpect=[{1}]\n\tActual=[{2}]", diffPositionIc(value, text), fix(value), 
fix(text));
                return returns();
        }
@@ -298,7 +298,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
         * @throws AssertionError If assertion failed.
         */
        public R doesNotEqual(String value) throws AssertionError {
-               if (StringUtils.isEquals(value, text))
+               if (eq(value, text))
                        throw error("Text equaled unexpected.\n\tText=[{0}]", 
fix(text));
                return returns();
        }
@@ -325,7 +325,7 @@ public class FluentStringAssertion<R> extends 
FluentBaseAssertion<String,R> {
         * @throws AssertionError If assertion failed.
         */
        public R doesNotEqualIc(String value) throws AssertionError {
-               if (StringUtils.isEqualsIc(value, text))
+               if (eqic(value, text))
                        throw error("Text equaled unexpected.\n\tText=[{0}]", 
fix(text));
                return returns();
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicCsvArrayHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicCsvArrayHeader.java
index b16ac24..72b8d20 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicCsvArrayHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicCsvArrayHeader.java
@@ -128,7 +128,7 @@ public class BasicCsvArrayHeader extends BasicHeader {
                List<String> vv = getParsedValue();
                if (val != null && vv != null)
                        for (String v : vv)
-                               if (isEquals(v, val))
+                               if (eq(v, val))
                                        return true;
                return false;
        }
@@ -143,7 +143,7 @@ public class BasicCsvArrayHeader extends BasicHeader {
                List<String> vv = getParsedValue();
                if (val != null && vv != null)
                        for (String v : vv)
-                               if (isEqualsIc(v, val))
+                               if (eqic(v, val))
                                        return true;
                return false;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicHeader.java
index 912fb94..8f2bd40 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/BasicHeader.java
@@ -211,7 +211,7 @@ public class BasicHeader implements Header, Cloneable, 
Serializable {
         * @return <jk>true</jk> if the specified value is the same.
         */
        public boolean equalsIgnoreCase(String compare) {
-               return isEqualsIc(getValue(), compare);
+               return eqic(getValue(), compare);
        }
 
        /**
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 a2f8a5a..41ff85f 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
@@ -14,7 +14,6 @@ package org.apache.juneau.http.header;
 
 import static java.util.Collections.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static java.util.Arrays.*;
 
 import java.util.*;
 
@@ -23,7 +22,9 @@ import org.apache.http.message.*;
 import org.apache.http.message.BasicHeader;
 import org.apache.http.util.*;
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.HttpHeaders;
+import org.apache.juneau.internal.*;
 
 /**
  * An unmodifiable list of HTTP headers.
@@ -31,6 +32,7 @@ import org.apache.juneau.http.HttpHeaders;
  * <p>
  * Similar to {@link HeaderGroup} but uses a builder-based approach for 
building header lists.
  */
+@ThreadSafe
 public class HeaderList implements Iterable<Header> {
 
        /** Represents no header supplier in annotations. */
@@ -40,6 +42,7 @@ public class HeaderList implements Iterable<Header> {
        public static final HeaderList EMPTY = new HeaderList();
 
        final List<Header> headers;
+       final boolean caseSensitive;
 
        /**
         * Instantiates a new builder for this bean.
@@ -67,7 +70,7 @@ public class HeaderList implements Iterable<Header> {
         * @return A new unmodifiable instance, never <jk>null</jk>.
         */
        public static HeaderList of(Header...headers) {
-               return headers == null || headers.length == 0 ? EMPTY : new 
HeaderList(asList(headers));
+               return headers == null || headers.length == 0 ? EMPTY : new 
HeaderList(headers);
        }
 
        /**
@@ -86,7 +89,7 @@ public class HeaderList implements Iterable<Header> {
                        throw new BasicRuntimeException("Odd number of 
parameters passed into HeaderList.ofPairs()");
                HeaderListBuilder b = create();
                for (int i = 0; i < pairs.length; i+=2)
-                       b.add(stringify(pairs[i]), pairs[i+1]);
+                       b.append(stringify(pairs[i]), pairs[i+1]);
                return new HeaderList(b);
        }
 
@@ -97,6 +100,7 @@ public class HeaderList implements Iterable<Header> {
         */
        public HeaderList(HeaderListBuilder builder) {
                this.headers = unmodifiableList(new 
ArrayList<>(builder.headers));
+               this.caseSensitive = builder.caseSensitive;
        }
 
        /**
@@ -108,14 +112,35 @@ public class HeaderList implements Iterable<Header> {
                if (headers == null || headers.isEmpty())
                        this.headers = emptyList();
                else {
-                       List<Header> l = new ArrayList<>();
-                       for (int i = 0; i < headers.size(); i++) {
+                       List<Header> l = new ArrayList<>(headers.size());
+                       for (int i = 0, j = headers.size(); i < j; i++) {
                                Header x = headers.get(i);
                                if (x != null)
                                        l.add(x);
                        }
                        this.headers = unmodifiableList(l);
                }
+               caseSensitive = false;
+       }
+
+       /**
+        * Constructor.
+        *
+        * @param headers The initial list of headers.  <jk>null</jk> entries 
are ignored.
+        */
+       protected HeaderList(Header...headers) {
+               if (headers.length == 0)
+                       this.headers = emptyList();
+               else {
+                       List<Header> l = new ArrayList<>(headers.length);
+                       for (int i = 0; i < headers.length; i++) {
+                               Header x = headers[i];
+                               if (x != null)
+                                       l.add(x);
+                       }
+                       this.headers = unmodifiableList(l);
+               }
+               caseSensitive = false;
        }
 
        /**
@@ -123,6 +148,7 @@ public class HeaderList implements Iterable<Header> {
         */
        protected HeaderList() {
                this.headers = emptyList();
+               caseSensitive = false;
        }
 
        /**
@@ -189,24 +215,24 @@ public class HeaderList implements Iterable<Header> {
         */
        @SuppressWarnings("unchecked")
        public <T extends Header> T getCondensed(Class<T> type, String name) {
-               List<Header> hdrs = get(name);
+               List<Header> l = get(name);
 
-               if (hdrs.isEmpty())
+               if (l.isEmpty())
                        return null;
 
                String value = null;
 
-               if (hdrs.size() == 1) {
-                       Header h = hdrs.get(0);
+               if (l.size() == 1) {
+                       Header h = l.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());
+                       StringBuilder sb = new StringBuilder(128);
+                       for (int i = 0; i < l.size(); i++) {
+                               if (i > 0)
+                                       sb.append(", ");
+                               sb.append(l.get(i).getValue());
                        }
                        value = sb.toString();
                }
@@ -229,9 +255,9 @@ public class HeaderList implements Iterable<Header> {
         */
        public List<Header> get(String name) {
                List<Header> l = null;
-               for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
+               for (int i = 0, j = headers.size(); i < j; i++) {  // See 
HTTPCORE-361
                        Header x = headers.get(i);
-                       if (isEqualsIc(x.getName(), name)) {
+                       if (eq(x.getName(), name)) {
                                if (l == null)
                                        l = new ArrayList<>();
                                l.add(x);
@@ -252,7 +278,7 @@ public class HeaderList implements Iterable<Header> {
        public Header getFirst(String name) {
                for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
                        Header x = headers.get(i);
-                       if (isEqualsIc(x.getName(), name))
+                       if (eq(x.getName(), name))
                                return x;
                }
                return null;
@@ -270,7 +296,7 @@ public class HeaderList implements Iterable<Header> {
        public Header getLast(String name) {
                for (int i = headers.size() - 1; i >= 0; i--) {
                        Header x = headers.get(i);
-                       if (isEqualsIc(x.getName(), name))
+                       if (eq(x.getName(), name))
                                return x;
                }
                return null;
@@ -297,7 +323,7 @@ public class HeaderList implements Iterable<Header> {
        public boolean contains(String name) {
                for (int i = 0; i < headers.size(); i++) {  // See HTTPCORE-361
                        Header x = headers.get(i);
-                       if (isEqualsIc(x.getName(), name))
+                       if (eq(x.getName(), name))
                                return true;
                }
                return false;
@@ -323,6 +349,10 @@ public class HeaderList implements Iterable<Header> {
                return new BasicListHeaderIterator(headers, name);
        }
 
+       private boolean eq(String s1, String s2) {
+               return caseSensitive ? StringUtils.eq(s1, s2) : 
StringUtils.eqic(s1, s2);
+       }
+
        @Override /* Iterable */
        public Iterator<Header> iterator() {
                return getAll().iterator();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
index e1736b8..cf70da3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/HeaderListBuilder.java
@@ -18,19 +18,20 @@ import java.util.*;
 import java.util.function.*;
 
 import org.apache.http.*;
-import org.apache.juneau.httppart.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.internal.*;
-import org.apache.juneau.oapi.*;
 import org.apache.juneau.svl.*;
 
 /**
  * Builder for {@link HeaderList} objects.
  */
 @FluentSetters
+@NotThreadSafe
 public class HeaderListBuilder {
 
        final List<Header> headers;
-       private volatile VarResolver varResolver;
+       private VarResolver varResolver;
+       boolean caseSensitive = false;
 
        /** Predefined instance. */
        private static final HeaderList EMPTY = new HeaderList();
@@ -66,9 +67,12 @@ public class HeaderListBuilder {
         * <p>
         * Resolves variables in header values when using the following methods:
         * <ul>
-        *      <li class='jm'>{@link #add(String, Object) add(String,Object)}
-        *      <li class='jm'>{@link #add(String, Supplier) 
add(String,Supplier&lt;?&gt;)}
-        *      <li class='jm'>{@link #add(String, Object, 
HttpPartSerializerSession, HttpPartSchema, boolean) 
add(String,Object,HttpPartSerializerSession,HttpPartSchema,boolean)}
+        *      <li class='jm'>{@link #append(String, Object) 
append(String,Object)}
+        *      <li class='jm'>{@link #append(String, Supplier) 
append(String,Supplier&lt;?&gt;)}
+        *      <li class='jm'>{@link #prepend(String, Object) 
prepend(String,Object)}
+        *      <li class='jm'>{@link #prepend(String, Supplier) 
prepend(String,Supplier&lt;?&gt;)}
+        *      <li class='jm'>{@link #set(String, Object) set(String,Object)}
+        *      <li class='jm'>{@link #set(String, Supplier) 
set(String,Supplier&lt;?&gt;)}
         * </ul>
         *
         * <p>
@@ -86,9 +90,12 @@ public class HeaderListBuilder {
         * <p>
         * Resolves variables in header values when using the following methods:
         * <ul>
-        *      <li class='jm'>{@link #add(String, Object) add(String,Object)}
-        *      <li class='jm'>{@link #add(String, Supplier) 
add(String,Supplier&lt;?&gt;)}
-        *      <li class='jm'>{@link #add(String, Object, 
HttpPartSerializerSession, HttpPartSchema, boolean) 
add(String,Object,HttpPartSerializerSession,HttpPartSchema,boolean)}
+        *      <li class='jm'>{@link #append(String, Object) 
append(String,Object)}
+        *      <li class='jm'>{@link #append(String, Supplier) 
append(String,Supplier&lt;?&gt;)}
+        *      <li class='jm'>{@link #prepend(String, Object) 
prepend(String,Object)}
+        *      <li class='jm'>{@link #prepend(String, Supplier) 
prepend(String,Supplier&lt;?&gt;)}
+        *      <li class='jm'>{@link #set(String, Object) set(String,Object)}
+        *      <li class='jm'>{@link #set(String, Supplier) 
set(String,Supplier&lt;?&gt;)}
         * </ul>
         *
         * @param varResolver The variable resolver to use for resolving 
variables.
@@ -100,44 +107,44 @@ public class HeaderListBuilder {
        }
 
        /**
-        * Removes any headers already in this builder.
+        * Specifies that the headers in this builder should be treated as 
case-sensitive.
+        *
+        * <p>
+        * The default behavior is case-insensitive.
         *
         * @return This object (for method chaining).
         */
-       @FluentSetter
-       public HeaderListBuilder clear() {
-               headers.clear();
+       public HeaderListBuilder caseSensitive() {
+               this.caseSensitive = true;
                return this;
        }
 
        /**
-        * Adds the specified header to the end of the headers in this builder.
+        * Removes any headers already in this builder.
         *
-        * @param value The header to add.  <jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder add(Header value) {
-               if (value != null)
-                       headers.add(value);
+       public HeaderListBuilder clear() {
+               headers.clear();
                return this;
        }
 
        /**
         * Adds the specified header to the end of the headers in this builder.
         *
-        * @param name The header name.
-        * @param value The header value.
+        * @param value The header to add.  <jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder add(String name, String value) {
-               Header x = isResolving() ? new BasicHeader(name, 
resolver(value)) : new BasicHeader(name, value);
-               return add(x);
+       public HeaderListBuilder append(Header value) {
+               if (value != null)
+                       headers.add(value);
+               return this;
        }
 
        /**
-        * Appends the specified header to the end of this list.
+        * Appends the specified header to the end of this builder.
         *
         * <p>
         * The header is added as a {@link BasicHeader}.
@@ -146,13 +153,12 @@ public class HeaderListBuilder {
         * @param value The header value.
         * @return This object (for method chaining).
         */
-       public HeaderListBuilder add(String name, Object value) {
-               Header x = isResolving() ? new BasicHeader(name, 
resolver(value)) : new BasicHeader(name, value);
-               return add(x);
+       public HeaderListBuilder append(String name, Object value) {
+               return append(header(name, value));
        }
 
        /**
-        * Appends the specified header to the end of this list using a value 
supplier.
+        * Appends the specified header to the end of this builder using a 
value supplier.
         *
         * <p>
         * The header is added as a {@link BasicHeader}.
@@ -164,29 +170,21 @@ public class HeaderListBuilder {
         * @param value The header value supplier.
         * @return This object (for method chaining).
         */
-       public HeaderListBuilder add(String name, Supplier<?> value) {
-               Header x = isResolving() ? new BasicHeader(name, 
resolver(value)) : new BasicHeader(name, value);
-               return add(x);
+       public HeaderListBuilder append(String name, Supplier<?> value) {
+               return append(header(name, value));
        }
 
        /**
-        * Appends the specified header to the end of this list.
+        * Adds the specified headers to the end of the headers in this builder.
         *
-        * @param name The header name.
-        * @param value The header value.
-        * @param serializer
-        *      The serializer to use for serializing the value to a string 
value.
-        * @param schema
-        *      The schema object that defines the format of the output.
-        *      <br>If <jk>null</jk>, defaults to the schema defined on the 
parser.
-        *      <br>If that's also <jk>null</jk>, defaults to {@link 
HttpPartSchema#DEFAULT}.
-        *      <br>Only used if serializer is schema-aware (e.g. {@link 
OpenApiSerializer}).
-        * @param skipIfEmpty If value is a blank string, the value should 
return as <jk>null</jk>.
+        * @param values The headers to add.  <jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
-       public HeaderListBuilder add(String name, Object value, 
HttpPartSerializerSession serializer, HttpPartSchema schema, boolean 
skipIfEmpty) {
-               Header x = isResolving() ? new SerializedHeader(name, 
resolver(value), serializer, schema, skipIfEmpty) : new SerializedHeader(name, 
value, serializer, schema, skipIfEmpty);
-               return add(x);
+       @FluentSetter
+       public HeaderListBuilder append(Header...values) {
+               for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
+                       append(values[i]);
+               return this;
        }
 
        /**
@@ -196,34 +194,79 @@ public class HeaderListBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder add(Header...values) {
-               for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
-                       add(values[i]);
+       public HeaderListBuilder append(List<Header> values) {
+               if (values != null)
+                       for (int i = 0, j = values.size(); i < j; i++) /* See 
HTTPCORE-361 */
+                               append(values.get(i));
                return this;
        }
 
        /**
-        * Adds the specified headers to the end of the headers in this builder.
+        * Adds the specified header to the beginning of the headers in this 
builder.
+        *
+        * @param value The header to add.  <jk>null</jk> values are ignored.
+        * @return This object (for method chaining).
+        */
+       @FluentSetter
+       public HeaderListBuilder prepend(Header value) {
+               if (value != null)
+                       headers.add(0, value);
+               return this;
+       }
+
+       /**
+        * Appends the specified header to the beginning of this builder.
+        *
+        * <p>
+        * The header is added as a {@link BasicHeader}.
+        *
+        * @param name The header name.
+        * @param value The header value.
+        * @return This object (for method chaining).
+        */
+       public HeaderListBuilder prepend(String name, Object value) {
+               return prepend(header(name, value));
+       }
+
+       /**
+        * Appends the specified header to the beginning of this builder using 
a value supplier.
+        *
+        * <p>
+        * The header is added as a {@link BasicHeader}.
+        *
+        * <p>
+        * Value is re-evaluated on each call to {@link BasicHeader#getValue()}.
+        *
+        * @param name The header name.
+        * @param value The header value supplier.
+        * @return This object (for method chaining).
+        */
+       public HeaderListBuilder prepend(String name, Supplier<?> value) {
+               return prepend(header(name, value));
+       }
+
+       /**
+        * Adds the specified headers to the beginning of the headers in this 
builder.
         *
         * @param values The headers to add.  <jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder add(List<Header> values) {
-               for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
-                       add(values.get(i));
+       public HeaderListBuilder prepend(Header...values) {
+               headers.addAll(0, Arrays.asList(values));
                return this;
        }
 
        /**
-        * Adds the specified headers to the end of the headers in this builder.
+        * Adds the specified headers to the beginning of the headers in this 
builder.
         *
         * @param values The headers to add.  <jk>null</jk> values are ignored.
         * @return This object (for method chaining).
         */
-       public HeaderListBuilder add(HeaderList values) {
+       @FluentSetter
+       public HeaderListBuilder prepend(List<Header> values) {
                if (values != null)
-                       add(values.getAll());
+                       headers.addAll(0, values);
                return this;
        }
 
@@ -261,7 +304,7 @@ public class HeaderListBuilder {
         */
        @FluentSetter
        public HeaderListBuilder remove(List<Header> values) {
-               for (int i = 0; i < values.size(); i++) /* See HTTPCORE-361 */
+               for (int i = 0, j = values.size(); i < j; i++) /* See 
HTTPCORE-361 */
                        remove(values.get(i));
                return this;
        }
@@ -275,7 +318,7 @@ public class HeaderListBuilder {
        @FluentSetter
        public HeaderListBuilder remove(String name) {
                for (int i = 0; i < headers.size(); i++) /* See HTTPCORE-361 */
-                       if (headers.get(i).getName().equalsIgnoreCase(name))
+                       if (eq(headers.get(i).getName(), name))
                                headers.remove(i--);
                return null;
        }
@@ -290,13 +333,13 @@ public class HeaderListBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder update(Header value) {
+       public HeaderListBuilder set(Header value) {
                if (value == null)
                        return this;
 
-               for (int i = 0; i < headers.size(); i++) {
+               for (int i = 0, j = headers.size(); i < j; i++) {
                        Header x = headers.get(i);
-                       if (x.getName().equalsIgnoreCase(value.getName())) {
+                       if (eq(x.getName(), value.getName())) {
                                headers.set(i, value);
                                return this;
                        }
@@ -316,9 +359,9 @@ public class HeaderListBuilder {
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public HeaderListBuilder update(Header...values) {
+       public HeaderListBuilder set(Header...values) {
                for (int i = 0; i < values.length; i++) /* See HTTPCORE-361 */
-                       update(values[i]);
+                       set(values[i]);
                return this;
        }
 
@@ -329,56 +372,34 @@ public class HeaderListBuilder {
         * @param value The header value.
         * @return This object (for method chaining).
         */
-       public HeaderListBuilder update(String name, String value) {
-               Header x = isResolving() ? new BasicHeader(name, 
resolver(value)) : new BasicHeader(name, value);
-               return update(x);
+       public HeaderListBuilder set(String name, Object value) {
+               return set(header(name, value));
        }
 
        /**
         * Replaces the first occurrence of the headers with the same name.
         *
-        * <p>
-        * If no header with the same name is found the given header is added 
to the end of the list.
-        *
-        * @param values The headers to replace.  <jk>null</jk> values are 
ignored.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       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 list overriding any 
existing headers.
-        *
-        * <p>
-        * The headers are added in the order in which they appear in the array.
-        *
-        * @param values The headers to set
+        * @param name The header name.
+        * @param value The header value.
         * @return This object (for method chaining).
         */
-       @FluentSetter
-       public HeaderListBuilder set(Header...values) {
-               clear();
-               Collections.addAll(headers, values);
-               return this;
+       public HeaderListBuilder set(String name, Supplier<?> value) {
+               return set(header(name, value));
        }
 
        /**
-        * Sets all of the headers contained within this list overriding any 
existing headers.
+        * Replaces the first occurrence of the headers with the same name.
         *
         * <p>
-        * The headers are added in the order in which they appear in the list.
+        * If no header with the same name is found the given header is added 
to the end of the list.
         *
-        * @param values The headers to set
+        * @param values The headers to replace.  <jk>null</jk> values are 
ignored.
         * @return This object (for method chaining).
         */
        @FluentSetter
        public HeaderListBuilder set(List<Header> values) {
-               clear();
-               headers.addAll(values);
+               for (int i = 0, j = values.size(); i < j; i++) /* See 
HTTPCORE-361 */
+                       set(values.get(i));
                return this;
        }
 
@@ -396,6 +417,18 @@ public class HeaderListBuilder {
                return o;
        }
 
+       private Header header(String name, Object value) {
+               return isResolving() ? new BasicHeader(name, resolver(value)) : 
new BasicHeader(name, value);
+       }
+
+       private Header header(String name, Supplier<?> value) {
+               return isResolving() ? new BasicHeader(name, resolver(value)) : 
new BasicHeader(name, value);
+       }
+
+       private boolean eq(String s1, String s2) {
+               return caseSensitive ? StringUtils.eq(s1, s2) : 
StringUtils.eqic(s1, s2);
+       }
+
        // <FluentSetters>
 
        // </FluentSetters>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/SerializedHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/SerializedHeader.java
index d95c651..5d416bf 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/SerializedHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/header/SerializedHeader.java
@@ -64,6 +64,27 @@ public class SerializedHeader extends BasicHeader {
        }
 
        /**
+        * Instantiates a new instance of this object.
+        *
+        * @param name The HTTP header name name.
+        * @param value The POJO to serialize to the parameter value.
+        * @param serializer
+        *      The serializer to use for serializing the value to a string 
value.
+        * @param schema
+        *      The schema object that defines the format of the output.
+        *      <br>If <jk>null</jk>, defaults to the schema defined on the 
serializer.
+        *      <br>If that's also <jk>null</jk>, defaults to {@link 
HttpPartSchema#DEFAULT}.
+        *      <br>Only used if serializer is schema-aware (e.g. {@link 
OpenApiSerializer}).
+        *      <br>Can also be a {@link Supplier}.
+        * @param skipIfEmpty If value is a blank string, the value should 
return as <jk>null</jk>.
+        *
+        * @return A new instance of this object.
+        */
+       public static SerializedHeader of(String name, Object value, 
HttpPartSerializerSession serializer, HttpPartSchema schema, boolean 
skipIfEmpty) {
+               return new SerializedHeader(name, value, serializer, schema, 
skipIfEmpty);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
index c594eb0..5beada5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
@@ -117,7 +117,7 @@ public class BasicCsvArrayPart extends BasicPart {
                List<String> vv = getParsedValue();
                if (val != null && vv != null)
                        for (String v : vv)
-                               if (isEquals(v, val))
+                               if (eq(v, val))
                                        return true;
                return false;
        }
@@ -132,7 +132,7 @@ public class BasicCsvArrayPart extends BasicPart {
                List<String> vv = getParsedValue();
                if (val != null && vv != null)
                        for (String v : vv)
-                               if (isEqualsIc(v, val))
+                               if (eqic(v, val))
                                        return true;
                return false;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/resource/HttpResourceBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/resource/HttpResourceBuilder.java
index 04582c6..e532755 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/resource/HttpResourceBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/resource/HttpResourceBuilder.java
@@ -291,7 +291,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         */
        public HttpResourceBuilder<T> header(Header value) {
                if (value != null)
-                       headersBuilder().add(value);
+                       headersBuilder().append(value);
                return this;
        }
 
@@ -307,7 +307,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         */
        public HttpResourceBuilder<T> header(String name, String value) {
                if (name != null && value != null)
-                       headersBuilder().add(name, value);
+                       headersBuilder().append(name, value);
                return this;
        }
 
@@ -330,7 +330,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
                                        else if 
(n.equalsIgnoreCase("content-length"))
                                                
contentLength(Long.parseLong(v));
                                        else
-                                               headersBuilder().add(h);
+                                               headersBuilder().append(h);
                                }
                        }
                }
@@ -344,7 +344,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> headers(List<Header> values) {
-               headersBuilder().add(values);
+               headersBuilder().append(values);
                return this;
        }
 
@@ -391,7 +391,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> updateHeader(Header value) {
-               headersBuilder().update(value);
+               headersBuilder().set(value);
                return this;
        }
 
@@ -405,7 +405,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> updateHeaders(Header...values) {
-               headersBuilder().update(values);
+               headersBuilder().set(values);
                return this;
        }
 
@@ -419,7 +419,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> updateHeaders(List<Header> values) {
-               headersBuilder().update(values);
+               headersBuilder().set(values);
                return this;
        }
 
@@ -433,7 +433,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> setHeaders(Header...values) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(values);
                return this;
        }
 
@@ -447,7 +447,7 @@ public class HttpResourceBuilder<T extends BasicResource> {
         * @return This object (for method chaining).
         */
        public HttpResourceBuilder<T> setHeaders(List<Header> values) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(values);
                return this;
        }
 
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 9db0503..6d969d8 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
@@ -268,27 +268,27 @@ public class BasicHttpException extends 
BasicRuntimeException implements HttpRes
 
        @Override /* HttpMessage */
        public void addHeader(Header value) {
-               headersBuilder().add(value).build();
+               headersBuilder().append(value).build();
        }
 
        @Override /* HttpMessage */
        public void addHeader(String name, String value) {
-               headersBuilder().add(new BasicHeader(name, value)).build();
+               headersBuilder().append(name, value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(Header value) {
-               headersBuilder().update(value).build();
+               headersBuilder().set(value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(String name, String value) {
-               headersBuilder().update(new BasicHeader(name, value)).build();
+               headersBuilder().set(name, value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeaders(Header[] values) {
-               headersBuilder().set(values).build();
+               headersBuilder().clear().append(values).build();
        }
 
        @Override /* HttpMessage */
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 71d427f..cb97c95 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
@@ -147,27 +147,27 @@ public class BasicHttpResponse implements HttpResponse {
 
        @Override /* HttpMessage */
        public void addHeader(Header value) {
-               headersBuilder().add(value).build();
+               headersBuilder().append(value).build();
        }
 
        @Override /* HttpMessage */
        public void addHeader(String name, String value) {
-               headersBuilder().add(new BasicHeader(name, value)).build();
+               headersBuilder().append(name, value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(Header value) {
-               headersBuilder().update(value).build();
+               headersBuilder().set(value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeader(String name, String value) {
-               headersBuilder().update(new BasicHeader(name, value)).build();
+               headersBuilder().set(name, value).build();
        }
 
        @Override /* HttpMessage */
        public void setHeaders(Header[] values) {
-               headersBuilder().set(values).build();
+               headersBuilder().clear().append(values).build();
        }
 
        @Override /* HttpMessage */
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 8dfead4..6f3d35b 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
@@ -240,7 +240,7 @@ public class HttpExceptionBuilder<T extends 
BasicHttpException> extends BasicRun
         * @return This object (for method chaining).
         */
        public HttpExceptionBuilder<T> header(Header value) {
-               headersBuilder().add(value);
+               headersBuilder().append(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) {
-               headersBuilder().add(name, value);
+               headersBuilder().append(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) {
-               headersBuilder().add(values);
+               headersBuilder().append(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) {
-               headersBuilder().add(values);
+               headersBuilder().append(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) {
-               headersBuilder().update(value);
+               headersBuilder().set(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) {
-               headersBuilder().update(values);
+               headersBuilder().set(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) {
-               headersBuilder().update(values);
+               headersBuilder().set(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) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(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) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(values);
                return this;
        }
 
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 021359b..52d1b4d 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
@@ -247,7 +247,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> header(Header value) {
-               headersBuilder().add(value);
+               headersBuilder().append(value);
                return this;
        }
 
@@ -259,7 +259,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> header(String name, String value) {
-               headersBuilder().add(name, value);
+               headersBuilder().append(name, value);
                return this;
        }
 
@@ -270,7 +270,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> headers(Header...values) {
-               headersBuilder().add(values);
+               headersBuilder().append(values);
                return this;
        }
 
@@ -281,7 +281,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> headers(List<Header> values) {
-               headersBuilder().add(values);
+               headersBuilder().append(values);
                return this;
        }
 
@@ -328,7 +328,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeader(Header value) {
-               headersBuilder().update(value);
+               headersBuilder().set(value);
                return this;
        }
 
@@ -342,7 +342,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeaders(Header...values) {
-               headersBuilder().update(values);
+               headersBuilder().set(values);
                return this;
        }
 
@@ -356,7 +356,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> updateHeaders(List<Header> values) {
-               headersBuilder().update(values);
+               headersBuilder().set(values);
                return this;
        }
 
@@ -370,7 +370,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> setHeaders(Header...values) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(values);
                return this;
        }
 
@@ -384,7 +384,7 @@ public class HttpResponseBuilder<T extends 
BasicHttpResponse> {
         * @return This object (for method chaining).
         */
        public HttpResponseBuilder<T> setHeaders(List<Header> values) {
-               headersBuilder().set(values);
+               headersBuilder().clear().append(values);
                return this;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
index b540959..bab7105 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ArrayUtils.java
@@ -466,7 +466,7 @@ public final class ArrayUtils {
                if (a1.length != a2.length)
                        return false;
                for (int i = 0; i < a1.length; i++)
-                       if (! StringUtils.isEquals(a1[i], a2[i]))
+                       if (! StringUtils.eq(a1[i], a2[i]))
                                return false;
                return true;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java
index 3bbeaa2..13feabd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java
@@ -1199,7 +1199,7 @@ public final class StringUtils {
         * @param s2 String 2.
         * @return <jk>true</jk> if the strings are equal.
         */
-       public static boolean isEquals(String s1, String s2) {
+       public static boolean eq(String s1, String s2) {
                if (s1 == null)
                        return s2 == null;
                if (s2 == null)
@@ -1260,7 +1260,7 @@ public final class StringUtils {
         * @param s2 String 2.
         * @return <jk>true</jk> if the strings are equal.
         */
-       public static boolean isEqualsIc(String s1, String s2) {
+       public static boolean eqic(String s1, String s2) {
                if (s1 == null)
                        return s2 == null;
                if (s2 == null)
@@ -1275,8 +1275,19 @@ public final class StringUtils {
         * @param s2 String 2.
         * @return <jk>true</jk> if the strings are not equal.
         */
-       public static boolean isNotEquals(String s1, String s2) {
-               return ! isEquals(s1, s2);
+       public static boolean ne(String s1, String s2) {
+               return ! eq(s1, s2);
+       }
+
+       /**
+        * Tests two strings for non-equality ignoring case, but gracefully 
handles nulls.
+        *
+        * @param s1 String 1.
+        * @param s2 String 2.
+        * @return <jk>true</jk> if the strings are not equal ignoring case.
+        */
+       public static boolean neic(String s1, String s2) {
+               return ! eqic(s1, s2);
        }
 
        /**
@@ -1903,7 +1914,7 @@ public final class StringUtils {
         */
        public static boolean isOneOf(String s, String...values) {
                for (int i = 0; i < values.length; i++)
-                       if (StringUtils.isEquals(s, values[i]))
+                       if (StringUtils.eq(s, values[i]))
                                return true;
                return false;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
index 33a3d63..4a37ef1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
@@ -516,7 +516,7 @@ public class ReflectionMap<V> {
                        Class<?> c = m.getDeclaringClass();
                        return
                                classMatches(simpleClassName, fullClassName, c)
-                               && (isEquals(m.getName(), methodName))
+                               && (eq(m.getName(), methodName))
                                && (argsMatch(args, m.getParameterTypes()));
                }
 
@@ -594,7 +594,7 @@ public class ReflectionMap<V> {
                        Class<?> c = f.getDeclaringClass();
                        return
                                classMatches(simpleClassName, fullClassName, c)
-                               && (isEquals(f.getName(), fieldName));
+                               && (eq(f.getName(), fieldName));
                }
 
                public OMap toMap() {
@@ -621,7 +621,7 @@ public class ReflectionMap<V> {
                for (int i = 0; i < args.length; i++) {
                        String n = names[i];
                        Class<?> a = args[i];
-                       if (! (isEquals(n, a.getSimpleName()) || isEquals(n, 
a.getName())))
+                       if (! (eq(n, a.getSimpleName()) || eq(n, a.getName())))
                                return false;
                }
                return true;
@@ -640,7 +640,7 @@ public class ReflectionMap<V> {
                // c.getFullName() == 
"org.apache.juneau.a.rttests.RountTripBeansWithBuilders$Ac$Builder"
                // c.getPackage() == "org.apache.juneau.a.rttests"
                String cSimple = c.getSimpleName(), cFull = c.getName();
-               if (isEquals(simpleName, cSimple) || isEquals(fullName, cFull))
+               if (eq(simpleName, cSimple) || eq(fullName, cFull))
                        return true;
                if ("*".equals(simpleName))
                        return true;
@@ -648,12 +648,12 @@ public class ReflectionMap<V> {
                        Package p = c.getPackage();
                        if (p != null)
                                cFull = cFull.substring(p.getName().length() + 
1);
-                       if (isEquals(simpleName, cFull))
+                       if (eq(simpleName, cFull))
                                return true;
                        int i = cFull.indexOf('$');
                        while (i != -1) {
                                cFull = cFull.substring(i+1);
-                               if (isEquals(simpleName, cFull))
+                               if (eq(simpleName, cFull))
                                        return true;
                                i = cFull.indexOf('$');
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
index 6a7b74b..ebc5ff9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.xml;
 
 import static org.apache.juneau.internal.ArrayUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.xml.XmlSerializer.*;
 import static org.apache.juneau.xml.XmlSerializerSession.ContentResult.*;
 import static org.apache.juneau.xml.XmlSerializerSession.JsonType.*;
@@ -25,7 +26,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.apache.juneau.xml.annotation.*;
@@ -370,7 +370,7 @@ public class XmlSerializerSession extends 
WriterSerializerSession {
                        name = null;
                }
 
-               if (StringUtils.isEquals(name, elementName))
+               if (eq(name, elementName))
                        name = null;
 
                if (isEnableNamespaces()) {
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 0c9a1df..9c92624 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -2090,9 +2090,9 @@ public class RestClient extends BeanContext implements 
HttpClient, Closeable, Re
                for (Object o : cp.getList(RESTCLIENT_headers, 
Object.class).orElse(emptyList())) {
                        o = buildBuilders(o, partSerializerSession);
                        if (o instanceof HeaderList)
-                               headers.add((HeaderList)o);
+                               headers.append(((HeaderList)o).getAll());
                        else
-                               headers.add(BasicHeader.cast(o));
+                               headers.append(BasicHeader.cast(o));
                }
                this.headers = headers.build();
 
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
index 94f0d4c..41ff5d6 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestResponse.java
@@ -719,7 +719,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public void addHeader(Header header) {
-               headers = headers.copy().add(header).build();
+               headers = headers.copy().append(header).build();
        }
 
        /**
@@ -732,7 +732,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public void addHeader(String name, String value) {
-               headers = headers.copy().add(name, value).build();
+               headers = headers.copy().append(name, value).build();
        }
 
        /**
@@ -744,7 +744,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public void setHeader(Header header) {
-               headers = headers.copy().update(header).build();
+               headers = headers.copy().set(header).build();
        }
 
        /**
@@ -757,7 +757,7 @@ public class RestResponse implements HttpResponse {
         */
        @Override /* HttpMessage */
        public void setHeader(String name, String value) {
-               headers = headers.copy().update(name, value).build();
+               headers = headers.copy().set(name, value).build();
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
index f833575..83a0dfa 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
@@ -59,14 +59,14 @@ public class RemoteMeta {
                        if (! r.path().isEmpty())
                                path = trimSlashes(resolve(r.path()));
                        for (String h : r.headers())
-                               headersBuilder.add(basicHeader(resolve(h)));
+                               headersBuilder.append(basicHeader(resolve(h)));
                        if (! r.version().isEmpty())
                                clientVersion = resolve(r.version());
                        if (! r.versionHeader().isEmpty())
                                versionHeader = resolve(r.versionHeader());
                        if (r.headerList() != HeaderList.Null.class) {
                                try {
-                                       
headersBuilder.add(r.headerList().newInstance().getAll());
+                                       
headersBuilder.append(r.headerList().newInstance().getAll());
                                } catch (Exception e) {
                                        throw new RuntimeException("Could not 
instantiate HeaderSupplier class.", e);
                                }
@@ -74,7 +74,7 @@ public class RemoteMeta {
                }
 
                if (clientVersion != null)
-                       headersBuilder.add(stringHeader(versionHeader, 
clientVersion));
+                       headersBuilder.append(stringHeader(versionHeader, 
clientVersion));
 
                AMap<Method,RemoteOperationMeta> operations = AMap.create();
                for (MethodInfo m : ci.getPublicMethods())
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 8c57a94..b05ef00 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
@@ -5168,7 +5168,7 @@ public class RestContext extends BeanContext {
 
                HeaderListBuilder x = HeaderList.create();
 
-               
x.update(properties.getInstanceArray(REST_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+               x.set(properties.getInstanceArray(REST_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
@@ -5199,7 +5199,7 @@ public class RestContext extends BeanContext {
 
                HeaderListBuilder x = HeaderList.create();
 
-               
x.update(properties.getInstanceArray(REST_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+               x.set(properties.getInstanceArray(REST_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
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 1eb6137..31fab03 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
@@ -1353,9 +1353,9 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
 
                HeaderListBuilder x = HeaderList.create();
 
-               x.update(context.getDefaultRequestHeaders().getAll());
+               x.set(context.getDefaultRequestHeaders().getAll());
 
-               
x.update(properties.getInstanceArray(RESTOP_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+               x.set(properties.getInstanceArray(RESTOP_defaultRequestHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                for (Annotation[] aa : method.getParameterAnnotations()) {
                        for (Annotation a : aa) {
@@ -1364,7 +1364,7 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
                                        String def = 
joinnlFirstNonEmptyArray(h._default(), h.df());
                                        if (def != null) {
                                                try {
-                                                       
x.update(basicHeader(firstNonEmpty(h.name(), h.n(), h.value()), 
parseAnything(def)));
+                                                       
x.set(basicHeader(firstNonEmpty(h.name(), h.n(), h.value()), 
parseAnything(def)));
                                                } catch (ParseException e) {
                                                        throw new 
ConfigException(e, "Malformed @Header annotation");
                                                }
@@ -1399,9 +1399,9 @@ public class RestOperationContext extends BeanContext 
implements Comparable<Rest
 
                HeaderListBuilder x = HeaderList.create();
 
-               x.update(context.getDefaultResponseHeaders().getAll());
+               x.set(context.getDefaultResponseHeaders().getAll());
 
-               
x.update(properties.getInstanceArray(RESTOP_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
+               
x.set(properties.getInstanceArray(RESTOP_defaultResponseHeaders, 
org.apache.http.Header.class, beanStore).orElse(new org.apache.http.Header[0]));
 
                x = BeanStore
                        .of(beanStore, resource)
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigImportsTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigImportsTest.java
index dbf5f89..5f13c20 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigImportsTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigImportsTest.java
@@ -13,12 +13,12 @@
 package org.apache.juneau.config;
 
 import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.internal.StringUtils.*;
 import static org.junit.Assert.*;
 import static org.junit.runners.MethodSorters.*;
 
 import org.apache.juneau.config.event.*;
 import org.apache.juneau.config.store.*;
-import org.apache.juneau.internal.*;
 import org.junit.*;
 
 /**
@@ -176,7 +176,7 @@ public class ConfigImportsTest {
                        if (events.size() == 0)
                                return null;
                        for (ConfigEvent ce : events)
-                               if (StringUtils.isEquals(section, 
ce.getSection()) && StringUtils.isEquals(key, ce.getKey()))
+                               if (eq(section, ce.getSection()) && eq(key, 
ce.getKey()))
                                        return ce.getValue();
                        return null;
                }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/HeaderList_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/HeaderList_Test.java
index c652589..d604194 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/HeaderList_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/HeaderList_Test.java
@@ -16,6 +16,8 @@ import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.http.HttpHeaders.*;
 import static org.junit.runners.MethodSorters.*;
 
+import java.util.*;
+
 import org.apache.http.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.header.*;
@@ -31,21 +33,21 @@ public class HeaderList_Test {
                HeaderListBuilder x = HeaderList.create();
 
                assertObject(x.build().iterator()).asJson().is("[]");
-               x.add(header("Foo","bar"));
+               x.append(header("Foo","bar"));
                assertObject(x.build().iterator()).asJson().is("['Foo: bar']");
-               x.add(header("Foo","baz"));
+               x.append(header("Foo","baz"));
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz']");
-               x.add(HeaderList.of());
+               x.append(HeaderList.of().getAll());
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz']");
-               x.add(HeaderList.of(header("Foo","qux")));
+               x.append(HeaderList.of(header("Foo","qux")).getAll());
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz','Foo: qux']");
-               x.add(HeaderList.of(header("Foo","q2x"), header("Foo","q3x")));
+               x.append(HeaderList.of(header("Foo","q2x"), 
header("Foo","q3x")).getAll());
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x']");
-               x.add(HeaderList.of(header("Foo","q4x"), header("Foo","q5x")));
+               x.append(HeaderList.of(header("Foo","q4x"), 
header("Foo","q5x")).getAll());
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
-               x.add((Header)null);
+               x.append((Header)null);
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
-               x.add((HeaderList)null);
+               x.append((List<Header>)null);
                assertObject(x.build().iterator()).asJson().is("['Foo: 
bar','Foo: baz','Foo: qux','Foo: q2x','Foo: q3x','Foo: q4x','Foo: q5x']");
 
                assertObject(new 
HeaderList.Null().iterator()).asJson().is("[]");
@@ -74,18 +76,17 @@ public class HeaderList_Test {
                HeaderListBuilder x = HeaderList.create().resolving();
                System.setProperty(pname, "y");
 
-               x.add("X1","bar");
-               x.add("X2","$S{"+pname+"}");
-               x.add("X3","bar");
-               x.add("X4",()->"$S{"+pname+"}");
-               x.add("X5","bar",openApiSession(),null,false);
-               x.add("X6","$S{"+pname+"}",openApiSession(),null,false);
+               x.append("X1","bar");
+               x.append("X2","$S{"+pname+"}");
+               x.append("X3","bar");
+               x.append("X4",()->"$S{"+pname+"}");
+               
x.append(SerializedHeader.of("X5","bar",openApiSession(),null,false));
 
-               assertString(x.build().toString()).is("[X1: bar, X2: y, X3: 
bar, X4: y, X5: bar, X6: y]");
+               assertString(x.build().toString()).is("[X1: bar, X2: y, X3: 
bar, X4: y, X5: bar]");
 
                System.setProperty(pname, "z");
 
-               assertString(x.build().toString()).is("[X1: bar, X2: z, X3: 
bar, X4: z, X5: bar, X6: z]");
+               assertString(x.build().toString()).is("[X1: bar, X2: z, X3: 
bar, X4: z, X5: bar]");
 
                System.clearProperty(pname);
        }
@@ -94,8 +95,8 @@ public class HeaderList_Test {
        public void a04_toArrayMethods() {
                HeaderListBuilder x = HeaderList
                        .create()
-                       .add("X1","1")
-                       .add(headerList("X2","2"));
+                       .append("X1","1")
+                       .append(headerList("X2","2").getAll());
                assertObject(x.build().getAll()).asJson().is("['X1: 1','X2: 
2']");
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
index a438c80..3941269 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/remote/Remote_Test.java
@@ -583,8 +583,8 @@ public class Remote_Test {
                public F1b() {
                        super(
                                create()
-                               .add(basicHeader("Foo","baz"))
-                               
.add(HeaderList.create().add(basicHeader("Foo",()->"qux")).build())
+                               .append(basicHeader("Foo","baz"))
+                               
.append(HeaderList.create().append(basicHeader("Foo",()->"qux")).build().getAll())
                        );
                }
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/OneWayStringSwapTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/OneWayStringSwapTest.java
index 9fd4071..6fa8aed 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/OneWayStringSwapTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/OneWayStringSwapTest.java
@@ -43,7 +43,7 @@ public abstract class OneWayStringSwapTest<T> {
        @Test
        public void testSwap() throws Exception {
                String s = (String)ss.swap(bs, o);
-               if (! isEquals(expected, s)) {
+               if (ne(expected, s)) {
                        if (expected.isEmpty()) {
                                if (! label.startsWith("[]"))
                                        System.err.println(label.substring(0, 
label.indexOf(']')+1) + " "+s);  // NOT DEBUG
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/RoundTripStringSwapTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/RoundTripStringSwapTest.java
index a0eb84c..150c892 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/transforms/RoundTripStringSwapTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/transforms/RoundTripStringSwapTest.java
@@ -43,7 +43,7 @@ public abstract class RoundTripStringSwapTest<T> {
        @Test
        public void testSwap() throws Exception {
                String s = (String)ss.swap(bs, o);
-               if (! isEquals(expected, s)) {
+               if (ne(expected, s)) {
                        if (expected.isEmpty()) {
                                if (! label.startsWith("[]"))
                                        System.err.println(label.substring(0, 
label.indexOf(']')+1) + " "+s);  // NOT DEBUG
@@ -59,7 +59,7 @@ public abstract class RoundTripStringSwapTest<T> {
                String s = (String)ss.swap(bs, o);
                T o2 = ss.unswap(bs, s, bs.getClassMetaForObject(o));
                String s2 = (String)ss.swap(bs, o2);
-               if (! isEquals(s, s2)) {
+               if (ne(s, s2)) {
                        if (expected.isEmpty())
                                Assert.fail();
                        System.err.println("s=["+s+"], o=["+o+"], 
o.type=["+o.getClass().getName()+"], o2=["+o2+"], 
o2.type=["+o2.getClass().getName()+"]");  // NOT DEBUG

Reply via email to