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 5218af2bfd Unit tests
5218af2bfd is described below

commit 5218af2bfd94e57d66791e3da6ff76090516bb5c
Author: James Bognar <[email protected]>
AuthorDate: Mon Dec 1 19:29:09 2025 -0800

    Unit tests
---
 .../apache/juneau/commons/utils/StringUtils.java   | 178 ++++++---------------
 1 file changed, 47 insertions(+), 131 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
index 2c268a2135..93ff9fd9fc 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
@@ -125,7 +125,7 @@ public class StringUtils {
        }
        private static final Random RANDOM = new Random();
 
-       private static final Pattern FP_REGEX = Pattern.compile(
+       public static final Pattern FP_REGEX = Pattern.compile(
                
"[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*"
  // NOSONAR
        );
 
@@ -133,8 +133,8 @@ public class StringUtils {
 
        private static final char[] HEX_ARRAY = 
"0123456789ABCDEF".toCharArray();
 
-       private static final List<Tuple2<Class<?>,Function<Object,String>>> 
READIFIERS = loadReadifiers();
-       private static final Cache<Class<?>,Function<Object,String>> 
READIFIER_CACHE = Cache.<Class<?>,Function<Object,String>>create().build();
+       private static final List<Readifier> READIFIERS = loadReadifiers();
+       private static final Cache<Class,Function<Object,String>> 
READIFIER_CACHE = Cache.<Class,Function<Object,String>>create().build();
 
        private static final char[] HEX = "0123456789ABCDEF".toCharArray();
 
@@ -5822,8 +5822,8 @@ public class StringUtils {
                        // Find readifier from READIFIERS list
                        // First try exact match, then isAssignableFrom
                        var readifier = READIFIERS.stream()
-                               .filter(x -> x.getA() == c || 
x.getA().isAssignableFrom(c))
-                               .map(x -> x.getB())
+                               .filter(r -> r.forClass() == c || 
r.forClass().isAssignableFrom(c))
+                               .map(Readifier::toFunction)
                                .findFirst()
                                .orElse(null);
 
@@ -8191,104 +8191,48 @@ public class StringUtils {
                return c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U';
        }
 
-       private static List<Tuple2<Class<?>,Function<Object,String>>> 
loadReadifiers() {
-               var list = new 
ArrayList<Tuple2<Class<?>,Function<Object,String>>>();
+       private static class Readifier {
+               private final Class<?> type;
+               private final Function<Object,String> bridge;
 
-               // More specific types first - order matters!
-
-               // Map.Entry before Map
-               list.add(Tuple2.of(Map.Entry.class, o -> {
-                       var e = (Map.Entry<?,?>)o;
-                       return readable(e.getKey()) + '=' + 
readable(e.getValue());
-               }));
-
-               // Collection before Iterable
-               list.add(Tuple2.of(Collection.class, o -> {
-                       var c = (Collection<?>)o;
-                       return 
c.stream().map(StringUtils::readable).collect(joining(",", "[", "]"));
-               }));
-
-               // Map
-               list.add(Tuple2.of(Map.class, o -> {
-                       var m = (Map<?,?>)o;
-                       return 
m.entrySet().stream().map(StringUtils::readable).collect(joining(",", "{", 
"}"));
-               }));
-
-               // Iterable (but not Collection, which is handled above)
-               list.add(Tuple2.of(Iterable.class, o -> {
-                       var i = (Iterable<?>)o;
-                       return readable(toList(i));
-               }));
-
-               // Iterator
-               list.add(Tuple2.of(Iterator.class, o -> {
-                       var i = (Iterator<?>)o;
-                       return readable(toList(i));
-               }));
-
-               // Enumeration
-               list.add(Tuple2.of(Enumeration.class, o -> {
-                       var e = (Enumeration<?>)o;
-                       return readable(toList(e));
-               }));
-
-               // Optional
-               list.add(Tuple2.of(Optional.class, o -> {
-                       var opt = (Optional<?>)o;
-                       return readable(opt.orElse(null));
-               }));
-
-               // GregorianCalendar
-               list.add(Tuple2.of(GregorianCalendar.class, o -> {
-                       var cal = (GregorianCalendar)o;
-                       return 
cal.toZonedDateTime().format(DateTimeFormatter.ISO_INSTANT);
-               }));
-
-               // Date
-               list.add(Tuple2.of(Date.class, o -> {
-                       var date = (Date)o;
-                       return date.toInstant().toString();
-               }));
-
-               // InputStream
-               list.add(Tuple2.of(InputStream.class, o -> {
-                       var is = (InputStream)o;
-                       return toHex(is);
-               }));
-
-               // Reader
-               list.add(Tuple2.of(Reader.class, o -> {
-                       var r = (Reader)o;
-                       return safe(() -> read(r));
-               }));
+               private <T> Readifier(Class<T> type, Function<? super T,String> 
converter) {
+                       this.type = type;
+                       this.bridge = o -> converter.apply(type.cast(o));
+               }
 
-               // File
-               list.add(Tuple2.of(File.class, o -> {
-                       var f = (File)o;
-                       return safe(() -> read(f));
-               }));
+               Class<?> forClass() {
+                       return type;
+               }
 
-               // byte[]
-               list.add(Tuple2.of(byte[].class, o -> {
-                       var bytes = (byte[])o;
-                       return toHex(bytes);
-               }));
+               Function<Object,String> toFunction() {
+                       return bridge;
+               }
+       }
 
-               // Enum
-               list.add(Tuple2.of(Enum.class, o -> {
-                       var e = (Enum<?>)o;
-                       return e.name();
-               }));
+       private static <T> Readifier readifier(Class<T> type, Function<? super 
T,String> converter) {
+               return new Readifier(type, converter);
+       }
 
-               // Class
-               list.add(Tuple2.of(Class.class, o -> {
-                       var c = (Class<?>)o;
-                       return cns(c);
-               }));
+       private static List<Readifier> loadReadifiers() {
+               var list = new ArrayList<Readifier>();
 
-               // Executable (Method or Constructor)
-               list.add(Tuple2.of(Executable.class, o -> {
-                       var exec = (Executable)o;
+               // More specific types first - order matters!
+               list.add(readifier(Map.Entry.class, e -> readable(e.getKey()) + 
'=' + readable(e.getValue())));
+               list.add(readifier(Collection.class, c -> 
((Collection<?>)c).stream().map(StringUtils::readable).collect(joining(",", 
"[", "]"))));
+               list.add(readifier(Map.class, m -> 
((Map<?,?>)m).entrySet().stream().map(StringUtils::readable).collect(joining(",",
 "{", "}"))));
+               list.add(readifier(Iterable.class, i -> readable(toList(i))));
+               list.add(readifier(Iterator.class, it -> readable(toList(it))));
+               list.add(readifier(Enumeration.class, e -> 
readable(toList(e))));
+               list.add(readifier(Optional.class, o -> 
readable(((Optional<?>)o).orElse(null))));
+               list.add(readifier(GregorianCalendar.class, (GregorianCalendar 
cal) -> cal.toZonedDateTime().format(DateTimeFormatter.ISO_INSTANT)));
+               list.add(readifier(Date.class, (Date date) -> 
date.toInstant().toString()));
+               list.add(readifier(InputStream.class, (InputStream is) -> 
toHex(is)));
+               list.add(readifier(Reader.class, (Reader reader) -> safe(() -> 
read(reader))));
+               list.add(readifier(File.class, (File file) -> safe(() -> 
read(file))));
+               list.add(readifier(byte[].class, (byte[] bytes) -> 
toHex(bytes)));
+               list.add(readifier(Enum.class, e -> ((Enum<?>)e).name()));
+               list.add(readifier(Class.class, c -> cns(c)));
+               list.add(readifier(Executable.class, (Executable exec) -> {
                        var sb = new StringBuilder(64);
                        sb.append(exec instanceof Constructor ? 
cns(exec.getDeclaringClass()) : exec.getName()).append('(');
                        var pt = exec.getParameterTypes();
@@ -8300,40 +8244,12 @@ public class StringUtils {
                        sb.append(')');
                        return sb.toString();
                }));
-
-               // ClassInfo
-               list.add(Tuple2.of(ClassInfo.class, o -> {
-                       var ci = (ClassInfo)o;
-                       return ci.toString();
-               }));
-
-               // ExecutableInfo
-               list.add(Tuple2.of(ExecutableInfo.class, o -> {
-                       var ei = (ExecutableInfo)o;
-                       return ei.toString();
-               }));
-
-               // FieldInfo
-               list.add(Tuple2.of(FieldInfo.class, o -> {
-                       var fi = (FieldInfo)o;
-                       return fi.toString();
-               }));
-
-               // ParameterInfo
-               list.add(Tuple2.of(ParameterInfo.class, o -> {
-                       var pi = (ParameterInfo)o;
-                       return pi.toString();
-               }));
-
-               // Field
-               list.add(Tuple2.of(Field.class, o -> {
-                       var f = (Field)o;
-                       return cns(f.getDeclaringClass()) + "." + f.getName();
-               }));
-
-               // Parameter
-               list.add(Tuple2.of(Parameter.class, o -> {
-                       var p = (Parameter)o;
+               list.add(readifier(ClassInfo.class, ClassInfo::toString));
+               list.add(readifier(ExecutableInfo.class, 
ExecutableInfo::toString));
+               list.add(readifier(FieldInfo.class, FieldInfo::toString));
+               list.add(readifier(ParameterInfo.class, 
ParameterInfo::toString));
+               list.add(readifier(Field.class, (Field f) -> 
cns(f.getDeclaringClass()) + "." + f.getName()));
+               list.add(readifier(Parameter.class, (Parameter p) -> {
                        var exec = p.getDeclaringExecutable();
                        var sb = new StringBuilder(64);
                        sb.append(exec instanceof Constructor ? 
cns(exec.getDeclaringClass()) : exec.getName()).append('[');

Reply via email to