This is an automated email from the ASF dual-hosted git repository. joewitt pushed a commit to branch support/nifi-1.13 in repository https://gitbox.apache.org/repos/asf/nifi.git
commit eb0442cbe497313ca5402d981bf8b4e85bac3f09 Author: Matthew Burgess <[email protected]> AuthorDate: Wed Mar 10 12:32:06 2021 -0500 NIFI-8297: Report incompatible value if it doesn't fit in an Integer Signed-off-by: Pierre Villard <[email protected]> This closes #4886. --- .../nifi/serialization/record/util/DataTypeUtils.java | 8 ++++++++ .../nifi/serialization/record/TestDataTypeUtils.java | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java index 61e50ff..ede3475 100644 --- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java +++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/util/DataTypeUtils.java @@ -1598,6 +1598,14 @@ public class DataTypeUtils { } public static boolean isIntegerTypeCompatible(final Object value) { + if (value instanceof Number) { + try { + Math.toIntExact(((Number) value).longValue()); + return true; + } catch (ArithmeticException ae) { + return false; + } + } return isNumberTypeCompatible(value, s -> isIntegral(s, Integer.MIN_VALUE, Integer.MAX_VALUE)); } diff --git a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java index c89e656..a493609 100644 --- a/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java +++ b/nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/TestDataTypeUtils.java @@ -430,6 +430,22 @@ public class TestDataTypeUtils { } @Test + public void testIsCompatibleDataTypeInteger() { + final DataType dataType = RecordFieldType.INT.getDataType(); + assertTrue(DataTypeUtils.isCompatibleDataType(new Integer("1234567"), dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType("1234567", dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(new BigInteger("12345678901234567890"), dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(1234567890123456789L, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(1, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType((short) 1, dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType("12345678901234567890", dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(3.1f, dataType)); + assertTrue(DataTypeUtils.isCompatibleDataType(3.0, dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType("1234567XYZ", dataType)); + assertFalse(DataTypeUtils.isCompatibleDataType(new Long[]{1L, 2L}, dataType)); + } + + @Test public void testIsCompatibleDataTypeArrayDifferentElementTypes() { Object[] array = new Object[]{"2", 1}; assertTrue(DataTypeUtils.isCompatibleDataType(array, RecordFieldType.ARRAY.getArrayDataType(RecordFieldType.INT.getDataType())));
