Skip to content

Commit 428e283

Browse files
Avoid locale-dependent NumberFormat in IntegerSchema
Co-authored-by: jhannes <jhannes@users.noreply.github.com>
1 parent 1b76488 commit 428e283

2 files changed

Lines changed: 96 additions & 6 deletions

File tree

modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/IntegerSchema.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.swagger.v3.oas.models.media;
22

3-
import java.text.NumberFormat;
43
import java.util.Objects;
54

65
/**
@@ -34,13 +33,14 @@ public IntegerSchema _default(Number _default) {
3433
protected Number cast(Object value) {
3534
if (value != null) {
3635
try {
37-
Number casted = NumberFormat.getInstance().parse(value.toString());
38-
if (Integer.MIN_VALUE <= casted.longValue() && casted.longValue() <= Integer.MAX_VALUE) {
39-
return Integer.parseInt(value.toString());
36+
String stringValue = value.toString();
37+
long casted = Long.parseLong(stringValue);
38+
if (withinIntegerBounds(casted)) {
39+
return Integer.parseInt(stringValue);
4040
} else {
41-
return Long.parseLong(value.toString());
41+
return casted;
4242
}
43-
} catch (Exception e) {
43+
} catch (Exception ignored) {
4444
}
4545
}
4646
return null;
@@ -75,4 +75,8 @@ public String toString() {
7575
sb.append("}");
7676
return sb.toString();
7777
}
78+
79+
private boolean withinIntegerBounds(long value) {
80+
return Integer.MIN_VALUE <= value && value <= Integer.MAX_VALUE;
81+
}
7882
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package io.swagger.v3.oas.models.media;
2+
3+
import org.testng.annotations.Test;
4+
5+
import java.util.Locale;
6+
7+
import static org.testng.Assert.*;
8+
9+
public class IntegerSchemaTest {
10+
11+
private static final IntegerSchema INTEGER_SCHEMA = new IntegerSchema();
12+
private static final Locale SWEDISH_LOCALE = new Locale("se");
13+
private static final String INTEGER_STRING = "123";
14+
private static final String LONG_STRING = "1111111111111111111";
15+
private static final String NEGATIVE_INTEGER = "-123";
16+
private static final String INTEGER_WITH_SPACE_THOUSAND_SEPARATOR = "2 000";
17+
private static final String INTEGER_WITH_DECIMAL_THOUSAND_SEPARATOR = "2.000";
18+
private static final String INTEGER_WITH_COMMA_THOUSAND_SEPARATOR = "2,000";
19+
private static final Integer NUMBER = 123;
20+
private static final Integer NEGATIVE_NUMBER = -123;
21+
private static final Long LONG = 1111111111111111111L;
22+
23+
@Test
24+
public void testCastInteger() {
25+
assertEquals(INTEGER_SCHEMA.cast(INTEGER_STRING), NUMBER);
26+
}
27+
28+
@Test
29+
public void testCastLong() {
30+
assertEquals(INTEGER_SCHEMA.cast(LONG_STRING), LONG);
31+
}
32+
33+
@Test
34+
public void testCastNegativeInteger() {
35+
assertEquals(INTEGER_SCHEMA.cast(NEGATIVE_INTEGER), NEGATIVE_NUMBER);
36+
}
37+
38+
@Test
39+
public void testCastIntegerWithSpaceThousandSeparatorFailsWithNull() {
40+
assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_SPACE_THOUSAND_SEPARATOR));
41+
}
42+
43+
@Test
44+
public void testCastIntegerWithDecimalThousandSeparatorFailsWithNull() {
45+
assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_DECIMAL_THOUSAND_SEPARATOR));
46+
}
47+
48+
@Test
49+
public void testCastIntegerWithCommaThousandSeparatorFailsWithNull() {
50+
assertNull(INTEGER_SCHEMA.cast(INTEGER_WITH_COMMA_THOUSAND_SEPARATOR));
51+
}
52+
53+
@Test
54+
public void testCastIntegerWithSwedishLocale() {
55+
Locale defaultLocale = Locale.getDefault();
56+
try {
57+
Locale.setDefault(SWEDISH_LOCALE);
58+
assertEquals(new IntegerSchema().cast(INTEGER_STRING), NUMBER);
59+
} finally {
60+
Locale.setDefault(defaultLocale);
61+
}
62+
}
63+
64+
@Test
65+
public void testCastLongWithSwedishLocale() {
66+
Locale defaultLocale = Locale.getDefault();
67+
try {
68+
Locale.setDefault(SWEDISH_LOCALE);
69+
assertEquals(new IntegerSchema().cast(LONG_STRING), LONG);
70+
} finally {
71+
Locale.setDefault(defaultLocale);
72+
}
73+
}
74+
75+
@Test
76+
public void testCastNegativeIntegerWithSwedishLocale() {
77+
Locale defaultLocale = Locale.getDefault();
78+
try {
79+
Locale.setDefault(SWEDISH_LOCALE);
80+
assertEquals(new IntegerSchema().cast(NEGATIVE_INTEGER), NEGATIVE_NUMBER);
81+
} finally {
82+
Locale.setDefault(defaultLocale);
83+
}
84+
}
85+
86+
}

0 commit comments

Comments
 (0)