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 6c40765f64 Replace Mutaters with BasicConverter
6c40765f64 is described below

commit 6c40765f644dfc9a8b9176494dbe7b240daac5d6
Author: James Bognar <[email protected]>
AuthorDate: Thu Apr 2 17:10:46 2026 -0700

    Replace Mutaters with BasicConverter
---
 .../juneau/commons/conversion/BasicConverter.java  | 10 ++-
 .../commons/conversion/CachingConverter.java       |  7 +-
 .../main/java/org/apache/juneau/BeanSession.java   | 74 +---------------------
 .../commons/conversion/BasicConverter_Test.java    |  4 +-
 4 files changed, 16 insertions(+), 79 deletions(-)

diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/BasicConverter.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/BasicConverter.java
index be3ef9bc9c..dc7f4f55f2 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/BasicConverter.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/BasicConverter.java
@@ -18,6 +18,7 @@ package org.apache.juneau.commons.conversion;
 
 import static org.apache.juneau.commons.reflect.ReflectionUtils.*;
 import static org.apache.juneau.commons.utils.StringUtils.*;
+import static org.apache.juneau.commons.utils.ThrowableUtils.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -271,10 +272,15 @@ public class BasicConverter extends CachingConverter {
                if (CharSequence.class.isAssignableFrom(inType))
                        return (in, memberOf, session, args) -> {
                                var s = in.toString();
-                               return s.length() == 1 ? (O) 
Character.valueOf(s.charAt(0)) : null;
+                               if (s.length() != 1)
+                                       throw illegalArg("Cannot convert string 
of length {0} to char: ''{1}''", s.length(), s);
+                               return (O) Character.valueOf(s.charAt(0));
                        };
                if (Number.class.isAssignableFrom(inType))
-                       return (in, memberOf, session, args) -> (O) 
Character.valueOf((char) ((Number) in).intValue());
+                       return (in, memberOf, session, args) -> {
+                               var s = in.toString();
+                               return s.isEmpty() ? null : (O) 
Character.valueOf(s.charAt(0));
+                       };
                return null;
        }
 
diff --git 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/CachingConverter.java
 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/CachingConverter.java
index bd1ef729b6..1b59c4ca11 100644
--- 
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/CachingConverter.java
+++ 
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/conversion/CachingConverter.java
@@ -94,7 +94,7 @@ public abstract class CachingConverter implements Converter {
         * @return The JVM zero/false default, or <jk>null</jk> if {@code type} 
is not a primitive.
         */
        @SuppressWarnings("unchecked")
-       private static <T> T primitiveDefault(Class<T> type) {
+       static <T> T primitiveDefault(Class<T> type) {
                if (type == Integer.TYPE)   return (T) Integer.valueOf(0);
                if (type == Long.TYPE)      return (T) Long.valueOf(0L);
                if (type == Double.TYPE)    return (T) Double.valueOf(0.0d);
@@ -272,6 +272,9 @@ public abstract class CachingConverter implements Converter 
{
                var fn = (Conversion<Object, T>) lookupConversion(inType, 
rawType);
                if (fn == null)
                        throw new InvalidConversionException(inType, rawType);
-               return fn.to(o, memberOf, session, argClasses);
+               var result = fn.to(o, memberOf, session, argClasses);
+               if (result == null && rawType.isPrimitive())
+                       return primitiveDefault(rawType);
+               return result;
        }
 }
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 cf2eec9673..6474edac54 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
@@ -1247,79 +1247,7 @@ public class BeanSession extends ContextSession 
implements ConverterSession {
                                return (T) 
Iso8601Utils.fromEpochMillis(((Number)value).longValue(), to, getTimeZone());
 
                        if (to.isPrimitive()) {
-                               if (to.isNumber()) {
-                                       if (from.isNumber()) {
-                                               var n = (Number)value;
-                                               if (tc == Integer.TYPE)
-                                                       return 
(T)Integer.valueOf(n.intValue());
-                                               if (tc == Short.TYPE)
-                                                       return 
(T)Short.valueOf(n.shortValue());
-                                               if (tc == Long.TYPE)
-                                                       return 
(T)Long.valueOf(n.longValue());
-                                               if (tc == Float.TYPE)
-                                                       return 
(T)Float.valueOf(n.floatValue());
-                                               if (tc == Double.TYPE)
-                                                       return 
(T)Double.valueOf(n.doubleValue());
-                                               if (tc == Byte.TYPE)
-                                                       return 
(T)Byte.valueOf(n.byteValue());
-                                       } else if (from.isBoolean()) {
-                                               var b = (Boolean)value;
-                                               boolean b2 = isTrue(b);
-                                               if (tc == Integer.TYPE)
-                                                       return 
(T)(Integer.valueOf(b2 ? 1 : 0));
-                                               if (tc == Short.TYPE)
-                                                       return 
(T)(Short.valueOf(b2 ? (short)1 : 0));
-                                               if (tc == Long.TYPE)
-                                                       return 
(T)(Long.valueOf(b2 ? 1L : 0));
-                                               if (tc == Float.TYPE)
-                                                       return 
(T)(Float.valueOf(b2 ? 1f : 0));
-                                               if (tc == Double.TYPE)
-                                                       return 
(T)(Double.valueOf(b2 ? 1d : 0));
-                                               if (tc == Byte.TYPE)
-                                                       return 
(T)(Byte.valueOf(b2 ? (byte)1 : 0));
-                                       } else if (isNullOrEmpty(value)) {
-                                               return to.getPrimitiveDefault();
-                                       } else {
-                                               var s = value.toString();
-                                               var multiplier = (tc == 
Integer.TYPE || tc == Short.TYPE || tc == Long.TYPE) ? getMultiplier(s) : 1;
-                                               if (multiplier != 1) {
-                                                       s = s.substring(0, 
s.length() - 1).trim();
-                                                       Long l = 
Long.valueOf(s) * multiplier;
-                                                       if (tc == Integer.TYPE)
-                                                               return 
(T)Integer.valueOf(l.intValue());
-                                                       if (tc == Short.TYPE)
-                                                               return 
(T)Short.valueOf(l.shortValue());
-                                                       if (tc == Long.TYPE)
-                                                               return (T)l;
-                                               } else {
-                                                       if (tc == Integer.TYPE)
-                                                               return 
(T)Integer.valueOf(s);
-                                                       if (tc == Short.TYPE)
-                                                               return 
(T)Short.valueOf(s);
-                                                       if (tc == Long.TYPE)
-                                                               return 
(T)Long.valueOf(s);
-                                                       if (tc == Float.TYPE)
-                                                               return 
(T)Float.valueOf(s);
-                                                       if (tc == Double.TYPE)
-                                                               return 
(T)Double.valueOf(s);
-                                                       if (tc == Byte.TYPE)
-                                                               return 
(T)Byte.valueOf(s);
-                                               }
-                                       }
-                               } else if (to.isChar()) {
-                                       if (isNullOrEmpty(value))
-                                               return to.getPrimitiveDefault();
-                                       return (T)parseCharacter(value);
-                               } else if (to.isBoolean()) {
-                                       if (from.isNumber()) {
-                                               var i = 
((Number)value).intValue();
-                                               return (T)(i == 0 ? 
Boolean.FALSE : Boolean.TRUE);
-                                       } else if (isNullOrEmpty(value)) {
-                                               return to.getPrimitiveDefault();
-                                       } else {
-                                               return 
(T)Boolean.valueOf(value.toString());
-                                       }
-                               }
+                               return ctxConverter.to(value, outer, this, 
to.innerType(), to.getParameters());
                        }
 
                        if (to.isNumber()) {
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/commons/conversion/BasicConverter_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/commons/conversion/BasicConverter_Test.java
index fc3a62993f..742dc647ad 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/commons/conversion/BasicConverter_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/commons/conversion/BasicConverter_Test.java
@@ -127,11 +127,11 @@ class BasicConverter_Test extends TestBase {
 
        @Test void c01_stringToChar() {
                assertEquals('A', C.to("A", Character.class));
-               assertNull(C.to("AB", Character.class));
+               assertThrows(IllegalArgumentException.class, () -> C.to("AB", 
Character.class));
        }
 
        @Test void c02_numberToChar() {
-               assertEquals('A', C.to(65, Character.class));
+               assertEquals('6', C.to(65, Character.class));
        }
 
        @Test void c03_primitiveChar() {

Reply via email to