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 673863192 Test modernization, clean up utility classes.
673863192 is described below

commit 67386319272f00d5e36e0a4c6b80fb2c83907cce
Author: James Bognar <[email protected]>
AuthorDate: Mon Aug 25 15:24:30 2025 -0400

    Test modernization, clean up utility classes.
---
 .../java/org/apache/juneau/bean/html5/Script.java  |   3 +-
 .../java/org/apache/juneau/bean/html5/Style.java   |   3 +-
 .../juneau/assertions/FluentArrayAssertion.java    |   4 +-
 .../juneau/assertions/FluentListAssertion.java     |   4 +-
 .../juneau/assertions/FluentStringAssertion.java   |   4 +-
 .../apache/juneau/common/internal/StringUtils.java | 226 ++-------------------
 .../org/apache/juneau/common/internal/Utils.java   | 184 +++++++++++++++++
 .../apache/juneau/config/event/ConfigEvent.java    |   2 +-
 .../java/org/apache/juneau/ContextSession.java     |   3 +-
 .../main/java/org/apache/juneau/MediaRanges.java   |   2 +-
 .../main/java/org/apache/juneau/StringRanges.java  |   4 +-
 .../src/main/java/org/apache/juneau/Version.java   |   2 +-
 .../org/apache/juneau/httppart/HttpPartSchema.java |   8 +-
 .../org/apache/juneau/jsonschema/SchemaUtils.java  |   2 +-
 .../juneau/oapi/OpenApiSerializerSession.java      |   8 +-
 .../java/org/apache/juneau/parser/Position.java    |   2 +-
 .../juneau/utils/StringExpressionMatcher.java      |   4 +-
 .../apache/juneau/doc/internal/DocGenerator.java   |   2 +-
 .../apache/juneau/http/header/BasicCsvHeader.java  |   4 +-
 .../org/apache/juneau/http/header/EntityTags.java  |   2 +-
 .../org/apache/juneau/http/header/HeaderList.java  |   2 +-
 .../java/org/apache/juneau/http/header/Thrown.java |   2 +-
 .../apache/juneau/http/part/BasicCsvArrayPart.java |   4 +-
 .../java/org/apache/juneau/rest/RestOpContext.java |   2 +-
 .../org/apache/juneau/rest/guard/RoleMatcher.java  |   4 +-
 .../rest/swagger/BasicSwaggerProviderSession.java  |   2 +-
 .../org/apache/juneau/rest/util/RestUtils.java     |   2 +-
 .../org/apache/juneau/config/ConfigMapTest.java    |  61 +++---
 .../juneau/http/header/AcceptCharset_Test.java     |   2 +-
 .../juneau/http/header/AcceptEncoding_Test.java    |   2 +-
 .../juneau/http/header/AcceptLanguage_Test.java    |   2 +-
 .../juneau/http/header/AcceptRanges_Test.java      |   2 +-
 .../org/apache/juneau/http/header/Accept_Test.java |   2 +-
 .../org/apache/juneau/http/header/Age_Test.java    |   2 +-
 .../org/apache/juneau/http/header/Allow_Test.java  |   2 +-
 .../juneau/http/header/Authorization_Test.java     |   2 +-
 .../http/header/BasicBooleanHeader_Test.java       |   2 +-
 .../juneau/http/header/BasicCsvHeader_Test.java    |   2 +-
 .../juneau/http/header/BasicDateHeader_Test.java   |   2 +-
 .../http/header/BasicEntityTagHeader_Test.java     |   2 +-
 .../http/header/BasicEntityTagsHeader_Test.java    |   2 +-
 .../http/header/BasicIntegerHeader_Test.java       |   2 +-
 .../juneau/http/header/BasicLongHeader_Test.java   |   2 +-
 .../http/header/BasicMediaRangesHeader_Test.java   |   2 +-
 .../http/header/BasicMediaTypeHeader_Test.java     |   2 +-
 .../juneau/http/header/BasicStringHeader_Test.java |   2 +-
 .../http/header/BasicStringRangesHeader_Test.java  |   2 +-
 .../juneau/http/header/BasicUriHeader_Test.java    |   2 +-
 .../juneau/http/header/CacheControl_Test.java      |   2 +-
 .../juneau/http/header/ClientVersion_Test.java     |   2 +-
 .../apache/juneau/http/header/Connection_Test.java |   2 +-
 .../http/header/ContentDisposition_Test.java       |   2 +-
 .../juneau/http/header/ContentEncoding_Test.java   |   2 +-
 .../juneau/http/header/ContentLanguage_Test.java   |   2 +-
 .../juneau/http/header/ContentLength_Test.java     |   2 +-
 .../juneau/http/header/ContentLocation_Test.java   |   2 +-
 .../juneau/http/header/ContentRange_Test.java      |   2 +-
 .../juneau/http/header/ContentType_Test.java       |   2 +-
 .../org/apache/juneau/http/header/Date_Test.java   |   2 +-
 .../org/apache/juneau/http/header/ETag_Test.java   |   2 +-
 .../org/apache/juneau/http/header/Expect_Test.java |   2 +-
 .../apache/juneau/http/header/Expires_Test.java    |   2 +-
 .../apache/juneau/http/header/Forwarded_Test.java  |   2 +-
 .../org/apache/juneau/http/header/From_Test.java   |   2 +-
 .../org/apache/juneau/http/header/Host_Test.java   |   2 +-
 .../apache/juneau/http/header/IfMatch_Test.java    |   2 +-
 .../juneau/http/header/IfModifiedSince_Test.java   |   2 +-
 .../juneau/http/header/IfNoneMatch_Test.java       |   2 +-
 .../apache/juneau/http/header/IfRange_Test.java    |   2 +-
 .../juneau/http/header/IfUnmodifiedSince_Test.java |   2 +-
 .../juneau/http/header/LastModified_Test.java      |   2 +-
 .../apache/juneau/http/header/Location_Test.java   |   2 +-
 .../juneau/http/header/MaxForwards_Test.java       |   2 +-
 .../apache/juneau/http/header/NoTrace_Test.java    |   2 +-
 .../org/apache/juneau/http/header/Origin_Test.java |   2 +-
 .../org/apache/juneau/http/header/Pragma_Test.java |   2 +-
 .../juneau/http/header/ProxyAuthenticate_Test.java |   2 +-
 .../http/header/ProxyAuthorization_Test.java       |   2 +-
 .../org/apache/juneau/http/header/Range_Test.java  |   2 +-
 .../apache/juneau/http/header/Referer_Test.java    |   2 +-
 .../apache/juneau/http/header/RetryAfter_Test.java |   2 +-
 .../org/apache/juneau/http/header/Server_Test.java |   2 +-
 .../org/apache/juneau/http/header/TE_Test.java     |   2 +-
 .../apache/juneau/http/header/Trailer_Test.java    |   2 +-
 .../juneau/http/header/TransferEncoding_Test.java  |   2 +-
 .../apache/juneau/http/header/Upgrade_Test.java    |   2 +-
 .../apache/juneau/http/header/UserAgent_Test.java  |   2 +-
 .../org/apache/juneau/http/header/Vary_Test.java   |   2 +-
 .../org/apache/juneau/http/header/Via_Test.java    |   2 +-
 .../apache/juneau/http/header/Warning_Test.java    |   2 +-
 .../juneau/http/header/WwwAuthenticate_Test.java   |   2 +-
 .../juneau/rest/guards/RoleMatcher_Test.java       |   2 +-
 .../juneau/utest/utils/FakeWriterSerializer.java   |   6 +-
 .../org/apache/juneau/utils/StringUtilsTest.java   |  32 +--
 .../apache/juneau/utils/StringVarResolverTest.java |   3 +-
 95 files changed, 363 insertions(+), 358 deletions(-)

diff --git 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Script.java
 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Script.java
index 9431073e5..c242fd868 100644
--- 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Script.java
+++ 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Script.java
@@ -18,6 +18,7 @@ import java.net.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.internal.*;
 
 /**
@@ -45,7 +46,7 @@ public class Script extends HtmlElementRawText {
         * @param text The child text node.
         */
        public Script(String type, String...text) {
-               type(type).text(joinnl(text));
+               type(type).text(Utils.joinnl(text));
        }
 
        /**
diff --git 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Style.java
 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Style.java
index 851e69c61..7c2680177 100644
--- 
a/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Style.java
+++ 
b/juneau-bean/juneau-bean-html5/src/main/java/org/apache/juneau/bean/html5/Style.java
@@ -15,6 +15,7 @@ package org.apache.juneau.bean.html5;
 import static org.apache.juneau.common.internal.StringUtils.*;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.internal.*;
 
 /**
@@ -51,7 +52,7 @@ public class Style extends HtmlElementRawText {
         *      <br>Values will be concatenated with newlines.
         */
        public Style(String...text) {
-               text(joinnl(text));
+               text(Utils.joinnl(text));
        }
 
        /**
diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
index 6865819c0..8ba9cfd4e 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
@@ -209,7 +209,7 @@ public class FluentArrayAssertion<E,R> extends 
FluentObjectAssertion<E[],R> {
         * @return A fluent string assertion.  Never <jk>null</jk>.
         */
        public FluentStringAssertion<R> asCdl() {
-               return new FluentStringAssertion<>(this, valueIsNull() ? null : 
StringUtils.join(value(), ','), returns());
+               return new FluentStringAssertion<>(this, valueIsNull() ? null : 
Utils.join(value(), ','), returns());
        }
 
        /**
@@ -220,7 +220,7 @@ public class FluentArrayAssertion<E,R> extends 
FluentObjectAssertion<E[],R> {
         */
        public FluentStringAssertion<R> asCdl(Function<E,String> function) {
                List<String> l = valueIsNull() ? null : 
stream(value()).map(function::apply).toList();
-               return new FluentStringAssertion<>(this, StringUtils.join(l, 
','), returns());
+               return new FluentStringAssertion<>(this, Utils.join(l, ','), 
returns());
        }
 
        /**
diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
index 9e3271d9f..43aee97f0 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
@@ -281,7 +281,7 @@ public class FluentListAssertion<E,R> extends 
FluentCollectionAssertion<E,R> {
         * @return A fluent string assertion.  Never <jk>null</jk>.
         */
        public FluentStringAssertion<R> asCdl() {
-               return new FluentStringAssertion<>(this, valueIsNull() ? null : 
StringUtils.join(value(), ','), returns());
+               return new FluentStringAssertion<>(this, valueIsNull() ? null : 
Utils.join(value(), ','), returns());
        }
 
        /**
@@ -292,7 +292,7 @@ public class FluentListAssertion<E,R> extends 
FluentCollectionAssertion<E,R> {
         */
        public FluentStringAssertion<R> asCdl(Function<E,String> function) {
                List<String> l = valueIsNull() ? null : 
value().stream().map(function::apply).toList();
-               return new FluentStringAssertion<>(this, join(l, ','), 
returns());
+               return new FluentStringAssertion<>(this, Utils.join(l, ','), 
returns());
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
index 1f659b9d7..ca4f5fb1d 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentStringAssertion.java
@@ -392,7 +392,7 @@ public class FluentStringAssertion<R> extends 
FluentObjectAssertion<String,R> {
         */
        public R isLines(String...lines) throws AssertionError {
                assertArgNotNull("lines", lines);
-               var v = join(lines, '\n');
+               var v = Utils.join(lines, '\n');
                var s = value();
                if (Utils.ne(v, s))
                        throw error(MSG_stringDifferedAtPosition, 
diffPosition(v, s), fix(v), fix(s));
@@ -425,7 +425,7 @@ public class FluentStringAssertion<R> extends 
FluentObjectAssertion<String,R> {
                assertArgNotNull("lines", lines);
 
                // Must work for windows too.
-               var e = StringUtils.join(lines, '\n').trim().split("[\r\n]+");
+               var e = Utils.join(lines, '\n').trim().split("[\r\n]+");
                var a = value().trim().split("[\r\n]+");
 
                if (e.length != a.length)
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
index 19beb0a39..6839efa34 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
@@ -294,215 +294,11 @@ public final class StringUtils {
                return true;
        }
 
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param separator The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(Object[] tokens, String separator) {
-               if (tokens == null)
-                       return null;
-               var sb = new StringBuilder();
-               for (var i = 0; i < tokens.length; i++) {
-                       if (i > 0)
-                               sb.append(separator);
-                       sb.append(tokens[i]);
-               }
-               return sb.toString();
-       }
-
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(Collection<?> tokens, String d) {
-               if (tokens == null)
-                       return null;
-               return join(tokens, d, new StringBuilder()).toString();
-       }
-
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(List<?> tokens, String d) {
-               if (tokens == null)
-                       return null;
-               return join(tokens, d, new StringBuilder()).toString();
-       }
-
-       /**
-        * Joins the specified tokens into a delimited string and writes the 
output to the specified string builder.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @param sb The string builder to append the response to.
-        * @return The same string builder passed in as <c>sb</c>.
-        */
-       public static StringBuilder join(Collection<?> tokens, String d, 
StringBuilder sb) {
-               if (tokens == null)
-                       return sb;
-               for (var iter = tokens.iterator(); iter.hasNext();) {
-                       sb.append(iter.next());
-                       if (iter.hasNext())
-                               sb.append(d);
-               }
-               return sb;
-       }
-
-       /**
-        * Joins the specified tokens into a delimited string and writes the 
output to the specified string builder.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @param sb The string builder to append the response to.
-        * @return The same string builder passed in as <c>sb</c>.
-        */
-       public static StringBuilder join(List<?> tokens, String d, 
StringBuilder sb) {
-               if (tokens == null)
-                       return sb;
-               for (int i = 0, j = tokens.size(); i < j; i++) {
-                       if (i > 0)
-                               sb.append(d);
-                       sb.append(tokens.get(i));
-               }
-               return sb;
-       }
-
-       /**
-        * Joins the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(Object[] tokens, char d) {
-               if (tokens == null)
-                       return null;
-               if (tokens.length == 1)
-                       return emptyIfNull(Utils.s(tokens[0]));
-               return join(tokens, d, new StringBuilder()).toString();
-       }
-
        private static AsciiSet getEscapeSet(char c) {
                return ESCAPE_SETS.computeIfAbsent(c, key -> 
AsciiSet.create().chars(key, '\\').build());
        }
        static final Map<Character,AsciiSet> ESCAPE_SETS = new 
ConcurrentHashMap<>();
 
-       /**
-        * Join the specified tokens into a delimited string and writes the 
output to the specified string builder.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @param sb The string builder to append the response to.
-        * @return The same string builder passed in as <c>sb</c>.
-        */
-       public static StringBuilder join(Object[] tokens, char d, StringBuilder 
sb) {
-               if (tokens == null)
-                       return sb;
-               for (var i = 0; i < tokens.length; i++) {
-                       if (i > 0)
-                               sb.append(d);
-                       sb.append(tokens[i]);
-               }
-               return sb;
-       }
-
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(int[] tokens, char d) {
-               if (tokens == null)
-                       return null;
-               var sb = new StringBuilder();
-               for (var i = 0; i < tokens.length; i++) {
-                       if (i > 0)
-                               sb.append(d);
-                       sb.append(tokens[i]);
-               }
-               return sb.toString();
-       }
-
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(Collection<?> tokens, char d) {
-               if (tokens == null)
-                       return null;
-               var sb = new StringBuilder();
-               for (var iter = tokens.iterator(); iter.hasNext();) {
-                       sb.append(iter.next());
-                       if (iter.hasNext())
-                               sb.append(d);
-               }
-               return sb.toString();
-       }
-
-       /**
-        * Join the specified tokens into a delimited string.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String join(List<?> tokens, char d) {
-               if (tokens == null)
-                       return null;
-               var sb = new StringBuilder();
-               for (int i = 0, j = tokens.size(); i < j; i++) {
-                       if (i > 0)
-                               sb.append(d);
-                       sb.append(tokens.get(i));
-               }
-               return sb.toString();
-       }
-
-       /**
-        * Same as {@link #join(Collection, char)} but escapes the delimiter if 
found in the tokens.
-        *
-        * @param tokens The tokens to join.
-        * @param d The delimiter.
-        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
-        */
-       public static String joine(List<?> tokens, char d) {
-               if (tokens == null)
-                       return null;
-               var as = getEscapeSet(d);
-               var sb = new StringBuilder();
-               for (int i = 0, j = tokens.size(); i < j; i++) {
-                       if (i > 0)
-                               sb.append(d);
-                       sb.append(escapeChars(Utils.s(tokens.get(i)), as));
-               }
-               return sb.toString();
-       }
-
-       /**
-        * Joins tokens with newlines.
-        *
-        * @param tokens The tokens to concatenate.
-        * @return A string with the specified tokens contatenated with 
newlines.
-        */
-       public static String joinnl(Object[] tokens) {
-               return join(tokens, '\n');
-       }
-
        /**
         * Shortcut for calling <code>split(s, <js>','</js>)</code>
         *
@@ -2917,7 +2713,7 @@ public final class StringUtils {
                        return sb.toString();
                }
                if (o instanceof Collection)
-                       return join((Collection<?>)o, ", ");
+                       return Utils.join((Collection<?>)o, ", ");
                return o.toString();
        }
 
@@ -2942,4 +2738,24 @@ public final class StringUtils {
        public static String toHex(InputStream is) {
                return safe(()->is == null ? null : toHex(readBytes(is)));
        }
+
+       /**
+        * Same as {@link Utils#join(Collection, char)} but escapes the 
delimiter if found in the tokens.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String joine(List<?> tokens, char d) {
+               if (tokens == null)
+                       return null;
+               var as = getEscapeSet(d);
+               var sb = new StringBuilder();
+               for (int i = 0, j = tokens.size(); i < j; i++) {
+                       if (i > 0)
+                               sb.append(d);
+                       sb.append(escapeChars(Utils.s(tokens.get(i)), as));
+               }
+               return sb.toString();
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
index b6c3a70d4..52e2873a3 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
@@ -739,4 +739,188 @@ public class Utils {
        public static boolean neic(String s1, String s2) {
                return ! eqic(s1, s2);
        }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param separator The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(Object[] tokens, String separator) {
+               if (tokens == null)
+                       return null;
+               var sb = new StringBuilder();
+               for (var i = 0; i < tokens.length; i++) {
+                       if (i > 0)
+                               sb.append(separator);
+                       sb.append(tokens[i]);
+               }
+               return sb.toString();
+       }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(Collection<?> tokens, String d) {
+               if (tokens == null)
+                       return null;
+               return join(tokens, d, new StringBuilder()).toString();
+       }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(List<?> tokens, String d) {
+               if (tokens == null)
+                       return null;
+               return join(tokens, d, new StringBuilder()).toString();
+       }
+
+       /**
+        * Joins the specified tokens into a delimited string and writes the 
output to the specified string builder.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @param sb The string builder to append the response to.
+        * @return The same string builder passed in as <c>sb</c>.
+        */
+       public static StringBuilder join(Collection<?> tokens, String d, 
StringBuilder sb) {
+               if (tokens == null)
+                       return sb;
+               for (var iter = tokens.iterator(); iter.hasNext();) {
+                       sb.append(iter.next());
+                       if (iter.hasNext())
+                               sb.append(d);
+               }
+               return sb;
+       }
+
+       /**
+        * Joins the specified tokens into a delimited string and writes the 
output to the specified string builder.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @param sb The string builder to append the response to.
+        * @return The same string builder passed in as <c>sb</c>.
+        */
+       public static StringBuilder join(List<?> tokens, String d, 
StringBuilder sb) {
+               if (tokens == null)
+                       return sb;
+               for (int i = 0, j = tokens.size(); i < j; i++) {
+                       if (i > 0)
+                               sb.append(d);
+                       sb.append(tokens.get(i));
+               }
+               return sb;
+       }
+
+       /**
+        * Joins the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(Object[] tokens, char d) {
+               if (tokens == null)
+                       return null;
+               if (tokens.length == 1)
+                       return emptyIfNull(s(tokens[0]));
+               return join(tokens, d, new StringBuilder()).toString();
+       }
+
+       /**
+        * Join the specified tokens into a delimited string and writes the 
output to the specified string builder.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @param sb The string builder to append the response to.
+        * @return The same string builder passed in as <c>sb</c>.
+        */
+       public static StringBuilder join(Object[] tokens, char d, StringBuilder 
sb) {
+               if (tokens == null)
+                       return sb;
+               for (var i = 0; i < tokens.length; i++) {
+                       if (i > 0)
+                               sb.append(d);
+                       sb.append(tokens[i]);
+               }
+               return sb;
+       }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(int[] tokens, char d) {
+               if (tokens == null)
+                       return null;
+               var sb = new StringBuilder();
+               for (var i = 0; i < tokens.length; i++) {
+                       if (i > 0)
+                               sb.append(d);
+                       sb.append(tokens[i]);
+               }
+               return sb.toString();
+       }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(Collection<?> tokens, char d) {
+               if (tokens == null)
+                       return null;
+               var sb = new StringBuilder();
+               for (var iter = tokens.iterator(); iter.hasNext();) {
+                       sb.append(iter.next());
+                       if (iter.hasNext())
+                               sb.append(d);
+               }
+               return sb.toString();
+       }
+
+       /**
+        * Join the specified tokens into a delimited string.
+        *
+        * @param tokens The tokens to join.
+        * @param d The delimiter.
+        * @return The delimited string.  If <c>tokens</c> is <jk>null</jk>, 
returns <jk>null</jk>.
+        */
+       public static String join(List<?> tokens, char d) {
+               if (tokens == null)
+                       return null;
+               var sb = new StringBuilder();
+               for (int i = 0, j = tokens.size(); i < j; i++) {
+                       if (i > 0)
+                               sb.append(d);
+                       sb.append(tokens.get(i));
+               }
+               return sb.toString();
+       }
+
+       /**
+        * Joins tokens with newlines.
+        *
+        * @param tokens The tokens to concatenate.
+        * @return A string with the specified tokens contatenated with 
newlines.
+        */
+       public static String joinnl(Object[] tokens) {
+               return join(tokens, '\n');
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvent.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvent.java
index fa5a4947f..6153f0c53 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvent.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/event/ConfigEvent.java
@@ -215,7 +215,7 @@ public class ConfigEvent {
                return switch (type) {
                        case REMOVE_SECTION -> "REMOVE_SECTION(" + section + 
")";
                        case REMOVE_ENTRY -> "REMOVE_ENTRY(" + section + 
(section.isEmpty() ? "" : "/") + key + ")";
-                       case SET_SECTION -> "SET_SECTION(" + section + ", 
preLines=" + StringUtils.join(preLines, '|') + ")";
+                       case SET_SECTION -> "SET_SECTION(" + section + ", 
preLines=" + Utils.join(preLines, '|') + ")";
                        case SET_ENTRY -> {
                                var out = new StringBuilder("SET(");
                                out.append(section + (section.isEmpty() ? "" : 
"/") + key);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextSession.java
index ac86d5859..024d07d0c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ContextSession.java
@@ -21,6 +21,7 @@ import java.util.*;
 import java.util.function.*;
 
 import org.apache.juneau.collections.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.internal.*;
 
 /**
@@ -237,7 +238,7 @@ public abstract class ContextSession {
         */
        public void checkForWarnings() {
                if (debug && ! getWarnings().isEmpty())
-                       throw new BeanRuntimeException("Warnings occurred in 
session: \n" + join(getWarnings(), "\n"));
+                       throw new BeanRuntimeException("Warnings occurred in 
session: \n" + Utils.join(getWarnings(), "\n"));
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaRanges.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaRanges.java
index 92bffc7ec..bc80f34c6 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaRanges.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaRanges.java
@@ -100,7 +100,7 @@ public class MediaRanges {
                        ranges[i] = new MediaRange(e[i]);
                Arrays.sort(ranges, RANGE_COMPARATOR);
 
-               this.string = ranges.length == 1 ? ranges[0].toString() : 
StringUtils.join(ranges, ',');
+               this.string = ranges.length == 1 ? ranges[0].toString() : 
Utils.join(ranges, ',');
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/StringRanges.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/StringRanges.java
index 9a1b891c4..3ff7865ca 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/StringRanges.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/StringRanges.java
@@ -111,7 +111,7 @@ public class StringRanges {
         * @param value The string range header value.
         */
        public StringRanges(StringRange...value) {
-               this.string = StringUtils.join(value, ", ");
+               this.string = Utils.join(value, ", ");
                this.value = copyOf(value);
        }
 
@@ -127,7 +127,7 @@ public class StringRanges {
                        value[i] = new StringRange(e[i]);
                Arrays.sort(value, RANGE_COMPARATOR);
 
-               this.string = value.length == 1 ? value[0].toString() : 
StringUtils.join(value, ", ");
+               this.string = value.length == 1 ? value[0].toString() : 
Utils.join(value, ", ");
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Version.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Version.java
index d5307aeb8..92d0190f1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Version.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Version.java
@@ -236,7 +236,7 @@ public class Version implements Comparable<Version> {
 
        @Override /* Object */
        public String toString() {
-               return join(parts, '.');
+               return Utils.join(parts, '.');
        }
 
        @Override
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 1a056aeb1..a034ea993 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -3198,7 +3198,7 @@ public class HttpPartSchema {
                private String joinnlOrNull(String[]...s) {
                        for (String[] ss : s)
                                if (ss.length > 0)
-                                       return joinnl(ss);
+                                       return Utils.joinnl(ss);
                        return null;
                }
        }
@@ -3400,7 +3400,7 @@ public class HttpPartSchema {
 
                List<String> notAllowed2 = notAllowed.build();
                if (! notAllowed2.isEmpty())
-                       errors.add("Attributes not allow for type='"+type+"': " 
+ StringUtils.join(notAllowed2, ","));
+                       errors.add("Attributes not allow for type='"+type+"': " 
+ Utils.join(notAllowed2, ","));
                if (invalidFormat)
                        errors.add("Invalid format for type='"+type+"': 
'"+format+"'");
                if (exclusiveMaximum && maximum == null)
@@ -3433,7 +3433,7 @@ public class HttpPartSchema {
                        errors.add("Cannot define an array of objects unless 
array format is 'uon'.");
 
                if (! errors.isEmpty())
-                       throw new ContextRuntimeException("Schema specification 
errors: \n\t" + join(errors, "\n\t"), new Object[0]);
+                       throw new ContextRuntimeException("Schema specification 
errors: \n\t" + Utils.join(errors, "\n\t"), new Object[0]);
        }
 
        /**
@@ -4073,7 +4073,7 @@ public class HttpPartSchema {
        }
 
        final static JsonMap toJsonMap(String[] ss) {
-               String s = joinnl(ss);
+               String s = Utils.joinnl(ss);
                if (s.isEmpty())
                        return null;
                if (! isJsonObject(s, true))
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/SchemaUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/SchemaUtils.java
index a4960e2cb..4df5290eb 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/SchemaUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/SchemaUtils.java
@@ -103,7 +103,7 @@ public class SchemaUtils {
        public static String joinnl(String[]...s) {
                for (String[] ss : s) {
                        if (ss.length != 0)
-                               return StringUtils.joinnl(ss).trim();
+                               return Utils.joinnl(ss).trim();
                }
                return "";
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
index d1a5069f0..9c461eaa5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
@@ -553,13 +553,13 @@ public class OpenApiSerializerSession extends 
UonSerializerSession {
                } else if (t == ARRAY) {
                        List l = toList(partType, getClassMetaForObject(o), o, 
s);
                        if (cf == CSV)
-                               return joine(l, ',');
+                               return StringUtils.joine(l, ',');
                        if (cf == PIPES)
-                               return joine(l, '|');
+                               return StringUtils.joine(l, '|');
                        if (cf == SSV)
-                               return join(l, ' ');
+                               return Utils.join(l, ' ');
                        if (cf == TSV)
-                               return join(l, '\t');
+                               return Utils.join(l, '\t');
                        return l;
                } else if (t == OBJECT) {
                        return toMap(partType, getClassMetaForObject(o), o, s);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Position.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Position.java
index d760e29c4..e9ccb7e27 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Position.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/Position.java
@@ -64,7 +64,7 @@ public class Position {
                        l.add("position " + position);
                if (l.isEmpty())
                        l.add("unknown");
-               return StringUtils.join(l, ", ");
+               return Utils.join(l, ", ");
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
index 1cb26c957..d70b1c6f9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
@@ -270,7 +270,7 @@ public class StringExpressionMatcher {
 
                @Override /* Object */
                public String toString() {
-                       return "(& " + StringUtils.join(clauses, " ") + ')';
+                       return "(& " + Utils.join(clauses, " ") + ')';
                }
        }
 
@@ -297,7 +297,7 @@ public class StringExpressionMatcher {
 
                @Override /* Object */
                public String toString() {
-                       return "(| " + StringUtils.join(clauses, " ") + ')';
+                       return "(| " + Utils.join(clauses, " ") + ')';
                }
        }
 
diff --git 
a/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java 
b/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
index 8a4db67ad..9a58d01e1 100644
--- a/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
+++ b/juneau-doc/src/main/java/org/apache/juneau/doc/internal/DocGenerator.java
@@ -275,7 +275,7 @@ public class DocGenerator {
                                        if (titleMap.flags != null)
                                                
Arrays.stream(titleMap.flags.split(",")).forEach(x -> 
tags.add("<b><red>"+x+"</red></b>"));
                                        title = titleMap.title;
-                                       this.tags = StringUtils.join(tags, ", 
");
+                                       this.tags = Utils.join(tags, ", ");
                                }
                                if (s.contains("{@link org.apache.juneau."))
                                        WARNINGS.add("Found {@link 
org.apache.juneau...} in file " + f.getAbsolutePath());
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/BasicCsvHeader.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/BasicCsvHeader.java
index b7233110e..d5d0a1bbf 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/BasicCsvHeader.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/BasicCsvHeader.java
@@ -123,7 +123,7 @@ public class BasicCsvHeader extends BasicHeader {
         * @throws IllegalArgumentException If name is <jk>null</jk> or empty.
         */
        public BasicCsvHeader(String name, String...value) {
-               super(name, join(value, ", "));
+               super(name, Utils.join(value, ", "));
                this.value = copyOf(value);
                this.supplier = null;
        }
@@ -148,7 +148,7 @@ public class BasicCsvHeader extends BasicHeader {
 
        @Override /* Header */
        public String getValue() {
-               return join(value(), ", ");
+               return Utils.join(value(), ", ");
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/EntityTags.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/EntityTags.java
index 67b322a4c..4b5ee667b 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/EntityTags.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/EntityTags.java
@@ -76,7 +76,7 @@ public class EntityTags {
         * @param value The header value.
         */
        public EntityTags(EntityTag...value) {
-               this.string = join(value, ", ");
+               this.string = Utils.join(value, ", ");
                this.value = copyOf(value);
        }
 
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
index a187fd861..39de5fcad 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -949,7 +949,7 @@ public class HeaderList extends ControlledArrayList<Header> 
{
 
        @Override /* Object */
        public String toString() {
-               return "[" + join(this, ", ") + "]";
+               return "[" + Utils.join(this, ", ") + "]";
        }
 
        // <FluentSetters>
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Thrown.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Thrown.java
index de0727dbd..ef29bcbdf 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Thrown.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Thrown.java
@@ -120,7 +120,7 @@ public class Thrown extends BasicCsvHeader {
         *      The header value.
         */
        public Thrown(List<Part> value) {
-               super(NAME, join(value, ", "));
+               super(NAME, Utils.join(value, ", "));
                this.value = u(value);
        }
 
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
index 0127bd393..6fe4dd295 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicCsvArrayPart.java
@@ -119,9 +119,9 @@ public class BasicCsvArrayPart extends BasicPart {
        @Override /* Header */
        public String getValue() {
                if (supplier != null)
-                       return join(supplier.get(), ',');
+                       return Utils.join(supplier.get(), ',');
                if (stringValue != null)
-                       stringValue = join(value, ',');
+                       stringValue = Utils.join(value, ',');
                return stringValue;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index b3001aad3..4f6e70ff3 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -2204,7 +2204,7 @@ public class RestOpContext extends Context implements 
Comparable<RestOpContext>
                private String joinnlFirstNonEmptyArray(String[]...s) {
                        for (String[] ss : s)
                                if (ss.length > 0)
-                                       return StringUtils.joinnl(ss);
+                                       return Utils.joinnl(ss);
                        return null;
                }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
index 944ec570e..e00e1c1d5 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
@@ -273,7 +273,7 @@ public class RoleMatcher {
 
                @Override /* Object */
                public String toString() {
-                       return "(& " + StringUtils.join(clauses, " ") + ')';
+                       return "(& " + Utils.join(clauses, " ") + ')';
                }
        }
 
@@ -300,7 +300,7 @@ public class RoleMatcher {
 
                @Override /* Object */
                public String toString() {
-                       return "(| " + StringUtils.join(clauses, " ") + ')';
+                       return "(| " + Utils.join(clauses, " ") + ')';
                }
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
index 12e58be47..9730ef85c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
@@ -1135,7 +1135,7 @@ public class BasicSwaggerProviderSession {
        static String joinnl(String[]...s) {
                for (String[] ss : s) {
                        if (ss.length != 0)
-                       return StringUtils.joinnl(ss).trim();
+                       return Utils.joinnl(ss).trim();
                }
                return "";
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
index 6e2b4ddb1..264babc7a 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/RestUtils.java
@@ -225,7 +225,7 @@ public final class RestUtils {
                        else if (fromParent != null)
                                l.add(fromParent);
                }
-               return join(l, '\n');
+               return Utils.join(l, '\n');
        }
 
        private static final Pattern INDEXED_LINK_PATTERN = 
Pattern.compile("(?s)(\\S*)\\[(\\d+)\\]\\:(.*)");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigMapTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigMapTest.java
index 3f4c6db4f..67296dcc2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigMapTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigMapTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.config.internal.*;
 import org.apache.juneau.config.store.*;
 import org.junit.jupiter.api.*;
@@ -61,8 +62,8 @@ class ConfigMapTest extends SimpleTestBase {
 
                assertLines("foo=bar|", cm);
 
-               assertEquals("", join(cm.getPreLines(""), '|'));
-               assertEquals("", join(cm.getEntry("", "foo").getPreLines(), 
'|'));
+               assertEquals("", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("", Utils.join(cm.getEntry("", 
"foo").getPreLines(), '|'));
 
                assertEquals("bar", cm.getEntry("", "foo").getValue());
 
@@ -84,8 +85,8 @@ class ConfigMapTest extends SimpleTestBase {
 
                assertLines("#comment|foo=bar|", cm);
 
-               assertEquals("", join(cm.getPreLines(""), '|'));
-               assertEquals("#comment", join(cm.getEntry("", 
"foo").getPreLines(), '|'));
+               assertEquals("", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("#comment", Utils.join(cm.getEntry("", 
"foo").getPreLines(), '|'));
 
                assertEquals("bar", cm.getEntry("", "foo").getValue());
 
@@ -107,9 +108,9 @@ class ConfigMapTest extends SimpleTestBase {
 
                assertLines("[MySection]|foo=bar|", cm);
 
-               assertEquals("", join(cm.getPreLines(""), '|'));
-               assertEquals("", join(cm.getPreLines("MySection"), '|'));
-               assertEquals("", join(cm.getEntry("MySection", 
"foo").getPreLines(), '|'));
+               assertEquals("", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("", Utils.join(cm.getPreLines("MySection"), '|'));
+               assertEquals("", Utils.join(cm.getEntry("MySection", 
"foo").getPreLines(), '|'));
 
                assertEquals("bar", cm.getEntry("MySection", "foo").getValue());
 
@@ -131,7 +132,7 @@ class ConfigMapTest extends SimpleTestBase {
 
                assertLines("[MySection]|foo=bar|", cm);
 
-               assertEquals("", join(cm.getPreLines(""), '|'));
+               assertEquals("", Utils.join(cm.getPreLines(""), '|'));
 
                assertNull(cm.getPreLines("XXX"));
 
@@ -156,11 +157,11 @@ class ConfigMapTest extends SimpleTestBase {
                ConfigMap cm = s.getMap("A.cfg");
                assertLines("#S1|[S1]|#k1|k1=v1|#S2|[S2]|#k2|k2=v2|", cm);
 
-               assertEquals("", join(cm.getPreLines(""), '|'));
-               assertEquals("#S1", join(cm.getPreLines("S1"), '|'));
-               assertEquals("#k1", join(cm.getEntry("S1", "k1").getPreLines(), 
'|'));
-               assertEquals("#S2", join(cm.getPreLines("S2"), '|'));
-               assertEquals("#k2", join(cm.getEntry("S2", "k2").getPreLines(), 
'|'));
+               assertEquals("", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("#S1", Utils.join(cm.getPreLines("S1"), '|'));
+               assertEquals("#k1", Utils.join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
+               assertEquals("#S2", Utils.join(cm.getPreLines("S2"), '|'));
+               assertEquals("#k2", Utils.join(cm.getEntry("S2", 
"k2").getPreLines(), '|'));
 
                assertEquals("v1", cm.getEntry("S1", "k1").getValue());
                assertEquals("v2", cm.getEntry("S2", "k2").getValue());
@@ -188,10 +189,10 @@ class ConfigMapTest extends SimpleTestBase {
                ConfigMap cm = s.getMap("A.cfg");
                assertLines("#D||#k|k=v|#S1|[S1]|#k1|k1=v1|", cm);
 
-               assertEquals("#D", join(cm.getPreLines(""), '|'));
-               assertEquals("#k", join(cm.getEntry("", "k").getPreLines(), 
'|'));
-               assertEquals("#S1", join(cm.getPreLines("S1"), '|'));
-               assertEquals("#k1", join(cm.getEntry("S1", "k1").getPreLines(), 
'|'));
+               assertEquals("#D", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("#k", Utils.join(cm.getEntry("", 
"k").getPreLines(), '|'));
+               assertEquals("#S1", Utils.join(cm.getPreLines("S1"), '|'));
+               assertEquals("#k1", Utils.join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
 
                assertEquals("v", cm.getEntry("", "k").getValue());
                assertEquals("v1", cm.getEntry("S1", "k1").getValue());
@@ -231,10 +232,10 @@ class ConfigMapTest extends SimpleTestBase {
                ConfigMap cm = s.getMap("A.cfg");
                
assertLines("#Da|#Db||#ka||#kb||k=v||#S1a||#S1b||[S1]||#k1a||#k1b||k1=v1|", cm);
 
-               assertEquals("#Da|#Db", join(cm.getPreLines(""), '|'));
-               assertEquals("#ka||#kb|", join(cm.getEntry("", 
"k").getPreLines(), '|'));
-               assertEquals("|#S1a||#S1b|", join(cm.getPreLines("S1"), '|'));
-               assertEquals("|#k1a||#k1b|", join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
+               assertEquals("#Da|#Db", Utils.join(cm.getPreLines(""), '|'));
+               assertEquals("#ka||#kb|", Utils.join(cm.getEntry("", 
"k").getPreLines(), '|'));
+               assertEquals("|#S1a||#S1b|", Utils.join(cm.getPreLines("S1"), 
'|'));
+               assertEquals("|#k1a||#k1b|", Utils.join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
 
                assertEquals("v", cm.getEntry("", "k").getValue());
                assertEquals("v1", cm.getEntry("S1", "k1").getValue());
@@ -287,8 +288,8 @@ class ConfigMapTest extends SimpleTestBase {
                );
                ConfigMap cm = s.getMap("A.cfg");
 
-               assertEquals("", join(cm.getEntry("", "k1").getPreLines(), 
'|'));
-               assertEquals("", join(cm.getEntry("", "k2").getPreLines(), 
'|'));
+               assertEquals("", Utils.join(cm.getEntry("", 
"k1").getPreLines(), '|'));
+               assertEquals("", Utils.join(cm.getEntry("", 
"k2").getPreLines(), '|'));
 
                assertLines("k1 = v1a,|\tv1b,|\tv1c|k2 = v2a,|\tv2b,|\tv2c|", 
cm);
 
@@ -318,8 +319,8 @@ class ConfigMapTest extends SimpleTestBase {
                );
                ConfigMap cm = s.getMap("A.cfg");
 
-               assertEquals("|#k1|", join(cm.getEntry("", "k1").getPreLines(), 
'|'));
-               assertEquals("|#k2|", join(cm.getEntry("", "k2").getPreLines(), 
'|'));
+               assertEquals("|#k1|", Utils.join(cm.getEntry("", 
"k1").getPreLines(), '|'));
+               assertEquals("|#k2|", Utils.join(cm.getEntry("", 
"k2").getPreLines(), '|'));
 
                assertLines("|#k1||k1 = v1a,|   v1b,|   v1c||#k2||k2 = v2a,|    
v2b,|   v2c|", cm);
 
@@ -344,8 +345,8 @@ class ConfigMapTest extends SimpleTestBase {
                );
                ConfigMap cm = s.getMap("A.cfg");
 
-               assertEquals("", join(cm.getEntry("S1", "k1").getPreLines(), 
'|'));
-               assertEquals("", join(cm.getEntry("S1", "k2").getPreLines(), 
'|'));
+               assertEquals("", Utils.join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
+               assertEquals("", Utils.join(cm.getEntry("S1", 
"k2").getPreLines(), '|'));
 
                assertLines("[S1]|k1 = v1a,|\tv1b,|\tv1c|k2 = 
v2a,|\tv2b,|\tv2c|", cm);
 
@@ -379,9 +380,9 @@ class ConfigMapTest extends SimpleTestBase {
                );
                ConfigMap cm = s.getMap("A.cfg");
 
-               assertEquals("|#S1|", join(cm.getPreLines("S1"), '|'));
-               assertEquals("|#k1|", join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
-               assertEquals("|#k2|", join(cm.getEntry("S1", 
"k2").getPreLines(), '|'));
+               assertEquals("|#S1|", Utils.join(cm.getPreLines("S1"), '|'));
+               assertEquals("|#k1|", Utils.join(cm.getEntry("S1", 
"k1").getPreLines(), '|'));
+               assertEquals("|#k2|", Utils.join(cm.getEntry("S1", 
"k2").getPreLines(), '|'));
 
                assertLines("|#S1||[S1]||#k1||k1 = v1a,|        v1b,|   
v1c||#k2||k2 = v2a,|    v2b,|   v2c|", cm);
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptCharset_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptCharset_Test.java
index 7dcac0ec4..8d541f742 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptCharset_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptCharset_Test.java
@@ -36,7 +36,7 @@ class AcceptCharset_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptEncoding_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptEncoding_Test.java
index 30ecbccac..c49ff7b68 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptEncoding_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptEncoding_Test.java
@@ -36,7 +36,7 @@ class AcceptEncoding_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptLanguage_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptLanguage_Test.java
index effc1d0d2..fad3d243d 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptLanguage_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptLanguage_Test.java
@@ -36,7 +36,7 @@ class AcceptLanguage_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptRanges_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptRanges_Test.java
index 9b75922c5..4e60a85df 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptRanges_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/AcceptRanges_Test.java
@@ -35,7 +35,7 @@ class AcceptRanges_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Accept_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Accept_Test.java
index 5837db14a..e12162ec9 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Accept_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Accept_Test.java
@@ -41,7 +41,7 @@ class Accept_Test extends SimpleTestBase {
        public static class A {
                @RestGet
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Age_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Age_Test.java
index 116ca650f..a50b1c4f2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Age_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Age_Test.java
@@ -36,7 +36,7 @@ class Age_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Allow_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Allow_Test.java
index c1f131631..fe66c3833 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Allow_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Allow_Test.java
@@ -36,7 +36,7 @@ class Allow_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Authorization_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Authorization_Test.java
index 6a513208f..63e3e20d4 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Authorization_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Authorization_Test.java
@@ -35,7 +35,7 @@ class Authorization_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicBooleanHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicBooleanHeader_Test.java
index 8509f1ab5..1b4251a9e 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicBooleanHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicBooleanHeader_Test.java
@@ -37,7 +37,7 @@ class BasicBooleanHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicCsvHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicCsvHeader_Test.java
index 4816d352e..aaf564206 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicCsvHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicCsvHeader_Test.java
@@ -38,7 +38,7 @@ class BasicCsvHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
index 09ce52700..48f252dbb 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
@@ -40,7 +40,7 @@ class BasicDateHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagHeader_Test.java
index a09d5d348..8ba0cd640 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagHeader_Test.java
@@ -38,7 +38,7 @@ class BasicEntityTagHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagsHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagsHeader_Test.java
index 0aff4940a..f5d73b2bf 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagsHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicEntityTagsHeader_Test.java
@@ -37,7 +37,7 @@ class BasicEntityTagsHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi",aev=true) String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicIntegerHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicIntegerHeader_Test.java
index bee47f46c..5188a229f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicIntegerHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicIntegerHeader_Test.java
@@ -38,7 +38,7 @@ class BasicIntegerHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicLongHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicLongHeader_Test.java
index 3a296e78b..51d1ae6f9 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicLongHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicLongHeader_Test.java
@@ -37,7 +37,7 @@ class BasicLongHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaRangesHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaRangesHeader_Test.java
index 48ebd1f57..2276bb79b 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaRangesHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaRangesHeader_Test.java
@@ -38,7 +38,7 @@ class BasicMediaRangesHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaTypeHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaTypeHeader_Test.java
index ab449a7de..c3e629966 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaTypeHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicMediaTypeHeader_Test.java
@@ -38,7 +38,7 @@ class BasicMediaTypeHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringHeader_Test.java
index c078d57f2..7af7d4f7e 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringHeader_Test.java
@@ -37,7 +37,7 @@ class BasicStringHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringRangesHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringRangesHeader_Test.java
index dc287b043..d1764184f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringRangesHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicStringRangesHeader_Test.java
@@ -37,7 +37,7 @@ class BasicStringRangesHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicUriHeader_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicUriHeader_Test.java
index 271cade0e..f17ee3297 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicUriHeader_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicUriHeader_Test.java
@@ -39,7 +39,7 @@ class BasicUriHeader_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, '|'));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, '|'));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/CacheControl_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/CacheControl_Test.java
index c1818f235..2c7ed7d91 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/CacheControl_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/CacheControl_Test.java
@@ -36,7 +36,7 @@ class CacheControl_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ClientVersion_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ClientVersion_Test.java
index d0c319ad3..b446cb793 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ClientVersion_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ClientVersion_Test.java
@@ -36,7 +36,7 @@ class ClientVersion_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Connection_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Connection_Test.java
index c0eaf753c..8186e9f59 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Connection_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Connection_Test.java
@@ -37,7 +37,7 @@ class Connection_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentDisposition_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentDisposition_Test.java
index f059757da..582ee9e77 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentDisposition_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentDisposition_Test.java
@@ -36,7 +36,7 @@ class ContentDisposition_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentEncoding_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentEncoding_Test.java
index 11b024f37..30c10c786 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentEncoding_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentEncoding_Test.java
@@ -36,7 +36,7 @@ class ContentEncoding_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLanguage_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLanguage_Test.java
index 42fb03903..df63de6a4 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLanguage_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLanguage_Test.java
@@ -36,7 +36,7 @@ class ContentLanguage_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLength_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLength_Test.java
index de2e72ecb..694896b18 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLength_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLength_Test.java
@@ -36,7 +36,7 @@ class ContentLength_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLocation_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLocation_Test.java
index 199d03569..76dc943c8 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLocation_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentLocation_Test.java
@@ -37,7 +37,7 @@ class ContentLocation_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentRange_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentRange_Test.java
index bbe9829c2..9211a5fa5 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentRange_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentRange_Test.java
@@ -36,7 +36,7 @@ class ContentRange_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentType_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentType_Test.java
index 923e7377e..db7d2346f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentType_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ContentType_Test.java
@@ -37,7 +37,7 @@ class ContentType_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Date_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Date_Test.java
index b51e0462d..4c45ec3a1 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Date_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Date_Test.java
@@ -39,7 +39,7 @@ class Date_Test  extends SimpleTestBase{
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ETag_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ETag_Test.java
index 46ad802e0..9477e84cb 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/ETag_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/ETag_Test.java
@@ -37,7 +37,7 @@ class ETag_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Expect_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Expect_Test.java
index 51387223b..8d030508e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Expect_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Expect_Test.java
@@ -36,7 +36,7 @@ class Expect_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Expires_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Expires_Test.java
index 0e2fa01b3..7c0a26895 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Expires_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Expires_Test.java
@@ -39,7 +39,7 @@ class Expires_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Forwarded_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Forwarded_Test.java
index 46dcd0c2a..0d29eeece 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Forwarded_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Forwarded_Test.java
@@ -36,7 +36,7 @@ class Forwarded_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/From_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/From_Test.java
index 4d9dd5759..95ff1fe64 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/From_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/From_Test.java
@@ -36,7 +36,7 @@ class From_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Host_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Host_Test.java
index 9983520a4..fbd82a624 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Host_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Host_Test.java
@@ -36,7 +36,7 @@ class Host_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfMatch_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfMatch_Test.java
index ceaf65073..96e04ff85 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfMatch_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfMatch_Test.java
@@ -36,7 +36,7 @@ class IfMatch_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi",aev=true) String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfModifiedSince_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfModifiedSince_Test.java
index 56bd40446..a53adddeb 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfModifiedSince_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfModifiedSince_Test.java
@@ -39,7 +39,7 @@ class IfModifiedSince_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfNoneMatch_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfNoneMatch_Test.java
index 4f66f1f2d..ed26604ed 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfNoneMatch_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfNoneMatch_Test.java
@@ -36,7 +36,7 @@ class IfNoneMatch_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi",aev=true) String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
index 42b567117..bfab1ea03 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
@@ -44,7 +44,7 @@ class IfRange_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfUnmodifiedSince_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfUnmodifiedSince_Test.java
index 312d5288e..8e04da47c 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfUnmodifiedSince_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfUnmodifiedSince_Test.java
@@ -39,7 +39,7 @@ class IfUnmodifiedSince_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/LastModified_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/LastModified_Test.java
index 4e07cb687..b3a3cf37c 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/LastModified_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/LastModified_Test.java
@@ -39,7 +39,7 @@ class LastModified_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Location_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Location_Test.java
index 72614722b..3e6a0bd27 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Location_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Location_Test.java
@@ -37,7 +37,7 @@ class Location_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/MaxForwards_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/MaxForwards_Test.java
index e5104e115..6a6084433 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/MaxForwards_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/MaxForwards_Test.java
@@ -36,7 +36,7 @@ class MaxForwards_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/NoTrace_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/NoTrace_Test.java
index 5c3e372c7..b05f383c3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/NoTrace_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/NoTrace_Test.java
@@ -36,7 +36,7 @@ class NoTrace_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Origin_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Origin_Test.java
index 2b318564e..8e46637e0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Origin_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Origin_Test.java
@@ -36,7 +36,7 @@ class Origin_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Pragma_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Pragma_Test.java
index c07d02a5b..2efdb382f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Pragma_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Pragma_Test.java
@@ -36,7 +36,7 @@ class Pragma_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthenticate_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthenticate_Test.java
index a216f810b..6d152f852 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthenticate_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthenticate_Test.java
@@ -36,7 +36,7 @@ class ProxyAuthenticate_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthorization_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthorization_Test.java
index 8fb8ad35c..39b1dec07 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthorization_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/ProxyAuthorization_Test.java
@@ -36,7 +36,7 @@ class ProxyAuthorization_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Range_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Range_Test.java
index 1d31423c5..129a077cc 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Range_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Range_Test.java
@@ -36,7 +36,7 @@ class Range_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Referer_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Referer_Test.java
index 04e9659a5..817b253d2 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Referer_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Referer_Test.java
@@ -37,7 +37,7 @@ class Referer_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
index 51e4e1465..5174b8d7e 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
@@ -43,7 +43,7 @@ class RetryAfter_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Server_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Server_Test.java
index f6809872e..92847f076 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Server_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Server_Test.java
@@ -36,7 +36,7 @@ class Server_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/TE_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/TE_Test.java
index f15f67ac9..6011b39ac 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/TE_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/TE_Test.java
@@ -36,7 +36,7 @@ class TE_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Trailer_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Trailer_Test.java
index c08239b25..0356b5811 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Trailer_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Trailer_Test.java
@@ -36,7 +36,7 @@ class Trailer_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/TransferEncoding_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/TransferEncoding_Test.java
index 30f9ae4c1..0abf0442c 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/TransferEncoding_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/TransferEncoding_Test.java
@@ -36,7 +36,7 @@ class TransferEncoding_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Upgrade_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Upgrade_Test.java
index 2be011109..ee79f71a3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Upgrade_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Upgrade_Test.java
@@ -35,7 +35,7 @@ class Upgrade_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/UserAgent_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/UserAgent_Test.java
index 1c4d05d81..8e9e89298 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/UserAgent_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/UserAgent_Test.java
@@ -36,7 +36,7 @@ class UserAgent_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Vary_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Vary_Test.java
index c4a09ce08..bf8f4c90a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Vary_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Vary_Test.java
@@ -36,7 +36,7 @@ class Vary_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Via_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Via_Test.java
index 0af42cd3f..76ef9d00a 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Via_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Via_Test.java
@@ -36,7 +36,7 @@ class Via_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/Warning_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/Warning_Test.java
index 9766a833e..4990d0b50 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/Warning_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/Warning_Test.java
@@ -36,7 +36,7 @@ class Warning_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/WwwAuthenticate_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/WwwAuthenticate_Test.java
index 39b1873ed..51b6e7e4a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/http/header/WwwAuthenticate_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/http/header/WwwAuthenticate_Test.java
@@ -36,7 +36,7 @@ class WwwAuthenticate_Test extends SimpleTestBase {
        public static class A {
                @RestOp
                public StringReader get(@Header(name=HEADER) 
@Schema(cf="multi") String[] h) {
-                       return TestUtils.reader(h == null ? "null" : 
StringUtils.join(h, ','));
+                       return TestUtils.reader(h == null ? "null" : 
Utils.join(h, ','));
                }
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/guards/RoleMatcher_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/guards/RoleMatcher_Test.java
index 94ca53dca..ea5d9afec 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/guards/RoleMatcher_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/guards/RoleMatcher_Test.java
@@ -34,7 +34,7 @@ class RoleMatcher_Test extends SimpleTestBase {
        private void test(String expression, String toString, String 
expressionRoles, String[] shouldMatch, String[] shouldNotMatch) {
                var m = safe(()->new RoleMatcher(expression));
                assertEquals("m.toString() didn't match.", toString, 
m.toString());
-               assertEquals("m.getRolesInExpression() didn't match.", 
expressionRoles, StringUtils.join(m.getRolesInExpression(), ","));
+               assertEquals("m.getRolesInExpression() didn't match.", 
expressionRoles, Utils.join(m.getRolesInExpression(), ","));
                for (String i : shouldMatch)
                        if (! m.matches(toSet(i)))
                                fail("Matcher "+m+" should have matched '"+i+"' 
but didn't.");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utest/utils/FakeWriterSerializer.java
 
b/juneau-utest/src/test/java/org/apache/juneau/utest/utils/FakeWriterSerializer.java
index 868b3a6f1..9c4e9db2e 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/utest/utils/FakeWriterSerializer.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/utest/utils/FakeWriterSerializer.java
@@ -46,11 +46,11 @@ public class FakeWriterSerializer extends WriterSerializer 
implements HttpPartSe
 
                private static String out(Object value) {
                        if (value instanceof List<?> x)
-                               value = StringUtils.join(x, '|');
+                               value = Utils.join(x, '|');
                        if (value instanceof Collection<?> x)
-                               value = StringUtils.join(x, '|');
+                               value = Utils.join(x, '|');
                        if (isArray(value))
-                               value = StringUtils.join(toList(value, 
Object.class), "|");
+                               value = Utils.join(toList(value, Object.class), 
"|");
                        return "x" + value + "x";
                }
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
index a47d3a5d5..45806d6c3 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
@@ -370,27 +370,27 @@ class StringUtilsTest extends SimpleTestBase {
        // join(Collection,char)
        
//====================================================================================================
        @Test void a01_join() {
-               assertNull(join((Object[])null, ","));
-               assertEquals("1", join(new Object[]{1}, ","));
-               assertEquals("1,2", join(new Object[]{1,2}, ","));
+               assertNull(Utils.join((Object[])null, ","));
+               assertEquals("1", Utils.join(new Object[]{1}, ","));
+               assertEquals("1,2", Utils.join(new Object[]{1,2}, ","));
 
-               assertNull(join((Collection<?>)null, ","));
-               assertEquals("1", join(Arrays.asList(new Integer[]{1}), ","));
-               assertEquals("1,2", join(Arrays.asList(new Integer[]{1,2}), 
","));
+               assertNull(Utils.join((Collection<?>)null, ","));
+               assertEquals("1", Utils.join(Arrays.asList(new Integer[]{1}), 
","));
+               assertEquals("1,2", Utils.join(Arrays.asList(new 
Integer[]{1,2}), ","));
 
-               assertNull(join((Object[])null, ','));
-               assertEquals("x,y,z", join(new Object[]{"x,y","z"}, ','));
+               assertNull(Utils.join((Object[])null, ','));
+               assertEquals("x,y,z", Utils.join(new Object[]{"x,y","z"}, ','));
 
-               assertNull(join((int[])null, ','));
-               assertEquals("1", join(new int[]{1}, ','));
-               assertEquals("1,2", join(new int[]{1,2}, ','));
+               assertNull(Utils.join((int[])null, ','));
+               assertEquals("1", Utils.join(new int[]{1}, ','));
+               assertEquals("1,2", Utils.join(new int[]{1,2}, ','));
 
-               assertNull(join((Collection<?>)null, ','));
-               assertEquals("1", join(Arrays.asList(new Integer[]{1}), ','));
-               assertEquals("1,2", join(Arrays.asList(new Integer[]{1,2}), 
','));
+               assertNull(Utils.join((Collection<?>)null, ','));
+               assertEquals("1", Utils.join(Arrays.asList(new Integer[]{1}), 
','));
+               assertEquals("1,2", Utils.join(Arrays.asList(new 
Integer[]{1,2}), ','));
 
-               assertNull(joine((List<?>)null, ','));
-               assertEquals("x\\,y,z", joine(Arrays.asList(new 
String[]{"x,y","z"}), ','));
+               assertNull(StringUtils.joine((List<?>)null, ','));
+               assertEquals("x\\,y,z", StringUtils.joine(Arrays.asList(new 
String[]{"x,y","z"}), ','));
        }
 
        
//====================================================================================================
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
index 29fcb69ac..327f14ad1 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.common.internal.StringUtils.*;
 import static org.junit.Assert.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.svl.*;
 import org.junit.jupiter.api.*;
 
@@ -193,7 +194,7 @@ class StringVarResolverTest extends SimpleTestBase {
                }
                @Override /* MultipartVar */
                public String resolve(VarResolverSession session, String[] 
args) {
-                       return join(args, '+');
+                       return Utils.join(args, '+');
                }
        }
 

Reply via email to