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

commit 6375c68393bd31af01c28d3b125fcce82ecd5ef7
Author: James Bognar <[email protected]>
AuthorDate: Mon Aug 25 15:26:31 2025 -0400

    Test modernization, clean up utility classes.
---
 .../juneau/assertions/FluentBeanAssertion.java     |   3 +-
 .../juneau/assertions/FluentBeanListAssertion.java |   2 +-
 .../apache/juneau/common/internal/StringUtils.java | 531 +--------------------
 .../org/apache/juneau/common/internal/Utils.java   | 529 +++++++++++++++++++-
 .../main/java/org/apache/juneau/config/Entry.java  |   2 +-
 .../juneau/config/internal/ConfigMapEntry.java     |   2 +-
 .../java/org/apache/juneau/AnnotationApplier.java  |   2 +-
 .../main/java/org/apache/juneau/BeanFilter.java    |   9 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  |   4 +-
 .../java/org/apache/juneau/BeanPropertyMeta.java   |   6 +-
 .../main/java/org/apache/juneau/BeanSession.java   |   2 +-
 .../src/main/java/org/apache/juneau/MediaType.java |   2 +-
 .../src/main/java/org/apache/juneau/Version.java   |   2 +-
 .../java/org/apache/juneau/collections/Args.java   |   3 +-
 .../org/apache/juneau/collections/JsonList.java    |   2 +-
 .../org/apache/juneau/collections/JsonMap.java     |   2 +-
 .../main/java/org/apache/juneau/cp/Messages.java   |   2 +-
 .../org/apache/juneau/httppart/HttpPartSchema.java |   2 +-
 .../juneau/jsonschema/JsonSchemaGenerator.java     |   2 +-
 .../org/apache/juneau/jsonschema/TypeCategory.java |   6 +-
 .../apache/juneau/oapi/OpenApiParserSession.java   |  24 +-
 .../org/apache/juneau/objecttools/SearchArgs.java  |   2 +-
 .../org/apache/juneau/objecttools/SortArgs.java    |   2 +-
 .../juneau/objecttools/StringMatcherFactory.java   |   2 +-
 .../org/apache/juneau/objecttools/ViewArgs.java    |   2 +-
 .../apache/juneau/svl/MultipartResolvingVar.java   |   4 +-
 .../java/org/apache/juneau/svl/MultipartVar.java   |   4 +-
 .../java/org/apache/juneau/svl/vars/SwitchVar.java |   3 +-
 .../org/apache/juneau/utils/ReflectionMap.java     |   4 +-
 .../main/java/org/apache/juneau/xml/Namespace.java |   2 +-
 .../apache/juneau/http/header/BasicCsvHeader.java  |   2 +-
 .../org/apache/juneau/http/header/EntityTags.java  |   2 +-
 .../java/org/apache/juneau/http/header/Thrown.java |   2 +-
 .../apache/juneau/http/part/BasicCsvArrayPart.java |   2 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   2 +-
 .../juneau/rest/debug/BasicDebugEnablement.java    |   3 +-
 .../rest/swagger/BasicSwaggerProviderSession.java  |   2 +-
 .../java/org/apache/juneau/rest/util/UrlPath.java  |   2 +-
 .../juneau/rest/vars/SerializedRequestAttrVar.java |   3 +-
 .../src/test/java/org/apache/juneau/TestUtils.java |  12 +-
 .../org/apache/juneau/utils/StringUtilsTest.java   | 138 +++---
 41 files changed, 673 insertions(+), 661 deletions(-)

diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
index 10b0a1388..a9230fc8d 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanAssertion.java
@@ -19,6 +19,7 @@ import java.io.*;
 import java.util.function.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
 
@@ -150,7 +151,7 @@ public class FluentBeanAssertion<T,R> extends 
FluentObjectAssertion<T,R> {
         * @return This object.
         */
        public FluentMapAssertion<String,Object,R> 
asPropertyMap(String...names) {
-               return new FluentMapAssertion<>(this, 
toBeanMap().getProperties(split3(names, ',')), returns());
+               return new FluentMapAssertion<>(this, 
toBeanMap().getProperties(Utils.split3(names, ',')), returns());
        }
 
        /**
diff --git 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
index e23875d53..d5cbaaee9 100644
--- 
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
+++ 
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentBeanListAssertion.java
@@ -173,7 +173,7 @@ public class FluentBeanListAssertion<E,R> extends 
FluentListAssertion<E,R> {
         * @return This object.
         */
        public FluentListAssertion<Map<String,Object>,R> 
asPropertyMaps(String...names) {
-               String[] n = StringUtils.split3(names, ',');
+               String[] n = Utils.split3(names, ',');
                return new FluentListAssertion<>(this, value().stream().map(x 
-> beanMap(x).getProperties(n)).toList(), returns());
        }
 
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 6839efa34..89f6e399b 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,285 +294,12 @@ public final class StringUtils {
                return true;
        }
 
-       private static AsciiSet getEscapeSet(char c) {
+       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<>();
 
-       /**
-        * Shortcut for calling <code>split(s, <js>','</js>)</code>
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static String[] split3(String s) {
-               return split3(s, ',');
-       }
-
-       /**
-        * Shortcut for calling <code>split(s, <js>','</js>)</code>
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static List<String> split2(String s) {
-               return split2(s, ',');
-       }
-
-       /**
-        * Same as {@link #split3(String)} but consumes the tokens instead of 
creating an array.
-        *
-        * @param s The string to split.
-        * @param consumer The consumer of the tokens.
-        */
-       public static void split3(String s, Consumer<String> consumer) {
-               split3(s, ',', consumer);
-       }
-
-       /**
-        * Splits a character-delimited string into a string array.
-        *
-        * <p>
-        * Does not split on escaped-delimiters (e.g. "\,");
-        * Resulting tokens are trimmed of whitespace.
-        *
-        * <p>
-        * <b>NOTE:</b>  This behavior is different than the Jakarta equivalent.
-        * split("a,b,c",',') -&gt; {"a","b","c"}
-        * split("a, b ,c ",',') -&gt; {"a","b","c"}
-        * split("a,,c",',') -&gt; {"a","","c"}
-        * split(",,",',') -&gt; {"","",""}
-        * split("",',') -&gt; {}
-        * split(null,',') -&gt; null
-        * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}
-        * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}
-        * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @param c The character to split on.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static String[] split3(String s, char c) {
-               return split3(s, c, Integer.MAX_VALUE);
-       }
-
-       /**
-        * Splits a character-delimited string into a string array.
-        *
-        * <p>
-        * Does not split on escaped-delimiters (e.g. "\,");
-        * Resulting tokens are trimmed of whitespace.
-        *
-        * <p>
-        * <b>NOTE:</b>  This behavior is different than the Jakarta equivalent.
-        * split("a,b,c",',') -&gt; {"a","b","c"}
-        * split("a, b ,c ",',') -&gt; {"a","b","c"}
-        * split("a,,c",',') -&gt; {"a","","c"}
-        * split(",,",',') -&gt; {"","",""}
-        * split("",',') -&gt; {}
-        * split(null,',') -&gt; null
-        * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}
-        * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}
-        * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @param c The character to split on.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static List<String> split2(String s, char c) {
-               return split2(s, c, Integer.MAX_VALUE);
-       }
-
-       /**
-        * Same as {@link #split3(String,char)} but consumes the tokens instead 
of creating an array.
-        *
-        * @param s The string to split.
-        * @param c The character to split on.
-        * @param consumer The consumer of the tokens.
-        */
-       public static void split3(String s, char c, Consumer<String> consumer) {
-               var escapeChars = getEscapeSet(c);
-
-               if (isEmpty3(s))
-                       return;
-               if (s.indexOf(c) == -1) {
-                       consumer.accept(s);
-                       return;
-               }
-
-               var x1 = 0;
-               var escapeCount = 0;
-
-               for (var i = 0; i < s.length(); i++) {
-                       if (s.charAt(i) == '\\')
-                               escapeCount++;
-                       else if (s.charAt(i)==c && escapeCount % 2 == 0) {
-                               var s2 = s.substring(x1, i);
-                               var s3 = unEscapeChars(s2, escapeChars);
-                               consumer.accept(s3.trim());  // NOSONAR - NPE 
not possible.
-                               x1 = i+1;
-                       }
-                       if (s.charAt(i) != '\\')
-                               escapeCount = 0;
-               }
-               var s2 = s.substring(x1);
-               var s3 = unEscapeChars(s2, escapeChars);
-               consumer.accept(s3.trim());  // NOSONAR - NPE not possible.
-       }
-
-       /**
-        * Same as {@link #split3(String, char)} but limits the number of 
tokens returned.
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @param c The character to split on.
-        * @param limit The maximum number of tokens to return.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static String[] split3(String s, char c, int limit) {
-               var l = split2(s, c, limit);
-               return l == null ? null : l.toArray(new String[l.size()]);
-       }
-
-       /**
-        * Same as {@link #split3(String, char)} but limits the number of 
tokens returned.
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @param c The character to split on.
-        * @param limit The maximum number of tokens to return.
-        * @return The tokens, or <jk>null</jk> if the string was null.
-        */
-       public static List<String> split2(String s, char c, int limit) {
-
-               var escapeChars = getEscapeSet(c);
-
-               if (s == null)
-                       return null;  // NOSONAR - Intentional.
-               if (isEmpty3(s))
-                       return Collections.emptyList();
-               if (s.indexOf(c) == -1)
-                       return Collections.singletonList(s);
-
-               var l = new LinkedList<String>();
-               var sArray = s.toCharArray();
-               var x1 = 0;
-               var escapeCount = 0;
-               limit--;
-               for (var i = 0; i < sArray.length && limit > 0; i++) {
-                       if (sArray[i] == '\\')
-                               escapeCount++;
-                       else if (sArray[i]==c && escapeCount % 2 == 0) {
-                               var s2 = new String(sArray, x1, i-x1);
-                               var s3 = unEscapeChars(s2, escapeChars);
-                               l.add(s3.trim());
-                               limit--;
-                               x1 = i+1;
-                       }
-                       if (sArray[i] != '\\')
-                               escapeCount = 0;
-               }
-               var s2 = new String(sArray, x1, sArray.length-x1);
-               var s3 = unEscapeChars(s2, escapeChars);
-               l.add(s3.trim());
-
-               return l;
-       }
-
-       /**
-        * Same as {@link #split3(String, char)} except splits all strings in 
the input and returns a single result.
-        *
-        * @param s The string to split.  Can be <jk>null</jk>.
-        * @param c The character to split on.
-        * @return The tokens, or null if the input array was null
-        */
-       public static String[] split3(String[] s, char c) {
-               if (s == null)
-                       return null;  // NOSONAR - Intentional.
-               var l = new LinkedList<String>();
-               for (var ss : s) {
-                       if (ss == null || ss.indexOf(c) == -1)
-                               l.add(ss);
-                       else
-                               Collections.addAll(l, split3(ss, c));
-               }
-               return l.toArray(new String[l.size()]);
-       }
-
-       /**
-        * Splits a list of key-value pairs into an ordered map.
-        *
-        * <p>
-        * Example:
-        * <p class='bjava'>
-        *      String <jv>in</jv> = <js>"foo=1;bar=2"</js>;
-        *      Map <jv>map</jv> = StringUtils.<jsm>splitMap</jsm>(in, 
<js>';'</js>, <js>'='</js>, <jk>true</jk>);
-        * </p>
-        *
-        * @param s The string to split.
-        * @param trim Trim strings after parsing.
-        * @return The parsed map, or null if the string was null.
-        */
-       public static Map<String,String> splitMap(String s, boolean trim) {
-
-               if (s == null)
-                       return null;  // NOSONAR - Intentional.
-               if (isEmpty3(s))
-                       return Collections.emptyMap();
-
-               var m = new LinkedHashMap<String,String>();
-
-               final int
-                       S1 = 1,  // Found start of key, looking for equals.
-                       S2 = 2;  // Found equals, looking for delimiter (or 
end).
-
-               var state = S1;
-
-               var sArray = s.toCharArray();
-               var x1 = 0;
-               var escapeCount = 0;
-               String key = null;
-               for (var i = 0; i < sArray.length + 1; i++) {
-                       var c = i == sArray.length ? ',' : sArray[i];
-                       if (c == '\\')
-                               escapeCount++;
-                       if (escapeCount % 2 == 0) {
-                               if (state == S1) {
-                                       if (c == '=') {
-                                               key = s.substring(x1, i);
-                                               if (trim)
-                                                       key = trim(key);
-                                               key = unEscapeChars(key, 
MAP_ESCAPE_SET);
-                                               state = S2;
-                                               x1 = i+1;
-                                       } else if (c == ',') {
-                                               key = s.substring(x1, i);
-                                               if (trim)
-                                                       key = trim(key);
-                                               key = unEscapeChars(key, 
MAP_ESCAPE_SET);
-                                               m.put(key, "");
-                                               state = S1;
-                                               x1 = i+1;
-                                       }
-                               } else if (state == S2) {
-                                       if (c == ',') {  // NOSONAR - 
Intentional.
-                                               var val = s.substring(x1, i);
-                                               if (trim)
-                                                       val = trim(val);
-                                               val = unEscapeChars(val, 
MAP_ESCAPE_SET);
-                                               m.put(key, val);
-                                               key = null;
-                                               x1 = i+1;
-                                               state = S1;
-                                       }
-                               }
-                       }
-                       if (c != '\\')
-                               escapeCount = 0;
-               }
-
-               return m;
-       }
-
-       private static final AsciiSet MAP_ESCAPE_SET = AsciiSet.of(",=\\");
+       static final AsciiSet MAP_ESCAPE_SET = AsciiSet.of(",=\\");
 
        /**
         * Returns <jk>true</jk> if the specified string contains any of the 
specified characters.
@@ -595,220 +322,7 @@ public final class StringUtils {
                return false;
        }
 
-       /**
-        * Splits a space-delimited string with optionally quoted arguments.
-        *
-        * <p>
-        * Examples:
-        * <ul>
-        *      <li><js>"foo"</js> =&gt; <c>["foo"]</c>
-        *      <li><js>" foo "</js> =&gt; <c>["foo"]</c>
-        *      <li><js>"foo bar baz"</js> =&gt; <c>["foo","bar","baz"]</c>
-        *      <li><js>"foo 'bar baz'"</js> =&gt; <c>["foo","bar baz"]</c>
-        *      <li><js>"foo \"bar baz\""</js> =&gt; <c>["foo","bar baz"]</c>
-        *      <li><js>"foo 'bar\'baz'"</js> =&gt; <c>["foo","bar'baz"]</c>
-        * </ul>
-        *
-        * @param s The input string.
-        * @return
-        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
-        *      <br>An empty string results in an empty array.
-        */
-       public static String[] splitQuoted(String s) {
-               return splitQuoted(s, false);
-       }
-
-       /**
-        * Splits a comma-delimited list containing "nesting constructs".
-        *
-        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
-        *
-        * Example:
-        *      "a{b,c},d" -> ["a{b,c}","d"]
-        *
-        * Handles escapes and trims whitespace from tokens.
-        *
-        * @param s The input string.
-        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
-        *      <br>An empty string results in an empty array.
-        */
-       public static List<String> splitNested(String s) {
-               var escapeChars = getEscapeSet(',');
-
-               if (s == null) return null;  // NOSONAR - Intentional.
-               if (isEmpty3(s)) return Collections.emptyList();
-               if (s.indexOf(',') == -1) return 
Collections.singletonList(trim(s));
-
-               var l = new LinkedList<String>();
-
-               var x1 = 0;
-               var inEscape = false;
-               var depthCount = 0;
-
-               for (var i = 0; i < s.length(); i++) {
-                       var c = s.charAt(i);
-                       if (inEscape) {
-                               if (c == '\\') {
-                                       inEscape = false;
-                               }
-                       } else {
-                               if (c == '\\') {
-                                       inEscape = true;
-                               } else if (c == '{') {
-                                       depthCount++;
-                               } else if (c == '}') {
-                                       depthCount--;
-                               } else if (c == ',' && depthCount == 0) {
-                                       
l.add(trim(unEscapeChars(s.substring(x1, i), escapeChars)));
-                                       x1 = i+1;
-                               }
-                       }
-               }
-               l.add(trim(unEscapeChars(s.substring(x1, s.length()), 
escapeChars)));
-
-               return l;
-       }
-
-       /**
-        * Splits a nested comma-delimited list.
-        *
-        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
-        *
-        * Example:
-        *      "a{b,c{d,e}}" -> ["b","c{d,e}"]
-        *
-        * Handles escapes and trims whitespace from tokens.
-        *
-        * @param s The input string.
-        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
-        *      <br>An empty string results in an empty array.
-        */
-       public static List<String> splitNestedInner(String s) {
-               if (s == null) throw illegalArg("String was null.");
-               if (isEmpty3(s)) throw illegalArg("String was empty.");
-
-               final int
-                       S1 = 1,  // Looking for '{'
-                       S2 = 2;  // Found '{', looking for '}'
-
-               var start = -1;
-               var end = -1;
-               var state = S1;
-               var depth = 0;
-               var inEscape = false;
-
-               for (var i = 0; i < s.length(); i++) {
-                       var c = s.charAt(i);
-                       if (inEscape) {
-                               if (c == '\\') {
-                                       inEscape = false;
-                               }
-                       } else {
-                               if (c == '\\') {
-                                       inEscape = true;
-                               } else if (state == S1) {
-                                       if (c == '{') {
-                                               start = i+1;
-                                               state = S2;
-                                       }
-                               } else /* state == S2 */ {
-                                       if (c == '{') {
-                                               depth++;
-                                       } else if (depth > 0 && c == '}') {
-                                               depth--;
-                                       } else if (c == '}') {
-                                               end = i;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-               if (start == -1) throw illegalArg("Start character '{' not 
found in string.", s);
-               if (end == -1) throw illegalArg("End character '}' not found in 
string.", s);
-               return splitNested(s.substring(start, end));
-       }
-
-       /**
-        * Same as {@link #splitQuoted(String)} but allows you to optionally 
keep the quote characters.
-        *
-        * @param s The input string.
-        * @param keepQuotes If <jk>true</jk>, quote characters are kept on the 
tokens.
-        * @return
-        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
-        *      <br>An empty string results in an empty array.
-        */
-       public static String[] splitQuoted(String s, boolean keepQuotes) {
-
-               if (s == null)
-                       return null;  // NOSONAR - Intentional.
-
-               s = s.trim();
-
-               if (isEmpty3(s))
-                       return new String[0];
-
-               if (! containsAny(s, ' ', '\t', '\'', '"'))
-                       return new String[]{s};
-
-               final int
-                       S1 = 1,  // Looking for start of token.
-                       S2 = 2,  // Found ', looking for end '
-                       S3 = 3,  // Found ", looking for end "
-                       S4 = 4;  // Found non-whitespace, looking for end 
whitespace.
-
-               var state = S1;
-
-               var isInEscape = false;
-               var needsUnescape = false;
-               var mark = 0;
-
-               var l = new ArrayList<String>();
-               for (var i = 0; i < s.length(); i++) {
-                       var c = s.charAt(i);
-
-                       if (state == S1) {
-                               if (c == '\'') {
-                                       state = S2;
-                                       mark = keepQuotes ? i : i+1;
-                               } else if (c == '"') {
-                                       state = S3;
-                                       mark = keepQuotes ? i : i+1;
-                               } else if (c != ' ' && c != '\t') {
-                                       state = S4;
-                                       mark = i;
-                               }
-                       } else if (state == S2 || state == S3) {
-                               if (c == '\\') {
-                                       isInEscape = ! isInEscape;
-                                       needsUnescape = ! keepQuotes;
-                               } else if (! isInEscape) {
-                                       if (c == (state == S2 ? '\'' : '"')) {
-                                               var s2 = s.substring(mark, 
keepQuotes ? i+1 : i);
-                                               if (needsUnescape)  // NOSONAR 
- False positive check.
-                                                       s2 = unEscapeChars(s2, 
QUOTE_ESCAPE_SET);
-                                               l.add(s2);
-                                               state = S1;
-                                               isInEscape = needsUnescape = 
false;
-                                       }
-                               } else {
-                                       isInEscape = false;
-                               }
-                       } else /* state == S4 */ {
-                               if (c == ' ' || c == '\t') {
-                                       l.add(s.substring(mark, i));
-                                       state = S1;
-                               }
-                       }
-               }
-               if (state == S4)
-                       l.add(s.substring(mark));
-               else if (state == S2 || state == S3)
-                       throw new IllegalArgumentException("Unmatched string 
quotes: " + s);
-               return l.toArray(new String[l.size()]);
-       }
-
-       private static final AsciiSet QUOTE_ESCAPE_SET = AsciiSet.of("\"'\\");
+       static final AsciiSet QUOTE_ESCAPE_SET = AsciiSet.of("\"'\\");
 
        /**
         * Returns <jk>true</jk> if specified string is <jk>null</jk> or empty.
@@ -2567,45 +2081,6 @@ public final class StringUtils {
                return in.substring(0, length-3) + "...";
        }
 
-       /**
-        * Splits the method arguments in the signature of a method.
-        *
-        * @param s The arguments to split.
-        * @return The split arguments, or null if the input string is null.
-        */
-       public static String[] splitMethodArgs(String s) {
-
-               if (s == null)
-                       return null;  // NOSONAR - Intentional.
-               if (isEmpty3(s))
-                       return new String[0];
-               if (s.indexOf(',') == -1)
-                       return new String[]{s};
-
-               var l = new LinkedList<String>();
-               var sArray = s.toCharArray();
-               var x1 = 0;
-               var paramDepth = 0;
-
-               for (var i = 0; i < sArray.length; i++) {
-                       var c = s.charAt(i);
-                       if (c == '>')
-                               paramDepth++;
-                       else if (c == '<')
-                               paramDepth--;
-                       else if (c == ',' && paramDepth == 0) {
-                               var s2 = new String(sArray, x1, i-x1);
-                               l.add(s2.trim());
-                               x1 = i+1;
-                       }
-               }
-
-               var s2 = new String(sArray, x1, sArray.length-x1);
-               l.add(s2.trim());
-
-               return l.toArray(new String[l.size()]);
-       }
-
        private static final AsciiSet URI_CHARS = 
AsciiSet.create().chars("?#+%;/:@&=+$,-_.!~*'()").range('0','9').range('A','Z').range('a','z').build();
 
        /**
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 52e2873a3..d55710ab7 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
@@ -349,14 +349,14 @@ public class Utils {
         * Splits a comma-delimited list into a list of strings.
         */
        public static List<String> split(String s) {
-               return s == null ? Collections.emptyList() : 
StringUtils.split2(s);
+               return s == null ? Collections.emptyList() : Utils.split2(s);
        }
 
        /**
         * Splits a comma-delimited list into an array of strings.
         */
        public static String[] splita(String s) {
-               return s == null ? new String[0] : StringUtils.split3(s);
+               return s == null ? new String[0] : Utils.split3(s);
        }
 
        /**
@@ -923,4 +923,529 @@ public class Utils {
        public static String joinnl(Object[] tokens) {
                return join(tokens, '\n');
        }
+
+       /**
+        * Shortcut for calling <code>split(s, <js>','</js>)</code>
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static String[] split3(String s) {
+               return split3(s, ',');
+       }
+
+       /**
+        * Shortcut for calling <code>split(s, <js>','</js>)</code>
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s) {
+               return split2(s, ',');
+       }
+
+       /**
+        * Same as {@link #split3(String)} but consumes the tokens instead of 
creating an array.
+        *
+        * @param s The string to split.
+        * @param consumer The consumer of the tokens.
+        */
+       public static void split3(String s, Consumer<String> consumer) {
+               split3(s, ',', consumer);
+       }
+
+       /**
+        * Splits a character-delimited string into a string array.
+        *
+        * <p>
+        * Does not split on escaped-delimiters (e.g. "\,");
+        * Resulting tokens are trimmed of whitespace.
+        *
+        * <p>
+        * <b>NOTE:</b>  This behavior is different than the Jakarta equivalent.
+        * split("a,b,c",',') -&gt; {"a","b","c"}
+        * split("a, b ,c ",',') -&gt; {"a","b","c"}
+        * split("a,,c",',') -&gt; {"a","","c"}
+        * split(",,",',') -&gt; {"","",""}
+        * split("",',') -&gt; {}
+        * split(null,',') -&gt; null
+        * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}
+        * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}
+        * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static String[] split3(String s, char c) {
+               return split3(s, c, Integer.MAX_VALUE);
+       }
+
+       /**
+        * Splits a character-delimited string into a string array.
+        *
+        * <p>
+        * Does not split on escaped-delimiters (e.g. "\,");
+        * Resulting tokens are trimmed of whitespace.
+        *
+        * <p>
+        * <b>NOTE:</b>  This behavior is different than the Jakarta equivalent.
+        * split("a,b,c",',') -&gt; {"a","b","c"}
+        * split("a, b ,c ",',') -&gt; {"a","b","c"}
+        * split("a,,c",',') -&gt; {"a","","c"}
+        * split(",,",',') -&gt; {"","",""}
+        * split("",',') -&gt; {}
+        * split(null,',') -&gt; null
+        * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}
+        * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}
+        * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s, char c) {
+               return split2(s, c, Integer.MAX_VALUE);
+       }
+
+       /**
+        * Same as {@link #split3(String,char)} but consumes the tokens instead 
of creating an array.
+        *
+        * @param s The string to split.
+        * @param c The character to split on.
+        * @param consumer The consumer of the tokens.
+        */
+       public static void split3(String s, char c, Consumer<String> consumer) {
+               var escapeChars = StringUtils.getEscapeSet(c);
+       
+               if (StringUtils.isEmpty3(s))
+                       return;
+               if (s.indexOf(c) == -1) {
+                       consumer.accept(s);
+                       return;
+               }
+       
+               var x1 = 0;
+               var escapeCount = 0;
+       
+               for (var i = 0; i < s.length(); i++) {
+                       if (s.charAt(i) == '\\')
+                               escapeCount++;
+                       else if (s.charAt(i)==c && escapeCount % 2 == 0) {
+                               var s2 = s.substring(x1, i);
+                               var s3 = StringUtils.unEscapeChars(s2, 
escapeChars);
+                               consumer.accept(s3.trim());  // NOSONAR - NPE 
not possible.
+                               x1 = i+1;
+                       }
+                       if (s.charAt(i) != '\\')
+                               escapeCount = 0;
+               }
+               var s2 = s.substring(x1);
+               var s3 = StringUtils.unEscapeChars(s2, escapeChars);
+               consumer.accept(s3.trim());  // NOSONAR - NPE not possible.
+       }
+
+       /**
+        * Same as {@link #split3(String, char)} but limits the number of 
tokens returned.
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @param limit The maximum number of tokens to return.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static String[] split3(String s, char c, int limit) {
+               var l = split2(s, c, limit);
+               return l == null ? null : l.toArray(new String[l.size()]);
+       }
+
+       /**
+        * Same as {@link #split3(String, char)} but limits the number of 
tokens returned.
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @param limit The maximum number of tokens to return.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s, char c, int limit) {
+       
+               var escapeChars = StringUtils.getEscapeSet(c);
+       
+               if (s == null)
+                       return null;  // NOSONAR - Intentional.
+               if (StringUtils.isEmpty3(s))
+                       return Collections.emptyList();
+               if (s.indexOf(c) == -1)
+                       return Collections.singletonList(s);
+       
+               var l = new LinkedList<String>();
+               var sArray = s.toCharArray();
+               var x1 = 0;
+               var escapeCount = 0;
+               limit--;
+               for (var i = 0; i < sArray.length && limit > 0; i++) {
+                       if (sArray[i] == '\\')
+                               escapeCount++;
+                       else if (sArray[i]==c && escapeCount % 2 == 0) {
+                               var s2 = new String(sArray, x1, i-x1);
+                               var s3 = StringUtils.unEscapeChars(s2, 
escapeChars);
+                               l.add(s3.trim());
+                               limit--;
+                               x1 = i+1;
+                       }
+                       if (sArray[i] != '\\')
+                               escapeCount = 0;
+               }
+               var s2 = new String(sArray, x1, sArray.length-x1);
+               var s3 = StringUtils.unEscapeChars(s2, escapeChars);
+               l.add(s3.trim());
+       
+               return l;
+       }
+
+       /**
+        * Same as {@link #split3(String, char)} except splits all strings in 
the input and returns a single result.
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @return The tokens, or null if the input array was null
+        */
+       public static String[] split3(String[] s, char c) {
+               if (s == null)
+                       return null;  // NOSONAR - Intentional.
+               var l = new LinkedList<String>();
+               for (var ss : s) {
+                       if (ss == null || ss.indexOf(c) == -1)
+                               l.add(ss);
+                       else
+                               Collections.addAll(l, split3(ss, c));
+               }
+               return l.toArray(new String[l.size()]);
+       }
+
+       /**
+        * Splits a list of key-value pairs into an ordered map.
+        *
+        * <p>
+        * Example:
+        * <p class='bjava'>
+        *      String <jv>in</jv> = <js>"foo=1;bar=2"</js>;
+        *      Map <jv>map</jv> = StringUtils.<jsm>splitMap</jsm>(in, 
<js>';'</js>, <js>'='</js>, <jk>true</jk>);
+        * </p>
+        *
+        * @param s The string to split.
+        * @param trim Trim strings after parsing.
+        * @return The parsed map, or null if the string was null.
+        */
+       public static Map<String,String> splitMap(String s, boolean trim) {
+       
+               if (s == null)
+                       return null;  // NOSONAR - Intentional.
+               if (StringUtils.isEmpty3(s))
+                       return Collections.emptyMap();
+       
+               var m = new LinkedHashMap<String,String>();
+       
+               final int
+                       S1 = 1,  // Found start of key, looking for equals.
+                       S2 = 2;  // Found equals, looking for delimiter (or 
end).
+       
+               var state = S1;
+       
+               var sArray = s.toCharArray();
+               var x1 = 0;
+               var escapeCount = 0;
+               String key = null;
+               for (var i = 0; i < sArray.length + 1; i++) {
+                       var c = i == sArray.length ? ',' : sArray[i];
+                       if (c == '\\')
+                               escapeCount++;
+                       if (escapeCount % 2 == 0) {
+                               if (state == S1) {
+                                       if (c == '=') {
+                                               key = s.substring(x1, i);
+                                               if (trim)
+                                                       key = 
StringUtils.trim(key);
+                                               key = 
StringUtils.unEscapeChars(key, StringUtils.MAP_ESCAPE_SET);
+                                               state = S2;
+                                               x1 = i+1;
+                                       } else if (c == ',') {
+                                               key = s.substring(x1, i);
+                                               if (trim)
+                                                       key = 
StringUtils.trim(key);
+                                               key = 
StringUtils.unEscapeChars(key, StringUtils.MAP_ESCAPE_SET);
+                                               m.put(key, "");
+                                               state = S1;
+                                               x1 = i+1;
+                                       }
+                               } else if (state == S2) {
+                                       if (c == ',') {  // NOSONAR - 
Intentional.
+                                               var val = s.substring(x1, i);
+                                               if (trim)
+                                                       val = 
StringUtils.trim(val);
+                                               val = 
StringUtils.unEscapeChars(val, StringUtils.MAP_ESCAPE_SET);
+                                               m.put(key, val);
+                                               key = null;
+                                               x1 = i+1;
+                                               state = S1;
+                                       }
+                               }
+                       }
+                       if (c != '\\')
+                               escapeCount = 0;
+               }
+       
+               return m;
+       }
+
+       /**
+        * Splits a space-delimited string with optionally quoted arguments.
+        *
+        * <p>
+        * Examples:
+        * <ul>
+        *      <li><js>"foo"</js> =&gt; <c>["foo"]</c>
+        *      <li><js>" foo "</js> =&gt; <c>["foo"]</c>
+        *      <li><js>"foo bar baz"</js> =&gt; <c>["foo","bar","baz"]</c>
+        *      <li><js>"foo 'bar baz'"</js> =&gt; <c>["foo","bar baz"]</c>
+        *      <li><js>"foo \"bar baz\""</js> =&gt; <c>["foo","bar baz"]</c>
+        *      <li><js>"foo 'bar\'baz'"</js> =&gt; <c>["foo","bar'baz"]</c>
+        * </ul>
+        *
+        * @param s The input string.
+        * @return
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static String[] splitQuoted(String s) {
+               return splitQuoted(s, false);
+       }
+
+       /**
+        * Splits a comma-delimited list containing "nesting constructs".
+        *
+        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
+        *
+        * Example:
+        *      "a{b,c},d" -> ["a{b,c}","d"]
+        *
+        * Handles escapes and trims whitespace from tokens.
+        *
+        * @param s The input string.
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static List<String> splitNested(String s) {
+               var escapeChars = StringUtils.getEscapeSet(',');
+       
+               if (s == null) return null;  // NOSONAR - Intentional.
+               if (StringUtils.isEmpty3(s)) return Collections.emptyList();
+               if (s.indexOf(',') == -1) return 
Collections.singletonList(StringUtils.trim(s));
+       
+               var l = new LinkedList<String>();
+       
+               var x1 = 0;
+               var inEscape = false;
+               var depthCount = 0;
+       
+               for (var i = 0; i < s.length(); i++) {
+                       var c = s.charAt(i);
+                       if (inEscape) {
+                               if (c == '\\') {
+                                       inEscape = false;
+                               }
+                       } else {
+                               if (c == '\\') {
+                                       inEscape = true;
+                               } else if (c == '{') {
+                                       depthCount++;
+                               } else if (c == '}') {
+                                       depthCount--;
+                               } else if (c == ',' && depthCount == 0) {
+                                       
l.add(StringUtils.trim(StringUtils.unEscapeChars(s.substring(x1, i), 
escapeChars)));
+                                       x1 = i+1;
+                               }
+                       }
+               }
+               
l.add(StringUtils.trim(StringUtils.unEscapeChars(s.substring(x1, s.length()), 
escapeChars)));
+       
+               return l;
+       }
+
+       /**
+        * Splits a nested comma-delimited list.
+        *
+        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
+        *
+        * Example:
+        *      "a{b,c{d,e}}" -> ["b","c{d,e}"]
+        *
+        * Handles escapes and trims whitespace from tokens.
+        *
+        * @param s The input string.
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static List<String> splitNestedInner(String s) {
+               if (s == null) throw illegalArg("String was null.");
+               if (StringUtils.isEmpty3(s)) throw illegalArg("String was 
empty.");
+       
+               final int
+                       S1 = 1,  // Looking for '{'
+                       S2 = 2;  // Found '{', looking for '}'
+       
+               var start = -1;
+               var end = -1;
+               var state = S1;
+               var depth = 0;
+               var inEscape = false;
+       
+               for (var i = 0; i < s.length(); i++) {
+                       var c = s.charAt(i);
+                       if (inEscape) {
+                               if (c == '\\') {
+                                       inEscape = false;
+                               }
+                       } else {
+                               if (c == '\\') {
+                                       inEscape = true;
+                               } else if (state == S1) {
+                                       if (c == '{') {
+                                               start = i+1;
+                                               state = S2;
+                                       }
+                               } else /* state == S2 */ {
+                                       if (c == '{') {
+                                               depth++;
+                                       } else if (depth > 0 && c == '}') {
+                                               depth--;
+                                       } else if (c == '}') {
+                                               end = i;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       
+               if (start == -1) throw illegalArg("Start character '{' not 
found in string.", s);
+               if (end == -1) throw illegalArg("End character '}' not found in 
string.", s);
+               return splitNested(s.substring(start, end));
+       }
+
+       /**
+        * Same as {@link #splitQuoted(String)} but allows you to optionally 
keep the quote characters.
+        *
+        * @param s The input string.
+        * @param keepQuotes If <jk>true</jk>, quote characters are kept on the 
tokens.
+        * @return
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static String[] splitQuoted(String s, boolean keepQuotes) {
+       
+               if (s == null)
+                       return null;  // NOSONAR - Intentional.
+       
+               s = s.trim();
+       
+               if (StringUtils.isEmpty3(s))
+                       return new String[0];
+       
+               if (! StringUtils.containsAny(s, ' ', '\t', '\'', '"'))
+                       return new String[]{s};
+       
+               final int
+                       S1 = 1,  // Looking for start of token.
+                       S2 = 2,  // Found ', looking for end '
+                       S3 = 3,  // Found ", looking for end "
+                       S4 = 4;  // Found non-whitespace, looking for end 
whitespace.
+       
+               var state = S1;
+       
+               var isInEscape = false;
+               var needsUnescape = false;
+               var mark = 0;
+       
+               var l = new ArrayList<String>();
+               for (var i = 0; i < s.length(); i++) {
+                       var c = s.charAt(i);
+       
+                       if (state == S1) {
+                               if (c == '\'') {
+                                       state = S2;
+                                       mark = keepQuotes ? i : i+1;
+                               } else if (c == '"') {
+                                       state = S3;
+                                       mark = keepQuotes ? i : i+1;
+                               } else if (c != ' ' && c != '\t') {
+                                       state = S4;
+                                       mark = i;
+                               }
+                       } else if (state == S2 || state == S3) {
+                               if (c == '\\') {
+                                       isInEscape = ! isInEscape;
+                                       needsUnescape = ! keepQuotes;
+                               } else if (! isInEscape) {
+                                       if (c == (state == S2 ? '\'' : '"')) {
+                                               var s2 = s.substring(mark, 
keepQuotes ? i+1 : i);
+                                               if (needsUnescape)  // NOSONAR 
- False positive check.
+                                                       s2 = 
StringUtils.unEscapeChars(s2, StringUtils.QUOTE_ESCAPE_SET);
+                                               l.add(s2);
+                                               state = S1;
+                                               isInEscape = needsUnescape = 
false;
+                                       }
+                               } else {
+                                       isInEscape = false;
+                               }
+                       } else /* state == S4 */ {
+                               if (c == ' ' || c == '\t') {
+                                       l.add(s.substring(mark, i));
+                                       state = S1;
+                               }
+                       }
+               }
+               if (state == S4)
+                       l.add(s.substring(mark));
+               else if (state == S2 || state == S3)
+                       throw new IllegalArgumentException("Unmatched string 
quotes: " + s);
+               return l.toArray(new String[l.size()]);
+       }
+
+       /**
+        * Splits the method arguments in the signature of a method.
+        *
+        * @param s The arguments to split.
+        * @return The split arguments, or null if the input string is null.
+        */
+       public static String[] splitMethodArgs(String s) {
+       
+               if (s == null)
+                       return null;  // NOSONAR - Intentional.
+               if (StringUtils.isEmpty3(s))
+                       return new String[0];
+               if (s.indexOf(',') == -1)
+                       return new String[]{s};
+       
+               var l = new LinkedList<String>();
+               var sArray = s.toCharArray();
+               var x1 = 0;
+               var paramDepth = 0;
+       
+               for (var i = 0; i < sArray.length; i++) {
+                       var c = s.charAt(i);
+                       if (c == '>')
+                               paramDepth++;
+                       else if (c == '<')
+                               paramDepth--;
+                       else if (c == ',' && paramDepth == 0) {
+                               var s2 = new String(sArray, x1, i-x1);
+                               l.add(s2.trim());
+                               x1 = i+1;
+                       }
+               }
+       
+               var s2 = new String(sArray, x1, sArray.length-x1);
+               l.add(s2.trim());
+       
+               return l.toArray(new String[l.size()]);
+       }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Entry.java 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Entry.java
index 24886ba0d..a91db67d9 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Entry.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Entry.java
@@ -281,7 +281,7 @@ public class Entry {
                                throw new BeanRuntimeException(e);
                        }
                }
-               return Utils.opt(split3(v));
+               return Utils.opt(Utils.split3(v));
        }
 
        /**
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
index b111025fc..0644ce979 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
@@ -49,7 +49,7 @@ public class ConfigMapEntry {
 
                i = line.indexOf('#');
                if (i != -1) {
-                       var l2 = StringUtils.split3(line, '#', 2);
+                       var l2 = Utils.split3(line, '#', 2);
                        line = l2[0];
                        if (l2.length == 2)
                                this.comment = l2[1].trim();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationApplier.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationApplier.java
index c41e90263..d2873d608 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationApplier.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationApplier.java
@@ -188,7 +188,7 @@ public abstract class AnnotationApplier<A extends 
Annotation, B> {
         * @return An array with resolved strings.
         */
        protected Stream<String> cdl(String in) {
-               return 
Arrays.stream(split3(vr.resolve(in))).filter(StringUtils::isNotEmpty3);
+               return 
Arrays.stream(Utils.split3(vr.resolve(in))).filter(StringUtils::isNotEmpty3);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanFilter.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanFilter.java
index 3aa941c09..b3b4b4ca8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanFilter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanFilter.java
@@ -22,6 +22,7 @@ import static org.apache.juneau.common.internal.StringUtils.*;
 import static org.apache.juneau.internal.ArrayUtils.*;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.swap.*;
 
@@ -453,7 +454,7 @@ public final class BeanFilter {
                public Builder properties(String...value) {
                        this.properties = set();
                        for (String v : value)
-                               split3(v, x -> properties.add(x));
+                               Utils.split3(v, x -> properties.add(x));
                        return this;
                }
 
@@ -497,7 +498,7 @@ public final class BeanFilter {
                public Builder excludeProperties(String...value) {
                        this.excludeProperties = set();
                        for (String v : value)
-                               split3(v, x -> excludeProperties.add(x));
+                               Utils.split3(v, x -> excludeProperties.add(x));
                        return this;
                }
 
@@ -543,7 +544,7 @@ public final class BeanFilter {
                public Builder readOnlyProperties(String...value) {
                        this.readOnlyProperties = set();
                        for (String v : value)
-                               split3(v, x -> readOnlyProperties.add(x));
+                               Utils.split3(v, x -> readOnlyProperties.add(x));
                        return this;
                }
 
@@ -589,7 +590,7 @@ public final class BeanFilter {
                public Builder writeOnlyProperties(String...value) {
                        this.writeOnlyProperties = set();
                        for (String v : value)
-                               split3(v, x -> writeOnlyProperties.add(x));
+                               Utils.split3(v, x -> 
writeOnlyProperties.add(x));
                        return this;
                }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 6e0b01f7f..9e7142d4e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -233,7 +233,7 @@ public class BeanMeta<T> {
                                                throw new 
BeanRuntimeException(c, "Multiple instances of '@Beanc' found.");
                                        constructor = x;
                                        constructorArgs = new String[0];
-                                       ctx.forEachAnnotation(Beanc.class, 
x.inner(), y -> ! y.properties().isEmpty(), z -> constructorArgs = 
StringUtils.split3(z.properties()));
+                                       ctx.forEachAnnotation(Beanc.class, 
x.inner(), y -> ! y.properties().isEmpty(), z -> constructorArgs = 
Utils.split3(z.properties()));
                                        if (! 
x.hasNumParams(constructorArgs.length)) {
                                                if (constructorArgs.length != 0)
                                                        throw new 
BeanRuntimeException(c, "Number of properties defined in '@Beanc' annotation 
does not match number of parameters in constructor.");
@@ -256,7 +256,7 @@ public class BeanMeta<T> {
                                                        throw new 
BeanRuntimeException(c, "Multiple instances of '@Beanc' found.");
                                                constructor = x;
                                                constructorArgs = new String[0];
-                                               
ctx.forEachAnnotation(Beanc.class, x.inner(), y -> ! y.properties().isEmpty(), 
z -> constructorArgs = StringUtils.split3(z.properties()));
+                                               
ctx.forEachAnnotation(Beanc.class, x.inner(), y -> ! y.properties().isEmpty(), 
z -> constructorArgs = Utils.split3(z.properties()));
                                                if (! 
x.hasNumParams(constructorArgs.length)) {
                                                        if 
(constructorArgs.length != 0)
                                                                throw new 
BeanRuntimeException(c, "Number of properties defined in '@Beanc' annotation 
does not match number of parameters in constructor.");
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 9575c100f..545decae0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -191,7 +191,7 @@ public final class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                }
                                lp.forEach(x -> {
                                        if (! x.properties().isEmpty())
-                                               properties = 
split3(x.properties());
+                                               properties = 
Utils.split3(x.properties());
                                        addAll(bdClasses, x.dictionary());
                                        if (! x.ro().isEmpty())
                                                readOnly = 
Boolean.valueOf(x.ro());
@@ -210,7 +210,7 @@ public final class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                isUri |= (rawTypeMeta.isUri() || 
bc.hasAnnotation(Uri.class, getter));
                                lp.forEach(x -> {
                                        if (properties != null && ! 
x.properties().isEmpty())
-                                               properties = 
split3(x.properties());
+                                               properties = 
Utils.split3(x.properties());
                                        addAll(bdClasses, x.dictionary());
                                        if (! x.ro().isEmpty())
                                                readOnly = 
Boolean.valueOf(x.ro());
@@ -230,7 +230,7 @@ public final class BeanPropertyMeta implements 
Comparable<BeanPropertyMeta> {
                                        if (swap == null)
                                                swap = getPropertySwap(x);
                                        if (properties != null && ! 
x.properties().isEmpty())
-                                               properties = 
split3(x.properties());
+                                               properties = 
Utils.split3(x.properties());
                                        addAll(bdClasses, x.dictionary());
                                        if (! x.ro().isEmpty())
                                                readOnly = 
Boolean.valueOf(x.ro());
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 59fceaf88..3c54d72cf 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -720,7 +720,7 @@ public class BeanSession extends ContextSession {
                                else if (from.hasMutaterTo(to))
                                        return from.mutateTo(value, to);
                                else
-                                       return (T)toArray(to, new 
JsonList((Object[])StringUtils.split3(value.toString())).setBeanSession(this));
+                                       return (T)toArray(to, new 
JsonList((Object[])Utils.split3(value.toString())).setBeanSession(this));
                        }
 
                        // Target type is some sort of Map that needs to be 
converted.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaType.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaType.java
index 075917fad..463d98b2a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaType.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MediaType.java
@@ -194,7 +194,7 @@ public class MediaType implements Comparable<MediaType>  {
                type = (i == -1 ? x : x.substring(0, i));
                subType = (i == -1 ? "*" : x.substring(i+1));
 
-               subTypes = StringUtils.split3(subType, '+');
+               subTypes = Utils.split3(subType, '+');
                subTypesSorted = Arrays.copyOf(subTypes, subTypes.length);
                Arrays.sort(this.subTypesSorted);
                hasSubtypeMeta = ArrayUtils.contains("*", this.subTypes);
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 92d0190f1..732ae3b82 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
@@ -69,7 +69,7 @@ public class Version implements Comparable<Version> {
        public Version(String value) {
                if (isEmpty3(value))
                        value = "0";
-               String[] sParts = split3(value, '.');
+               String[] sParts = Utils.split3(value, '.');
                parts = new int[sParts.length];
                for (int i = 0; i < sParts.length; i++) {
                        try {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/Args.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/Args.java
index 291c0dc84..f2b72ea4a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/Args.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/Args.java
@@ -17,6 +17,7 @@ import static java.util.stream.Collectors.*;
 
 import java.util.*;
 import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
 
 /**
  * Utility class to make it easier to work with command-line arguments pass in 
through a
@@ -154,7 +155,7 @@ public final class Args extends JsonMap {
         * @param args Arguments passed in as a raw command line.
         */
        public Args(String args) {
-               this(splitQuoted(args));
+               this(Utils.splitQuoted(args));
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonList.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonList.java
index b5879f653..3464f7546 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonList.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonList.java
@@ -128,7 +128,7 @@ public class JsonList extends LinkedList<Object> {
                if (StringUtils.isEmpty3(s))
                        return null;
                if (! StringUtils.isJsonArray(s, true))
-                       return new 
JsonList((Object[])StringUtils.split3(s.trim(), ','));
+                       return new JsonList((Object[])Utils.split3(s.trim(), 
','));
                return new JsonList(s);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
index c998ba304..82c549b3e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
@@ -818,7 +818,7 @@ public class JsonMap extends LinkedHashMap<String,Object> {
                else if (s instanceof Object[])
                        r = ArrayUtils.toStringArray(alist((Object[])s));
                else
-                       r = StringUtils.split3(Utils.s(s));
+                       r = Utils.split3(Utils.s(s));
                return (r.length == 0 ? def : r);
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
index f24a463b4..4ab3771c5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
@@ -200,7 +200,7 @@ public class Messages extends ResourceBundle {
                                                } catch (ParseException e) {
                                                        throw 
asRuntimeException(e);
                                                }
-                                               x = 
Messages.create(c).name(ms.name).baseNames(split3(ms.baseNames, 
',')).locale(ms.locale).parent(x == null ? null : x.build());
+                                               x = 
Messages.create(c).name(ms.name).baseNames(Utils.split3(ms.baseNames, 
',')).locale(ms.locale).parent(x == null ? null : x.build());
                                        } else {
                                                x = 
Messages.create(c).name(value).parent(x == null ? null : x.build());
                                        }
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 a034ea993..a97e695ec 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
@@ -4045,7 +4045,7 @@ public class HttpPartSchema {
                for (String[] ss : s)
                        if (ss != null)
                                for (String ss2 : ss)
-                                       split3(ss2, x -> set.add(x));
+                                       Utils.split3(ss2, x -> set.add(x));
                return set.isEmpty() ? null : set;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
index da3b31f1e..bc03d27ba 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGenerator.java
@@ -886,7 +886,7 @@ public class JsonSchemaGenerator extends 
BeanTraverseContext implements JsonSche
                ignoreTypes = builder.ignoreTypes == null ? emptySet() : new 
TreeSet<>(builder.ignoreTypes);
 
                Set<Pattern> ignoreTypePatterns = Utils.set();
-               ignoreTypes.forEach(y -> split3(y, x -> 
ignoreTypePatterns.add(Pattern.compile(x.replace(".", "\\.").replace("*", 
".*")))));
+               ignoreTypes.forEach(y -> Utils.split3(y, x -> 
ignoreTypePatterns.add(Pattern.compile(x.replace(".", "\\.").replace("*", 
".*")))));
                this.ignoreTypePatterns = ignoreTypePatterns.toArray(new 
Pattern[ignoreTypePatterns.size()]);
 
                try {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
index 28624a77c..f931cefa4 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/TypeCategory.java
@@ -17,6 +17,8 @@ import static org.apache.juneau.common.internal.Utils.*;
 
 import java.util.*;
 
+import org.apache.juneau.common.internal.*;
+
 /**
  * Represents possible values for JSONSCHEMA_addExamplesTo and 
JSONSCHEMA_addDescriptionsTo.
  *
@@ -71,7 +73,7 @@ public enum TypeCategory {
                if (s == null || s.isEmpty())
                        return Collections.emptySet();
                Set<TypeCategory> set = set();
-               split3(s, x -> set.add(valueOf(x.toUpperCase())));
+               Utils.split3(s, x -> set.add(valueOf(x.toUpperCase())));
                return set;
        }
 
@@ -85,7 +87,7 @@ public enum TypeCategory {
                if (s == null || s.isEmpty())
                        return new TypeCategory[0];
                List<TypeCategory> list = list();
-               split3(s, x -> list.add(valueOf(x.toUpperCase())));
+               Utils.split3(s, x -> list.add(valueOf(x.toUpperCase())));
                return list.toArray(new TypeCategory[list.size()]);
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
index 093981de7..e9df1d403 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiParserSession.java
@@ -393,19 +393,19 @@ public class OpenApiParserSession extends 
UonParserSession {
                                if (cf == MULTI)
                                        ss = new String[]{in};
                                else if (cf == CSV)
-                                       ss = split3(in, ',');
+                                       ss = Utils.split3(in, ',');
                                else if (cf == PIPES)
-                                       ss = split3(in, '|');
+                                       ss = Utils.split3(in, '|');
                                else if (cf == SSV)
-                                       ss = splitQuoted(in);
+                                       ss = Utils.splitQuoted(in);
                                else if (cf == TSV)
-                                       ss = split3(in, '\t');
+                                       ss = Utils.split3(in, '\t');
                                else if (cf == HttpPartCollectionFormat.UONC)
                                        return super.parse(partType, null, in, 
type);
                                else if (cf == NO_COLLECTION_FORMAT) {
                                        if (firstNonWhitespaceChar(in) == '@' 
&& lastNonWhitespaceChar(in) == ')')
                                                return super.parse(partType, 
null, in, type);
-                                       ss = split3(in, ',');
+                                       ss = Utils.split3(in, ',');
                                }
 
                                HttpPartSchema items = schema.getItems();
@@ -438,25 +438,25 @@ public class OpenApiParserSession extends 
UonParserSession {
                                if (cf == MULTI)
                                        ss = new String[]{in};
                                else if (cf == CSV)
-                                       ss = split3(in, ',');
+                                       ss = Utils.split3(in, ',');
                                else if (cf == PIPES)
-                                       ss = split3(in, '|');
+                                       ss = Utils.split3(in, '|');
                                else if (cf == SSV)
-                                       ss = splitQuoted(in);
+                                       ss = Utils.splitQuoted(in);
                                else if (cf == TSV)
-                                       ss = split3(in, '\t');
+                                       ss = Utils.split3(in, '\t');
                                else if (cf == HttpPartCollectionFormat.UONC)
                                        return super.parse(partType, null, in, 
type);
                                else if (cf == NO_COLLECTION_FORMAT) {
                                        if (firstNonWhitespaceChar(in) == '@' 
&& lastNonWhitespaceChar(in) == ')')
                                                return super.parse(partType, 
null, in, type);
-                                       ss = split3(in, ',');
+                                       ss = Utils.split3(in, ',');
                                }
 
                                if (type.isBean()) {
                                        BeanMap<T> m = 
ctx.getBeanContext().newBeanMap(type.getInnerClass());
                                        for (String s : ss) {
-                                               String[] kv = split3(s, '=', 2);
+                                               String[] kv = Utils.split3(s, 
'=', 2);
                                                if (kv.length != 2)
                                                        throw new 
ParseException("Invalid input {0} for part type OBJECT.", in);
                                                String key = kv[0], value = 
kv[1];
@@ -480,7 +480,7 @@ public class OpenApiParserSession extends UonParserSession {
                                                m = JsonMap.create();
 
                                        for (String s : ss) {
-                                               String[] kv = split3(s, '=', 2);
+                                               String[] kv = Utils.split3(s, 
'=', 2);
                                                if (kv.length != 2)
                                                        throw new 
ParseException("Invalid input {0} for part type OBJECT.", in);
                                                String key = kv[0], value = 
kv[1];
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
index 9ac4040c2..1d6fd352c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SearchArgs.java
@@ -66,7 +66,7 @@ public class SearchArgs {
         * @param searchArgs Search arguments.
         */
        public SearchArgs(String searchArgs) {
-               this(alist(StringUtils.split3(searchArgs)));
+               this(alist(Utils.split3(searchArgs)));
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
index 8ad0e3a61..7bf2d9f8e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/SortArgs.java
@@ -88,7 +88,7 @@ public class SortArgs {
         *      </ul>
         */
        public SortArgs(String sortArgs) {
-               this(alist(StringUtils.split3(sortArgs)));
+               this(alist(Utils.split3(sortArgs)));
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
index 1e24be5fb..f643ff377 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
@@ -78,7 +78,7 @@ public class StringMatcherFactory extends MatcherFactory {
                        List<Pattern> ands = new LinkedList<>();
                        List<Pattern> nots = new LinkedList<>();
 
-                       for (String s : splitQuoted(pattern, true)) {
+                       for (String s : Utils.splitQuoted(pattern, true)) {
                                char c0 = s.charAt(0), c9 = 
s.charAt(s.length()-1);
 
                                if (c0 == '/' && c9 == '/' && s.length() > 1) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
index 2e0f3a4b6..7904cb0c8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/ViewArgs.java
@@ -68,7 +68,7 @@ public class ViewArgs {
         *      <br>Values are column names.
         */
        public ViewArgs(String viewArgs) {
-               this(alist(StringUtils.split3(viewArgs)));
+               this(alist(Utils.split3(viewArgs)));
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartResolvingVar.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartResolvingVar.java
index 6c33af184..c387892bd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartResolvingVar.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartResolvingVar.java
@@ -14,6 +14,8 @@ package org.apache.juneau.svl;
 
 import static org.apache.juneau.common.internal.StringUtils.*;
 
+import org.apache.juneau.common.internal.*;
+
 /**
  * Interface for the resolution of vars that can have one or more keys where 
the first non-null resolution is returned.
  *
@@ -47,7 +49,7 @@ public abstract class MultipartResolvingVar extends SimpleVar 
{
                int i = s.indexOf(',');
                if (i == -1)
                        return resolve(session, s.trim());
-               for (String s2 : split3(s)) {
+               for (String s2 : Utils.split3(s)) {
                        String v = resolve(session, s2);
                        if (v != null)
                                return v;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartVar.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartVar.java
index 0499aef30..8f7a0837a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartVar.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/MultipartVar.java
@@ -14,6 +14,8 @@ package org.apache.juneau.svl;
 
 import static org.apache.juneau.common.internal.StringUtils.*;
 
+import org.apache.juneau.common.internal.*;
+
 /**
  * Interface for the resolution of vars that consist of a comma-delimited list.
  *
@@ -48,7 +50,7 @@ public abstract class MultipartVar extends SimpleVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String s) {
-               String[] s2 = s.indexOf(',') == -1 ? new String[]{s.trim()} : 
split3(s);
+               String[] s2 = s.indexOf(',') == -1 ? new String[]{s.trim()} : 
Utils.split3(s);
                return resolve(session, s2);
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
index 36bfafa72..8a4b971c9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.common.internal.StringUtils.*;
 
 import java.util.regex.*;
 
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.svl.*;
 
 /**
@@ -70,7 +71,7 @@ public class SwitchVar extends MultipartVar {
                for (int i = 1; i < args.length; i++) {
                        String pattern = args[i];
 
-                       String[] parts = split3(pattern, ':', 2);
+                       String[] parts = Utils.split3(pattern, ':', 2);
                        assertArg(parts.length >= 2, "Invalid arguments passed 
to $SW var.  Each case statement must contains 'pattern:value'.");
 
                        Pattern p = Pattern.compile(parts[0].replace("*", 
".*").replace("?", "."));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
index 25a31cd6e..b8844aa92 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
@@ -617,7 +617,7 @@ public class ReflectionMap<V> {
 
                MethodEntry(String name, V value) {
                        int i = name.indexOf('(');
-                       this.args = i == -1 ? null : 
splitMethodArgs(name.substring(i+1, name.length()-1));
+                       this.args = i == -1 ? null : 
Utils.splitMethodArgs(name.substring(i+1, name.length()-1));
                        if (args != null) {
                                for (int j = 0; j < args.length; j++) {
 
@@ -678,7 +678,7 @@ public class ReflectionMap<V> {
 
                ConstructorEntry(String name, V value) {
                        int i = name.indexOf('(');
-                       this.args = split3(name.substring(i+1, 
name.length()-1));
+                       this.args = Utils.split3(name.substring(i+1, 
name.length()-1));
                        name = name.substring(0, i).trim();
                        this.simpleClassName = simpleClassName(name);
                        this.fullClassName = name;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
index 208ca8ec4..cfd7417de 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/Namespace.java
@@ -127,7 +127,7 @@ public final class Namespace {
                }
 
                if (o instanceof CharSequence) {
-                       String[] ss = StringUtils.split3(o.toString());
+                       String[] ss = Utils.split3(o.toString());
                        Namespace[] n = new Namespace[ss.length];
                        for (int i = 0; i < ss.length; i++)
                                n[i] = create(ss[i]);
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 d5d0a1bbf..fc3dc29c4 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
@@ -109,7 +109,7 @@ public class BasicCsvHeader extends BasicHeader {
         */
        public BasicCsvHeader(String name, String value) {
                super(name, value);
-               this.value = split3(value);
+               this.value = Utils.split3(value);
                this.supplier = null;
        }
 
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 4b5ee667b..b4857455c 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
@@ -83,7 +83,7 @@ public class EntityTags {
        private EntityTag[] parse(String value) {
                if (value == null)
                        return null;
-               String[] s = split3(value);
+               String[] s = Utils.split3(value);
                EntityTag[] v = new EntityTag[s.length];
                for (int i = 0; i < s.length; i++)
                        v[i] = EntityTag.of(s[i]);
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 ef29bcbdf..ffadb9bb6 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
@@ -109,7 +109,7 @@ public class Thrown extends BasicCsvHeader {
        public Thrown(String value) {
                super(NAME, value);
                List<Part> l = Utils.list();
-               split3(value, x -> l.add(new Part(x)));
+               Utils.split3(value, x -> l.add(new Part(x)));
                this.value = value == null ? null : u(l);
        }
 
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 6fe4dd295..a08775348 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
@@ -111,7 +111,7 @@ public class BasicCsvArrayPart extends BasicPart {
         */
        public BasicCsvArrayPart(String name, String value) {
                super(name, value);
-               this.value = split3(value);
+               this.value = Utils.split3(value);
                this.supplier = null;
                this.stringValue = value;
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 68bf53d1c..5e01f3641 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -5569,7 +5569,7 @@ public class RestContext extends Context {
                                return v == null ? false : super.contains(v);
                        }
                };
-               split3(value, x -> s.add(x));
+               Utils.split3(value, x -> s.add(x));
                return u(s);
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
index 850add31b..99b51f745 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
@@ -18,6 +18,7 @@ import static 
org.apache.juneau.rest.annotation.RestOpAnnotation.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
@@ -99,7 +100,7 @@ public class BasicDebugEnablement extends DebugEnablement {
                        x -> true,
                        x -> {
                                String x2 = varResolver.resolve(x.debugOn());
-                               for (Map.Entry<String,String> e : splitMap(x2, 
true).entrySet()) {
+                               for (Map.Entry<String,String> e : 
Utils.splitMap(x2, true).entrySet()) {
                                        String k = e.getKey(), v = e.getValue();
                                        if (v.isEmpty())
                                                v = "ALWAYS";
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 9730ef85c..9c86e9821 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
@@ -1128,7 +1128,7 @@ public class BasicSwaggerProviderSession {
                        return null;
                Set<String> set = set();
                for (String s : ss)
-                       split3(s, x -> set.add(x));
+                       Utils.split3(s, x -> set.add(x));
                return set.isEmpty() ? null : set;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPath.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPath.java
index 823b23930..31227d4b0 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPath.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/util/UrlPath.java
@@ -48,7 +48,7 @@ public class UrlPath {
         */
        UrlPath(String path) {
                this.path = path;
-               parts = path == null ? new String[0] : 
split3(path.substring(1), '/');
+               parts = path == null ? new String[0] : 
Utils.split3(path.substring(1), '/');
                for (int i = 0; i < parts.length; i++)
                        parts[i] = urlDecode(parts[i]);
        }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
index 98a153a25..ece285d5d 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.common.internal.StringUtils.*;
 
 import java.io.*;
 
+import org.apache.juneau.common.internal.*;
 import org.apache.juneau.http.response.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.serializer.*;
@@ -55,7 +56,7 @@ public class SerializedRequestAttrVar extends StreamedVar {
                int i = key.indexOf(',');
                if (i == -1)
                        throw new IllegalArgumentException("Invalid format for 
$SA var. Must be of the format $SA{contentType,key[,defaultValue]}");
-               String[] s2 = split3(key);
+               String[] s2 = Utils.split3(key);
                RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                Object o = req.getAttribute(key).orElse(key);
                Serializer s = 
req.getOpContext().getSerializers().getSerializer(s2[0]);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java 
b/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
index e48b1edf4..40b0c3845 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/TestUtils.java
@@ -121,7 +121,7 @@ public class TestUtils extends Utils {
 
        public static void assertContainsAll(String expected, Object actual) {
                var a2 = r(actual);
-               for (var e : StringUtils.split3(expected))
+               for (var e : Utils.split3(expected))
                        assertTrue(a2.contains(e), fs("String did not contain 
expected substring.  expected={0}, actual={1}", e, a2));
        }
 
@@ -138,7 +138,7 @@ public class TestUtils extends Utils {
         */
        public static void assertArray(Object array, Object...expected) {
                if (expected.length == 1 && expected[0] instanceof String && 
s(expected[0]).contains(","))
-                       expected = s(expected[0]).charAt(0) == '>' ? new 
String[]{s(expected[0]).substring(1)} : StringUtils.split3(s(expected[0]));
+                       expected = s(expected[0]).charAt(0) == '>' ? new 
String[]{s(expected[0]).substring(1)} : Utils.split3(s(expected[0]));
                if (Array.getLength(array) != expected.length)
                        fail(fs("Wrong array length.  expected={0}, 
actual={1}", expected.length, Array.getLength(array)));
                for (var i = 0; i < expected.length; i++) {
@@ -161,7 +161,7 @@ public class TestUtils extends Utils {
         */
        public static void assertList(List<?> list, Object...expected) {
                if (expected.length == 1 && expected[0] instanceof String && 
s(expected[0]).contains(","))
-                       expected = s(expected[0]).charAt(0) == '>' ? new 
String[]{s(expected[0]).substring(1)} : StringUtils.split3(s(expected[0]));
+                       expected = s(expected[0]).charAt(0) == '>' ? new 
String[]{s(expected[0]).substring(1)} : Utils.split3(s(expected[0]));
                if (list.size() != expected.length)
                        fail(fs("Wrong list length.  expected={0}, actual={1}", 
expected.length, list.size()));
                for (var i = 0; i < expected.length; i++) {
@@ -275,7 +275,7 @@ public class TestUtils extends Utils {
         */
        public static void assertBean(Object o, String fields, String value) {
                if (o == null) throw new NullPointerException("Bean was null");
-               assertEquals(value, splitNested(fields).stream().map(x -> 
TestUtils.getReadableEntry(o, x)).collect(joining(",")));
+               assertEquals(value, Utils.splitNested(fields).stream().map(x -> 
TestUtils.getReadableEntry(o, x)).collect(joining(",")));
        }
 
        /**
@@ -302,7 +302,7 @@ public class TestUtils extends Utils {
        public static void assertBeans(Collection l, String fields, 
Object...values) {
                assertEquals(values.length, l.size(), ()->"Expected 
"+values.length+" rows but had actual " + l.size());
                var r = 0;
-               var f = splitNested(fields);
+               var f = Utils.splitNested(fields);
                for (var o : l) {
                        var actual = f.stream().map(x -> 
TestUtils.getReadableEntry(o, x)).collect(joining(","));
                        var r2 = r+1;
@@ -328,7 +328,7 @@ public class TestUtils extends Utils {
        private static String getReadableEntry(Object o, String name) {
                var i = name.indexOf("{");
                var pn = i == -1 ? name : name.substring(0, i);
-               var spn = i == -1 ? null : splitNestedInner(name);
+               var spn = i == -1 ? null : Utils.splitNestedInner(name);
                var e = TestUtils.getEntry(o, pn);
                if (spn == null) return r(e);
                return spn.stream().map(x -> getReadableEntry(e, 
x)).collect(joining(","));
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 45806d6c3..5ee3b4c35 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
@@ -397,17 +397,17 @@ class StringUtilsTest extends SimpleTestBase {
        // split(String,char)
        
//====================================================================================================
        @Test void a07_split() {
-               assertNull(StringUtils.split3((String)null));
-               assertArray(StringUtils.split3(""));
-               assertArray(StringUtils.split3("1"), "1");
-               assertArray(StringUtils.split3("1,2"), "1", "2");
-               assertArray(StringUtils.split3("1\\,2"), ">1,2");
-               assertArray(StringUtils.split3("1\\\\,2"), "1\\", "2");
-               assertArray(StringUtils.split3("1\\\\\\,2"), ">1\\,2");
-               assertArray(StringUtils.split3("1,2\\"), "1", "2\\");
-               assertArray(StringUtils.split3("1,2\\\\"), "1", "2\\");
-               assertArray(StringUtils.split3("1,2\\,"), "1", "2,");
-               assertArray(StringUtils.split3("1,2\\\\,"), "1", "2\\", "");
+               assertNull(Utils.split3((String)null));
+               assertArray(Utils.split3(""));
+               assertArray(Utils.split3("1"), "1");
+               assertArray(Utils.split3("1,2"), "1", "2");
+               assertArray(Utils.split3("1\\,2"), ">1,2");
+               assertArray(Utils.split3("1\\\\,2"), "1\\", "2");
+               assertArray(Utils.split3("1\\\\\\,2"), ">1\\,2");
+               assertArray(Utils.split3("1,2\\"), "1", "2\\");
+               assertArray(Utils.split3("1,2\\\\"), "1", "2\\");
+               assertArray(Utils.split3("1,2\\,"), "1", "2,");
+               assertArray(Utils.split3("1,2\\\\,"), "1", "2\\", "");
        }
 
        @Test void a08_split2() {
@@ -426,7 +426,7 @@ class StringUtilsTest extends SimpleTestBase {
 
        private List<String> split2test(String s) {
                List<String> l = TestUtils.list();
-               split3(s, l::add);
+               Utils.split3(s, l::add);
                return l;
        }
 
@@ -434,13 +434,13 @@ class StringUtilsTest extends SimpleTestBase {
        // split(String,char,int)
        
//====================================================================================================
        @Test void a09_splitWithLimit() {
-               TestUtils.assertString("[boo,and,foo]", split3("boo:and:foo", 
':', 10));
-               TestUtils.assertString("[boo,and:foo]", split3("boo:and:foo", 
':', 2));
-               TestUtils.assertString("[boo:and:foo]", split3("boo:and:foo", 
':', 1));
-               TestUtils.assertString("[boo:and:foo]", split3("boo:and:foo", 
':', 0));
-               TestUtils.assertString("[boo:and:foo]", split3("boo:and:foo", 
':', -1));
-               TestUtils.assertString("[boo,and,foo]", split3("boo : and : 
foo", ':', 10));
-               TestUtils.assertString("[boo,and : foo]", split3("boo : and : 
foo", ':', 2));
+               TestUtils.assertString("[boo,and,foo]", 
Utils.split3("boo:and:foo", ':', 10));
+               TestUtils.assertString("[boo,and:foo]", 
Utils.split3("boo:and:foo", ':', 2));
+               TestUtils.assertString("[boo:and:foo]", 
Utils.split3("boo:and:foo", ':', 1));
+               TestUtils.assertString("[boo:and:foo]", 
Utils.split3("boo:and:foo", ':', 0));
+               TestUtils.assertString("[boo:and:foo]", 
Utils.split3("boo:and:foo", ':', -1));
+               TestUtils.assertString("[boo,and,foo]", Utils.split3("boo : and 
: foo", ':', 10));
+               TestUtils.assertString("[boo,and : foo]", Utils.split3("boo : 
and : foo", ':', 2));
        }
 
        
//====================================================================================================
@@ -565,16 +565,16 @@ class StringUtilsTest extends SimpleTestBase {
        // parseMap(String,char,char,boolean)
        
//====================================================================================================
        @Test void a19_splitMap() {
-               TestUtils.assertString("{a=1}", splitMap("a=1", true));
-               TestUtils.assertString("{a=1,b=2}", splitMap("a=1,b=2", true));
-               TestUtils.assertString("{a=1,b=2}", splitMap(" a = 1 , b = 2 ", 
true));
-               TestUtils.assertString("{ a = 1 , b = 2 }", splitMap(" a = 1 , 
b = 2 ", false));
-               TestUtils.assertString("{a=}", splitMap("a", true));
-               TestUtils.assertString("{a=,b=}", splitMap("a,b", true));
-               TestUtils.assertString("{a=1,b=}", splitMap("a=1,b", true));
-               TestUtils.assertString("{a=,b=1}", splitMap("a,b=1", true));
-               TestUtils.assertString("{a==1}", splitMap("a\\==1", true));
-               TestUtils.assertString("{a\\=1}", splitMap("a\\\\=1", true));
+               TestUtils.assertString("{a=1}", Utils.splitMap("a=1", true));
+               TestUtils.assertString("{a=1,b=2}", Utils.splitMap("a=1,b=2", 
true));
+               TestUtils.assertString("{a=1,b=2}", Utils.splitMap(" a = 1 , b 
= 2 ", true));
+               TestUtils.assertString("{ a = 1 , b = 2 }", Utils.splitMap(" a 
= 1 , b = 2 ", false));
+               TestUtils.assertString("{a=}", Utils.splitMap("a", true));
+               TestUtils.assertString("{a=,b=}", Utils.splitMap("a,b", true));
+               TestUtils.assertString("{a=1,b=}", Utils.splitMap("a=1,b", 
true));
+               TestUtils.assertString("{a=,b=1}", Utils.splitMap("a,b=1", 
true));
+               TestUtils.assertString("{a==1}", Utils.splitMap("a\\==1", 
true));
+               TestUtils.assertString("{a\\=1}", Utils.splitMap("a\\\\=1", 
true));
        }
 
        
//====================================================================================================
@@ -607,25 +607,25 @@ class StringUtilsTest extends SimpleTestBase {
        // splitQuoted(String)
        
//====================================================================================================
        @Test void a22_splitQuoted() {
-               assertNull(splitQuoted(null));
-               assertArray(splitQuoted(""));
-               assertArray(splitQuoted(" \t "));
-               assertArray(splitQuoted("foo"), "foo");
-               assertArray(splitQuoted("foo  bar baz"), "foo", "bar", "baz");
-               assertArray(splitQuoted("'foo'"), "foo");
-               assertArray(splitQuoted(" ' foo ' "), " foo ");
-               assertArray(splitQuoted("'foo' 'bar'"), "foo", "bar");
-               assertArray(splitQuoted("\"foo\""), "foo");
-               assertArray(splitQuoted(" \" foo \" "), " foo ");
-               assertArray(splitQuoted("\"foo\" \"bar\""), "foo", "bar");
-               assertArray(splitQuoted("'foo\\'bar'"), "foo'bar");
-               assertArray(splitQuoted("'foo\\\"bar'"), "foo\"bar");
-               assertArray(splitQuoted("'\\'foo\\'bar\\''"), "'foo'bar'");
-               assertArray(splitQuoted("'\\\"foo\\\"bar\\\"'"), 
"\"foo\"bar\"");
-               assertArray(splitQuoted("'\\'foo\\''"), "'foo'");
-               assertArray(splitQuoted("\"\\\"foo\\\"\""), "\"foo\"");
-               assertArray(splitQuoted("'\"foo\"'"), "\"foo\"");
-               assertArray(splitQuoted("\"'foo'\""), "'foo'");
+               assertNull(Utils.splitQuoted(null));
+               assertArray(Utils.splitQuoted(""));
+               assertArray(Utils.splitQuoted(" \t "));
+               assertArray(Utils.splitQuoted("foo"), "foo");
+               assertArray(Utils.splitQuoted("foo  bar baz"), "foo", "bar", 
"baz");
+               assertArray(Utils.splitQuoted("'foo'"), "foo");
+               assertArray(Utils.splitQuoted(" ' foo ' "), " foo ");
+               assertArray(Utils.splitQuoted("'foo' 'bar'"), "foo", "bar");
+               assertArray(Utils.splitQuoted("\"foo\""), "foo");
+               assertArray(Utils.splitQuoted(" \" foo \" "), " foo ");
+               assertArray(Utils.splitQuoted("\"foo\" \"bar\""), "foo", "bar");
+               assertArray(Utils.splitQuoted("'foo\\'bar'"), "foo'bar");
+               assertArray(Utils.splitQuoted("'foo\\\"bar'"), "foo\"bar");
+               assertArray(Utils.splitQuoted("'\\'foo\\'bar\\''"), 
"'foo'bar'");
+               assertArray(Utils.splitQuoted("'\\\"foo\\\"bar\\\"'"), 
"\"foo\"bar\"");
+               assertArray(Utils.splitQuoted("'\\'foo\\''"), "'foo'");
+               assertArray(Utils.splitQuoted("\"\\\"foo\\\"\""), "\"foo\"");
+               assertArray(Utils.splitQuoted("'\"foo\"'"), "\"foo\"");
+               assertArray(Utils.splitQuoted("\"'foo'\""), "'foo'");
        }
 
        
//====================================================================================================
@@ -813,11 +813,11 @@ class StringUtilsTest extends SimpleTestBase {
        // splitMethodArgs(String)
        
//====================================================================================================
        @Test void a33_splitMethodArgs() {
-               assertArray(splitMethodArgs("java.lang.String"), 
"java.lang.String");
-               
assertArray(splitMethodArgs("java.lang.String,java.lang.Integer"), 
"java.lang.String", "java.lang.Integer");
-               assertArray(splitMethodArgs("x,y"), "x","y");
-               assertArray(splitMethodArgs("x,y<a,b>,z"), "x", "y<a,b>", "z");
-               assertArray(splitMethodArgs("x,y<a<b,c>,d<e,f>>,z"), "x", 
"y<a<b,c>,d<e,f>>", "z");
+               assertArray(Utils.splitMethodArgs("java.lang.String"), 
"java.lang.String");
+               
assertArray(Utils.splitMethodArgs("java.lang.String,java.lang.Integer"), 
"java.lang.String", "java.lang.Integer");
+               assertArray(Utils.splitMethodArgs("x,y"), "x","y");
+               assertArray(Utils.splitMethodArgs("x,y<a,b>,z"), "x", "y<a,b>", 
"z");
+               assertArray(Utils.splitMethodArgs("x,y<a<b,c>,d<e,f>>,z"), "x", 
"y<a<b,c>,d<e,f>>", "z");
        }
 
        
//====================================================================================================
@@ -866,27 +866,27 @@ class StringUtilsTest extends SimpleTestBase {
        // splitNested(String)
        
//====================================================================================================
        @Test void a37_splitNested() {
-               assertNull(splitNested(null));
-               assertList(splitNested(""));
-               assertList(splitNested("a"), "a");
-               assertList(splitNested("a,b,c"), "a", "b", "c");
-               assertList(splitNested("a{b,c},d"), "a{b,c}", "d");
-               assertList(splitNested("a,b{c,d}"), "a", "b{c,d}");
-               assertList(splitNested("a,b{c,d{e,f}}"), "a", "b{c,d{e,f}}");
-               assertList(splitNested("a { b , c } , d "), "a { b , c }", "d");
-               assertList(splitNested("a\\,b"), ">a,b");
-               assertList(splitNested("a\\\\,b"), "a\\", "b");
+               assertNull(Utils.splitNested(null));
+               assertList(Utils.splitNested(""));
+               assertList(Utils.splitNested("a"), "a");
+               assertList(Utils.splitNested("a,b,c"), "a", "b", "c");
+               assertList(Utils.splitNested("a{b,c},d"), "a{b,c}", "d");
+               assertList(Utils.splitNested("a,b{c,d}"), "a", "b{c,d}");
+               assertList(Utils.splitNested("a,b{c,d{e,f}}"), "a", 
"b{c,d{e,f}}");
+               assertList(Utils.splitNested("a { b , c } , d "), "a { b , c 
}", "d");
+               assertList(Utils.splitNested("a\\,b"), ">a,b");
+               assertList(Utils.splitNested("a\\\\,b"), "a\\", "b");
        }
 
        
//====================================================================================================
        // splitNestedInner(String)
        
//====================================================================================================
        @Test void a38_splitNestedInner() {
-               assertThrowsWithMessage(IllegalArgumentException.class, "String 
was null.", ()->splitNestedInner(null));
-               assertThrowsWithMessage(IllegalArgumentException.class, "String 
was empty.", ()->splitNestedInner(""));
-               assertList(splitNestedInner("a{b}"), "b");
-               assertList(splitNestedInner(" a { b } "), "b");
-               assertList(splitNestedInner("a{b,c}"), "b", "c");
-               assertList(splitNestedInner("a{b{c,d},e{f,g}}"), "b{c,d}", 
"e{f,g}");
+               assertThrowsWithMessage(IllegalArgumentException.class, "String 
was null.", ()->Utils.splitNestedInner(null));
+               assertThrowsWithMessage(IllegalArgumentException.class, "String 
was empty.", ()->Utils.splitNestedInner(""));
+               assertList(Utils.splitNestedInner("a{b}"), "b");
+               assertList(Utils.splitNestedInner(" a { b } "), "b");
+               assertList(Utils.splitNestedInner("a{b,c}"), "b", "c");
+               assertList(Utils.splitNestedInner("a{b{c,d},e{f,g}}"), 
"b{c,d}", "e{f,g}");
        }
 }
\ No newline at end of file

Reply via email to