This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-validator.git
The following commit(s) were added to refs/heads/master by this push: new 439d3d5 VALIDATOR-444 numbers > than maxvalue are Valid 439d3d5 is described below commit 439d3d5d372887ea92473f50f8b06b501eddf59d Author: Sebb <s...@apache.org> AuthorDate: Fri Jun 19 16:55:54 2020 +0100 VALIDATOR-444 numbers > than maxvalue are Valid Ensure isIntegerOnly is set correctly for non-fractional formats Can then simplify processParsedValue --- .../routines/AbstractNumberValidator.java | 5 ++++- .../commons/validator/routines/ByteValidator.java | 14 +++++++------ .../validator/routines/IntegerValidator.java | 14 +++++++------ .../commons/validator/routines/LongValidator.java | 3 ++- .../validator/routines/ByteValidatorTest.java | 20 +++++++++++++------ .../validator/routines/IntegerValidatorTest.java | 21 ++++++++++++++------ .../validator/routines/LongValidatorTest.java | 23 ++++++++++++++++------ 7 files changed, 68 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java b/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java index 8187b6e..f8c6cce 100644 --- a/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java @@ -198,7 +198,7 @@ public abstract class AbstractNumberValidator extends AbstractFormatValidator { formatter = new DecimalFormat(pattern, symbols); } - if (determineScale(formatter) == 0) { + if (!isAllowFractions()) { formatter.setParseIntegerOnly(true); } return formatter; @@ -267,6 +267,9 @@ public abstract class AbstractNumberValidator extends AbstractFormatValidator { } else { formatter = NumberFormat.getInstance(locale); } + if (!isAllowFractions()) { + formatter.setParseIntegerOnly(true); + } break; } return formatter; diff --git a/src/main/java/org/apache/commons/validator/routines/ByteValidator.java b/src/main/java/org/apache/commons/validator/routines/ByteValidator.java index c7d1153..fb638ff 100644 --- a/src/main/java/org/apache/commons/validator/routines/ByteValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/ByteValidator.java @@ -244,13 +244,15 @@ public class ByteValidator extends AbstractNumberValidator { @Override protected Object processParsedValue(Object value, Format formatter) { - long longValue = ((Number)value).longValue(); - - if (longValue < Byte.MIN_VALUE || - longValue > Byte.MAX_VALUE) { - return null; + // Parsed value will be Long if it fits in a long and is not fractional + if (value instanceof Long) { + long longValue = ((Long)value).longValue(); + if (longValue >= Byte.MIN_VALUE && + longValue <= Byte.MAX_VALUE) { + return Byte.valueOf((byte)longValue); + } } - return Byte.valueOf((byte)longValue); + return null; } } diff --git a/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java b/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java index 1f31c4f..eab42bd 100644 --- a/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java @@ -244,12 +244,14 @@ public class IntegerValidator extends AbstractNumberValidator { @Override protected Object processParsedValue(Object value, Format formatter) { - long longValue = ((Number)value).longValue(); - - if (longValue < Integer.MIN_VALUE || - longValue > Integer.MAX_VALUE) { - return null; + // Parsed value will be Long if it fits in a long and is not fractional + if (value instanceof Long) { + long longValue = ((Long)value).longValue(); + if (longValue >= Integer.MIN_VALUE && + longValue <= Integer.MAX_VALUE) { + return Integer.valueOf((int)longValue); + } } - return Integer.valueOf((int)longValue); + return null; } } diff --git a/src/main/java/org/apache/commons/validator/routines/LongValidator.java b/src/main/java/org/apache/commons/validator/routines/LongValidator.java index fc9cb6c..9aa9657 100644 --- a/src/main/java/org/apache/commons/validator/routines/LongValidator.java +++ b/src/main/java/org/apache/commons/validator/routines/LongValidator.java @@ -242,10 +242,11 @@ public class LongValidator extends AbstractNumberValidator { @Override protected Object processParsedValue(Object value, Format formatter) { + // Parsed value will be Long if it fits in a long and is not fractional if (value instanceof Long) { return value; } - return Long.valueOf(((Number)value).longValue()); + return null; } } diff --git a/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java index 7cfdc84..98c2ed0 100644 --- a/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java @@ -25,6 +25,14 @@ import java.util.Locale; */ public class ByteValidatorTest extends AbstractNumberValidatorTest { + private static final Byte BYTE_MIN_VAL = Byte.valueOf(Byte.MIN_VALUE); + private static final Byte BYTE_MAX_VAL = Byte.valueOf(Byte.MAX_VALUE); + private static final String BYTE_MAX = "127"; + private static final String BYTE_MAX_0 = "127.99999999999999999999999"; // force double rounding + private static final String BYTE_MAX_1 = "128"; + private static final String BYTE_MIN = "-128"; + private static final String BYTE_MIN_0 = "-128.99999999999999999999999"; // force double rounding"; + private static final String BYTE_MIN_1 = "-129"; /** * Constructor * @param name test name @@ -49,18 +57,18 @@ public class ByteValidatorTest extends AbstractNumberValidatorTest { minMinusOne = Long.valueOf(min.longValue() - 1); // testInvalidStrict() - invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2"}; + invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2", BYTE_MAX_1, BYTE_MIN_1, BYTE_MAX_0, BYTE_MIN_0}; // testInvalidNotStrict() - invalid = new String[] {null, "", "X", "X12"}; + invalid = new String[] {null, "", "X", "X12", BYTE_MAX_1, BYTE_MIN_1}; // testValid() testNumber = Byte.valueOf((byte)123); testZero = Byte.valueOf((byte)0); - validStrict = new String[] {"0", "123", ",123"}; - validStrictCompare = new Number[] {testZero, testNumber, testNumber}; - valid = new String[] {"0", "123", ",123", ",123.5", "123X"}; - validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber}; + validStrict = new String[] {"0", "123", ",123", BYTE_MAX, BYTE_MIN}; + validStrictCompare = new Number[] {testZero, testNumber, testNumber, BYTE_MAX_VAL, BYTE_MIN_VAL}; + valid = new String[] {"0", "123", ",123", ",123.5", "123X", BYTE_MAX, BYTE_MIN, BYTE_MAX_0, BYTE_MIN_0}; + validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber, BYTE_MAX_VAL, BYTE_MIN_VAL, BYTE_MAX_VAL, BYTE_MIN_VAL}; testStringUS = ",123"; testStringDE = ".123"; diff --git a/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java index 2a56be8..110ac47 100644 --- a/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java @@ -25,6 +25,15 @@ import java.util.Locale; */ public class IntegerValidatorTest extends AbstractNumberValidatorTest { + private static final Integer INT_MIN_VAL = Integer.valueOf(Integer.MIN_VALUE); + private static final Integer INT_MAX_VAL = Integer.valueOf(Integer.MAX_VALUE); + private static final String INT_MAX = "2147483647"; + private static final String INT_MAX_0 = "2147483647.99999999999999999999999"; // force double rounding + private static final String INT_MAX_1 = "2147483648"; + private static final String INT_MIN = "-2147483648"; + private static final String INT_MIN_0 = "-2147483648.99999999999999999999999"; // force double rounding"; + private static final String INT_MIN_1 = "-2147483649"; + /** * Constructor * @param name test name @@ -49,18 +58,18 @@ public class IntegerValidatorTest extends AbstractNumberValidatorTest { minMinusOne = Long.valueOf(min.longValue() - 1); // testInvalidStrict() - invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2"}; + invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2", INT_MAX_1, INT_MIN_1}; // testInvalidNotStrict() - invalid = new String[] {null, "", "X", "X12"}; + invalid = new String[] {null, "", "X", "X12", INT_MAX_1, INT_MIN_1}; // testValid() testNumber = Integer.valueOf(1234); testZero = Integer.valueOf(0); - validStrict = new String[] {"0", "1234", "1,234"}; - validStrictCompare = new Number[] {testZero, testNumber, testNumber}; - valid = new String[] {"0", "1234", "1,234", "1,234.5", "1234X"}; - validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber}; + validStrict = new String[] {"0", "1234", "1,234", INT_MAX, INT_MIN}; + validStrictCompare = new Number[] {testZero, testNumber, testNumber, INT_MAX_VAL, INT_MIN_VAL}; + valid = new String[] {"0", "1234", "1,234", "1,234.5", "1234X", INT_MAX, INT_MIN, INT_MAX_0, INT_MIN_0}; + validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber, INT_MAX_VAL, INT_MIN_VAL, INT_MAX_VAL, INT_MIN_VAL}; testStringUS = "1,234"; testStringDE = "1.234"; diff --git a/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java b/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java index 68114ae..3b8fe08 100644 --- a/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java +++ b/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java @@ -25,6 +25,16 @@ import java.util.Locale; */ public class LongValidatorTest extends AbstractNumberValidatorTest { + private static final Long LONG_MIN_VAL = Long.valueOf(Long.MIN_VALUE); + private static final Long LONG_MAX_VAL = Long.valueOf(Long.MAX_VALUE); + private static final String LONG_MAX = "9223372036854775807"; + private static final String LONG_MAX_0 = "9223372036854775807.99999999999999999999999"; // force double rounding + private static final String LONG_MAX_1 = "9223372036854775808"; + private static final String LONG_MIN = "-9223372036854775808"; + private static final String LONG_MIN_0 = "-9223372036854775808.99999999999999999999999"; // force double rounding + private static final String LONG_MIN_1 = "-9223372036854775809"; + + private static final String NINES = "9999999999999999999999999999999999999"; /** * Constructor * @param name test name @@ -48,19 +58,20 @@ public class LongValidatorTest extends AbstractNumberValidatorTest { min = null; minMinusOne = null; + // testInvalidStrict() - invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2"}; + invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", "1.2", LONG_MAX_1, LONG_MIN_1, NINES}; // testInvalidNotStrict() - invalid = new String[] {null, "", "X", "X12"}; + invalid = new String[] {null, "", "X", "X12", "", LONG_MAX_1, LONG_MIN_1, NINES}; // testValid() testNumber = Long.valueOf(1234); testZero = Long.valueOf(0); - validStrict = new String[] {"0", "1234", "1,234"}; - validStrictCompare = new Number[] {testZero, testNumber, testNumber}; - valid = new String[] {"0", "1234", "1,234", "1,234.5", "1234X"}; - validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber}; + validStrict = new String[] {"0", "1234", "1,234", LONG_MAX, LONG_MIN}; + validStrictCompare = new Number[] {testZero, testNumber, testNumber, LONG_MAX_VAL, LONG_MIN_VAL}; + valid = new String[] {"0", "1234", "1,234", "1,234.5", "1234X", LONG_MAX, LONG_MIN, LONG_MAX_0, LONG_MIN_0}; + validCompare = new Number[] {testZero, testNumber, testNumber, testNumber, testNumber, LONG_MAX_VAL, LONG_MIN_VAL, LONG_MAX_VAL, LONG_MIN_VAL}; testStringUS = "1,234"; testStringDE = "1.234";