Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit a152f5a

Browse files
authored
Java, adjusts schema validator argument order (#284)
* Fixes schema validator call site * Fixes format tests
1 parent 1b2026c commit a152f5a

28 files changed

Lines changed: 404 additions & 352 deletions

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,17 @@ static PathToSchemasMap validate(
5757
Class<SchemaValidator> castSchemaCls = (Class<SchemaValidator>) schemaCls;
5858
for (Map.Entry<String, Object> entry: fieldsToValues.entrySet()) {
5959
String jsonKeyword = entry.getKey();
60-
Object value = entry.getValue();
60+
Object constraint = entry.getValue();
6161
if (jsonKeyword.equals("additionalProperties") && fieldsToValues.containsKey("properties")) {
6262
extra = fieldsToValues.get("properties");
6363
}
6464
KeywordValidator validatorClass = keywordToValidator.get(jsonKeyword);
6565
PathToSchemasMap otherPathToSchemas = validatorClass.validate(
66-
arg,
67-
value,
68-
extra,
6966
castSchemaCls,
70-
validationMetadata
67+
arg,
68+
constraint,
69+
validationMetadata,
70+
extra
7171
);
7272
if (otherPathToSchemas == null) {
7373
continue;

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/AdditionalPropertiesValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414

1515
public class AdditionalPropertiesValidator implements KeywordValidator {
1616
@Override
17-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
17+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
1818
if (!(arg instanceof Map)) {
1919
return null;
2020
}
2121
Map<String, Object> castArg = (Map<String, Object>) arg;
22-
Class<Schema> addPropSchema = (Class<Schema>) value;
22+
Class<Schema> addPropSchema = (Class<Schema>) constraint;
2323
Map<String, Class<Schema>> properties = (Map<String, Class<Schema>>) extra;
2424
if (properties == null) {
2525
properties = new LinkedHashMap<>();

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/FormatValidator.java

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,78 @@
66
import org.openapijsonschematools.schemas.ValidationMetadata;
77

88
import java.math.BigDecimal;
9+
import java.math.BigInteger;
910
import java.time.format.DateTimeParseException;
1011
import java.util.UUID;
1112

1213
public class FormatValidator implements KeywordValidator {
13-
private final static BigDecimal int32InclusiveMinimum = BigDecimal.valueOf(-2147483648);
14-
private final static BigDecimal int32InclusiveMaximum = BigDecimal.valueOf(2147483647);
15-
private final static BigDecimal int64InclusiveMinimum = BigDecimal.valueOf(-9223372036854775808L);
16-
private final static BigDecimal int64InclusiveMaximum = BigDecimal.valueOf(9223372036854775807L);
14+
private final static BigInteger int32InclusiveMinimum = BigInteger.valueOf(-2147483648L);
15+
private final static BigInteger int32InclusiveMaximum = BigInteger.valueOf(2147483647L);
16+
private final static BigInteger int64InclusiveMinimum = BigInteger.valueOf(-9223372036854775808L);
17+
private final static BigInteger int64InclusiveMaximum = BigInteger.valueOf(9223372036854775807L);
1718
private final static BigDecimal floatInclusiveMinimum = BigDecimal.valueOf(-3.4028234663852886e+38);
1819
private final static BigDecimal floatInclusiveMaximum = BigDecimal.valueOf(3.4028234663852886e+38);
1920
private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d);
2021
private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d);
2122

22-
private Void validateNumericFormat(BigDecimal arg, String format, ValidationMetadata validationMetadata) {
23+
private Void validateNumericFormat(Number arg, String format, ValidationMetadata validationMetadata) {
2324
if (format.startsWith("int")) {
2425
// there is a json schema test where 1.0 validates as an integer
25-
if (arg.stripTrailingZeros().scale() > 0) {
26-
throw new RuntimeException(
27-
"Invalid non-integer value " + arg + " for format " + format + " at " + validationMetadata.pathToItem()
28-
);
26+
BigInteger intArg;
27+
if (arg instanceof Float || arg instanceof Double) {
28+
Double doubleArg = (Double) arg;
29+
if (Math.floor((Double) arg) != doubleArg) {
30+
throw new RuntimeException(
31+
"Invalid non-integer value " + arg + " for format " + format + " at " + validationMetadata.pathToItem()
32+
);
33+
}
34+
if (arg instanceof Float) {
35+
Integer smallInt = Math.round((Float) arg);
36+
intArg = BigInteger.valueOf(smallInt.longValue());
37+
} else {
38+
intArg = BigInteger.valueOf(Math.round((Double) arg));
39+
}
40+
} else if (arg instanceof Integer) {
41+
intArg = BigInteger.valueOf(arg.longValue());
42+
} else if (arg instanceof Long) {
43+
intArg = BigInteger.valueOf((Long) arg);
44+
} else {
45+
intArg = (BigInteger) arg;
2946
}
3047
if (format.equals("int32")) {
31-
if (arg.compareTo(int32InclusiveMinimum) < 0 || arg.compareTo(int32InclusiveMaximum) > 0 ){
48+
if (intArg.compareTo(int32InclusiveMinimum) < 0 || intArg.compareTo(int32InclusiveMaximum) > 0) {
3249
throw new RuntimeException(
33-
"Invalid value "+arg+" for format int32 at "+validationMetadata.pathToItem()
50+
"Invalid value " + arg + " for format int32 at " + validationMetadata.pathToItem()
3451
);
3552
}
3653
return null;
3754
} else if (format.equals("int64")) {
38-
if (arg.compareTo(int64InclusiveMinimum) < 0 || arg.compareTo(int64InclusiveMaximum) > 0 ){
55+
if (intArg.compareTo(int64InclusiveMinimum) < 0 || intArg.compareTo(int64InclusiveMaximum) > 0) {
3956
throw new RuntimeException(
40-
"Invalid value "+arg+" for format int64 at "+validationMetadata.pathToItem()
57+
"Invalid value " + arg + " for format int64 at " + validationMetadata.pathToItem()
4158
);
4259
}
4360
return null;
4461
}
4562
return null;
46-
} else if (format.equals("float")) {
47-
if (arg.compareTo(floatInclusiveMinimum) < 0 || arg.compareTo(floatInclusiveMaximum) > 0 ){
63+
}
64+
BigDecimal decimalArg;
65+
if (arg instanceof Float) {
66+
decimalArg = new BigDecimal((Float) arg);
67+
} else if (arg instanceof Double) {
68+
decimalArg = BigDecimal.valueOf((Double) arg);
69+
} else {
70+
decimalArg = (BigDecimal) arg;
71+
}
72+
if (format.equals("float")) {
73+
if (decimalArg.compareTo(floatInclusiveMinimum) < 0 || decimalArg.compareTo(floatInclusiveMaximum) > 0 ){
4874
throw new RuntimeException(
4975
"Invalid value "+arg+" for format float at "+validationMetadata.pathToItem()
5076
);
5177
}
5278
return null;
5379
} else if (format.equals("double")) {
54-
if (arg.compareTo(doubleInclusiveMinimum) < 0 || arg.compareTo(doubleInclusiveMaximum) > 0 ){
80+
if (decimalArg.compareTo(doubleInclusiveMinimum) < 0 || decimalArg.compareTo(doubleInclusiveMaximum) > 0 ){
5581
throw new RuntimeException(
5682
"Invalid value "+arg+" for format double at "+validationMetadata.pathToItem()
5783
);
@@ -107,11 +133,11 @@ private Void validateStringFormat(String arg, String format, ValidationMetadata
107133
}
108134

109135
@Override
110-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
111-
String format = (String) value;
112-
if (arg instanceof BigDecimal) {
136+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
137+
String format = (String) constraint;
138+
if (arg instanceof Number) {
113139
validateNumericFormat(
114-
(BigDecimal) arg,
140+
(Number) arg,
115141
format,
116142
validationMetadata
117143
);

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/ItemsValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010

1111
public class ItemsValidator implements KeywordValidator {
1212
@Override
13-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
13+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
1414
if (!(arg instanceof List)) {
1515
return null;
1616
}
1717
List<Object> castArg = (List<Object>) arg;
18-
Class<Schema> itemsSchema = (Class<Schema>) value;
18+
Class<Schema> itemsSchema = (Class<Schema>) constraint;
1919
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
2020
// todo add handling for prefixItems
2121
int i = 0;

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
public interface KeywordValidator {
88
PathToSchemasMap validate(
9-
Object arg,
10-
Object value,
11-
Object extra,
129
Class<SchemaValidator> cls,
13-
ValidationMetadata validationMetadata);
10+
Object arg,
11+
Object constraint,
12+
ValidationMetadata validationMetadata,
13+
Object extra);
1414
}

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/PropertiesValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313

1414
public class PropertiesValidator implements KeywordValidator {
1515
@Override
16-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
16+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
1717
if (!(arg instanceof Map)) {
1818
return null;
1919
}
2020
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
2121
Map<String, Object> castArg = (Map<String, Object>) arg;
22-
Map<String, Class<Schema>> properties = (Map<String, Class<Schema>>) value;
22+
Map<String, Class<Schema>> properties = (Map<String, Class<Schema>>) constraint;
2323
Set<String> presentProperties = new LinkedHashSet<>(castArg.keySet());
2424
presentProperties.retainAll(properties.keySet());
2525
for(String propName: presentProperties) {

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/RequiredValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111

1212
public class RequiredValidator implements KeywordValidator {
1313
@Override
14-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
14+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
1515
if (!(arg instanceof Map)) {
1616
return null;
1717
}
1818
Map<String, Object> castArg = (Map<String, Object>) arg;
19-
Set<String> requiredProperties = (Set<String>) value;
19+
Set<String> requiredProperties = (Set<String>) constraint;
2020
Set<String> missingRequiredProperties = new HashSet<>(requiredProperties);
2121
missingRequiredProperties.removeAll(castArg.keySet());
2222
if (!missingRequiredProperties.isEmpty()) {

samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
public class TypeValidator implements KeywordValidator {
1010
@Override
11-
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
12-
HashSet<Class<?>> types = (HashSet<Class<?>>) value;
11+
public PathToSchemasMap validate(Class<SchemaValidator> cls, Object arg, Object constraint, ValidationMetadata validationMetadata, Object extra) {
12+
HashSet<Class<?>> types = (HashSet<Class<?>>) constraint;
1313
Class<?> argClass;
1414
if (arg == null) {
1515
argClass = Void.class;

samples/client/petstore/java/src/test/java/org/openapijsonschematools/schemas/validators/AdditionalPropertiesValidatorTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public void testCorrectPropertySucceeds() {
3737
FrozenMap<String, Object> arg = new FrozenMap<>(mutableMap);
3838
final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator();
3939
PathToSchemasMap pathToSchemas = validator.validate(
40+
SchemaValidator.class,
4041
arg,
4142
StringSchema.class,
42-
properties,
43-
SchemaValidator.class,
44-
validationMetadata
43+
validationMetadata,
44+
properties
4545
);
4646
List<Object> expectedPathToItem = new ArrayList<>();
4747
expectedPathToItem.add("args[0]");
@@ -66,11 +66,11 @@ public void testNotApplicableTypeReturnsNull() {
6666
);
6767
final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator();
6868
PathToSchemasMap pathToSchemas = validator.validate(
69+
SchemaValidator.class,
6970
1,
7071
StringSchema.class,
71-
null,
72-
SchemaValidator.class,
73-
validationMetadata
72+
validationMetadata,
73+
null
7474
);
7575
Assert.assertNull(pathToSchemas);
7676
}
@@ -94,11 +94,11 @@ public void testIncorrectPropertyValueFails() {
9494
FrozenMap<String, Object> arg = new FrozenMap<>(mutableMap);
9595
final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator();
9696
Assert.assertThrows(RuntimeException.class, () -> validator.validate(
97+
SchemaValidator.class,
9798
arg,
9899
StringSchema.class,
99-
properties,
100-
SchemaValidator.class,
101-
validationMetadata
100+
validationMetadata,
101+
properties
102102
));
103103
}
104104
}

0 commit comments

Comments
 (0)