diff --git a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/IntegerSchema.java b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/IntegerSchema.java index 75a09bcf8b..c7e63cd94f 100644 --- a/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/IntegerSchema.java +++ b/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/IntegerSchema.java @@ -1,6 +1,5 @@ package io.swagger.v3.oas.models.media; -import java.text.NumberFormat; import java.util.Objects; /** @@ -34,13 +33,14 @@ public IntegerSchema _default(Number _default) { protected Number cast(Object value) { if (value != null) { try { - Number casted = NumberFormat.getInstance().parse(value.toString()); - if (Integer.MIN_VALUE <= casted.longValue() && casted.longValue() <= Integer.MAX_VALUE) { - return Integer.parseInt(value.toString()); + String stringValue = value.toString(); + long casted = Long.parseLong(stringValue); + if (withinIntegerBounds(casted)) { + return Integer.parseInt(stringValue); } else { - return Long.parseLong(value.toString()); + return casted; } - } catch (Exception e) { + } catch (Exception ignored) { } } return null; @@ -75,4 +75,8 @@ public String toString() { sb.append("}"); return sb.toString(); } + + private boolean withinIntegerBounds(long value) { + return Integer.MIN_VALUE <= value && value <= Integer.MAX_VALUE; + } } diff --git a/modules/swagger-models/src/test/java/io/swagger/v3/oas/models/media/IntegerSchemaTest.java b/modules/swagger-models/src/test/java/io/swagger/v3/oas/models/media/IntegerSchemaTest.java new file mode 100644 index 0000000000..5389df42ea --- /dev/null +++ b/modules/swagger-models/src/test/java/io/swagger/v3/oas/models/media/IntegerSchemaTest.java @@ -0,0 +1,86 @@ +package io.swagger.v3.oas.models.media; + +import org.testng.annotations.Test; + +import java.util.Locale; + +import static org.testng.Assert.*; + +public class IntegerSchemaTest { + + private static final IntegerSchema INTEGER_SCHEMA = new IntegerSchema(); + private static final Locale SWEDISH_LOCALE = new Locale("se"); + private static final String INTEGER_STRING = "123"; + private static final String LONG_STRING = "1111111111111111111"; + private static final String NEGATIVE_INTEGER = "-123"; + private static final String INTEGER_WITH_SPACE_THOUSAND_SEPARATOR = "2 000"; + private static final String INTEGER_WITH_DECIMAL_THOUSAND_SEPARATOR = "2.000"; + private static final String INTEGER_WITH_COMMA_THOUSAND_SEPARATOR = "2,000"; + private static final Integer NUMBER = 123; + private static final Integer NEGATIVE_NUMBER = -123; + private static final Long LONG = 1111111111111111111L; + + @Test + public void testCastInteger() { + assertEquals(INTEGER_SCHEMA.cast(INTEGER_STRING), NUMBER); + } + + @Test + public void testCastLong() { + assertEquals(INTEGER_SCHEMA.cast(LONG_STRING), LONG); + } + + @Test + public void testCastNegativeInteger() { + assertEquals(INTEGER_SCHEMA.cast(NEGATIVE_INTEGER), NEGATIVE_NUMBER); + } + + @Test + public void testCastIntegerWithSpaceThousandSeparatorFailsWithNull() { + assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_SPACE_THOUSAND_SEPARATOR)); + } + + @Test + public void testCastIntegerWithDecimalThousandSeparatorFailsWithNull() { + assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_DECIMAL_THOUSAND_SEPARATOR)); + } + + @Test + public void testCastIntegerWithCommaThousandSeparatorFailsWithNull() { + assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_COMMA_THOUSAND_SEPARATOR)); + } + + @Test + public void testCastIntegerWithSwedishLocale() { + Locale defaultLocale = Locale.getDefault(); + try { + Locale.setDefault(SWEDISH_LOCALE); + assertEquals(new IntegerSchema().cast(INTEGER_STRING), NUMBER); + } finally { + Locale.setDefault(defaultLocale); + } + } + + @Test + public void testCastLongWithSwedishLocale() { + Locale defaultLocale = Locale.getDefault(); + try { + Locale.setDefault(SWEDISH_LOCALE); + assertEquals(new IntegerSchema().cast(LONG_STRING), LONG); + } finally { + Locale.setDefault(defaultLocale); + } + } + + @Test + public void testCastNegativeIntegerWithSwedishLocale() { + Locale defaultLocale = Locale.getDefault(); + try { + Locale.setDefault(SWEDISH_LOCALE); + assertEquals(new IntegerSchema().cast(NEGATIVE_INTEGER), NEGATIVE_NUMBER); + } finally { + Locale.setDefault(defaultLocale); + } + } + +} \ No newline at end of file