From 5a222d9af1c0486aa6ebe8586a7c3731247a6043 Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Wed, 25 Feb 2026 09:43:55 -0800 Subject: [PATCH 1/3] Make ConvertHelper.convert() return the same success result as ConvertUtils.convert(). --- .../org/labkey/api/data/ConvertHelper.java | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/api/src/org/labkey/api/data/ConvertHelper.java b/api/src/org/labkey/api/data/ConvertHelper.java index f5a54363ccb..7f1a722146a 100644 --- a/api/src/org/labkey/api/data/ConvertHelper.java +++ b/api/src/org/labkey/api/data/ConvertHelper.java @@ -791,16 +791,24 @@ else if (value instanceof Number n) } } - /** Simple genericized wrapper around ConvertUtils.convert(). Also handles calling toString() on value, if non-null */ + + /** Genericized wrapper around ConvertUtils.convert(). */ public static T convert(Object value, Class cl) { - if (value == null) - { + var ret = ConvertUtils.convert(value, cl); + if (ret == null) return null; + try + { + return cl.cast(ret); + } + catch (ClassCastException ex) + { + throw new ConversionException("Could not convert value to " + cl.getSimpleName()); } - return (T)ConvertUtils.convert(value.toString(), cl); } + public static SimpleConvert getSimpleConvert(Class targetType) { // ConvertUtils handling String.class and String[].class depends on the source type, @@ -1060,6 +1068,33 @@ public Object convert(Class type, Object value) public static class TestCase extends Assert { + @Test + public void testConvertHelperEqualsConvertUtils() + { + { + // ConvertHelper used to call toString() which would break this test + var a = ConvertHelper.convert("a,b,c", String[].class); + assert a instanceof String[] arr && arr.length == 3; + var b = ConvertHelper.convert(a, String[].class); + assertArrayEquals(a, b); + } + + { + var a = ConvertUtils.convert("a,b,c", String[].class); + assert a instanceof String[] arr && arr.length == 3; + var b = ConvertUtils.convert(a, String[].class); + assertArrayEquals((String [])a, (String [])b); + } + + { + // ConvertHelper used to short-circuit null which would break this test + var a = ConvertUtils.convert((String)null, MultiChoice.Array.class); + var b = ConvertHelper.convert(null, MultiChoice.Array.class); + assertEquals(a,b); + } + } + + @Test public void testConvertTimestamp() { From af746ed89c09775cb4ee46e230604ef46ea33d23 Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Wed, 25 Feb 2026 11:34:22 -0800 Subject: [PATCH 2/3] Strict argument type check for running remote tests --- api/src/org/labkey/api/data/ConvertHelper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/org/labkey/api/data/ConvertHelper.java b/api/src/org/labkey/api/data/ConvertHelper.java index 7f1a722146a..e5e4b45e5a5 100644 --- a/api/src/org/labkey/api/data/ConvertHelper.java +++ b/api/src/org/labkey/api/data/ConvertHelper.java @@ -804,6 +804,9 @@ public static T convert(Object value, Class cl) } catch (ClassCastException ex) { + // for testing let's blow up dramatically here + if (cl.isPrimitive()) + throw new IllegalArgumentException("primitive type is not allowed: " + cl.getName()); throw new ConversionException("Could not convert value to " + cl.getSimpleName()); } } From 2ce5d39b33e7412cada7c329afec84a7e9f23467 Mon Sep 17 00:00:00 2001 From: labkey-matthewb Date: Thu, 26 Feb 2026 10:23:35 -0800 Subject: [PATCH 3/3] additional assert --- api/src/org/labkey/api/data/ConvertHelper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/org/labkey/api/data/ConvertHelper.java b/api/src/org/labkey/api/data/ConvertHelper.java index e5e4b45e5a5..516c30dbc57 100644 --- a/api/src/org/labkey/api/data/ConvertHelper.java +++ b/api/src/org/labkey/api/data/ConvertHelper.java @@ -1093,6 +1093,7 @@ public void testConvertHelperEqualsConvertUtils() // ConvertHelper used to short-circuit null which would break this test var a = ConvertUtils.convert((String)null, MultiChoice.Array.class); var b = ConvertHelper.convert(null, MultiChoice.Array.class); + assertNotNull(a); assertEquals(a,b); } }