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() {