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

Commit 73aa768

Browse files
authored
Java, refactoring to simplify schema validate (#370)
* Updates many validators to accept a single input * Updates remaining keywordValidators * Fixes enum validator * Adds vars to fix nullness checks * Fixes TypeValidatorTest * Fixes AdditionalPropertiesValidatorTest * Fixes PropertiesValidatorTest * Updates ItemsValidatorTest * Updates FormatValidatorTest * Extracts getContainsPathToSchemas * Extracts getPatternPropertiesPathToSchemas * Extracts getIfPathToSchemas * Updates 5 validators * Fixes AdditionalPropertiesValidatorTest * Updates ItemsValidatorTest * Updates RequiredValidatorTest * Updates TypeValidatorTest * Updates PropertiesValidatorTest * Adds final modifers to schema data * Adds functionalinterface annotation * Samples regen
1 parent 2f3ff01 commit 73aa768

File tree

176 files changed

+3428
-4936
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+3428
-4936
lines changed

samples/client/3_0_3_unit_test/java/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMe
271271
src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java
272272
src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java
273273
src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java
274+
src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java
274275
src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java
275276
src/main/java/org/openapijsonschematools/client/servers/Server0.java
276277
src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,15 @@
88
import java.util.Set;
99

1010
public class AdditionalPropertiesValidator implements KeywordValidator {
11-
public final Class<? extends JsonSchema> additionalProperties;
12-
13-
public AdditionalPropertiesValidator(Class<? extends JsonSchema> additionalProperties) {
14-
this.additionalProperties = additionalProperties;
15-
}
16-
1711
@Override
1812
public @Nullable PathToSchemasMap validate(
19-
JsonSchema schema,
20-
@Nullable Object arg,
21-
ValidationMetadata validationMetadata,
22-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
23-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
24-
@Nullable PathToSchemasMap ifPathToSchemas
13+
ValidationData data
2514
) {
26-
if (!(arg instanceof Map<?, ?> mapArg)) {
15+
if (!(data.arg() instanceof Map<?, ?> mapArg)) {
16+
return null;
17+
}
18+
var additionalProperties = data.schema().additionalProperties;
19+
if (additionalProperties == null) {
2720
return null;
2821
}
2922
Set<String> presentAdditionalProperties = new LinkedHashSet<>();
@@ -32,22 +25,23 @@ public AdditionalPropertiesValidator(Class<? extends JsonSchema> additionalPrope
3225
presentAdditionalProperties.add((String) key);
3326
}
3427
}
35-
if (schema.properties != null) {
36-
presentAdditionalProperties.removeAll(schema.properties.keySet());
28+
var properties = data.schema().properties;
29+
if (properties != null) {
30+
presentAdditionalProperties.removeAll(properties.keySet());
3731
}
3832
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
3933
for(String addPropName: presentAdditionalProperties) {
4034
@Nullable Object propValue = mapArg.get(addPropName);
41-
List<Object> propPathToItem = new ArrayList<>(validationMetadata.pathToItem());
35+
List<Object> propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem());
4236
propPathToItem.add(addPropName);
43-
if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) {
37+
if (data.patternPropertiesPathToSchemas() != null && data.patternPropertiesPathToSchemas().containsKey(propPathToItem)) {
4438
continue;
4539
}
4640
ValidationMetadata propValidationMetadata = new ValidationMetadata(
4741
propPathToItem,
48-
validationMetadata.configuration(),
49-
validationMetadata.validatedPathToSchemas(),
50-
validationMetadata.seenClasses()
42+
data.validationMetadata().configuration(),
43+
data.validationMetadata().validatedPathToSchemas(),
44+
data.validationMetadata().seenClasses()
5145
);
5246
JsonSchema addPropsSchema = JsonSchemaFactory.getInstance(additionalProperties);
5347
if (propValidationMetadata.validationRanEarlier(addPropsSchema)) {
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,21 @@
11
package org.openapijsonschematools.client.schemas.validation;
22
import org.checkerframework.checker.nullness.qual.Nullable;
33

4-
import java.util.List;
5-
64
public class AllOfValidator implements KeywordValidator {
7-
public final List<Class<? extends JsonSchema>> allOf;
8-
9-
public AllOfValidator(List<Class<? extends JsonSchema>> allOf) {
10-
this.allOf = allOf;
11-
}
12-
135
@Override
146
public @Nullable PathToSchemasMap validate(
15-
JsonSchema schema,
16-
@Nullable Object arg,
17-
ValidationMetadata validationMetadata,
18-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
19-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
20-
@Nullable PathToSchemasMap ifPathToSchemas
7+
ValidationData data
218
) {
9+
var allOf = data.schema().allOf;
10+
if (allOf == null) {
11+
return null;
12+
}
2213
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
2314
for(Class<? extends JsonSchema> allOfClass: allOf) {
2415
JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass);
25-
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, arg, validationMetadata);
16+
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, data.arg(), data.validationMetadata());
2617
pathToSchemas.update(otherPathToSchemas);
2718
}
2819
return pathToSchemas;
2920
}
30-
31-
3221
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,18 @@
77
import java.util.List;
88

99
public class AnyOfValidator implements KeywordValidator {
10-
public final List<Class<? extends JsonSchema>> anyOf;
11-
12-
public AnyOfValidator(List<Class<? extends JsonSchema>> anyOf) {
13-
this.anyOf = anyOf;
14-
}
15-
1610
@Override
1711
public @Nullable PathToSchemasMap validate(
18-
JsonSchema schema,
19-
@Nullable Object arg,
20-
ValidationMetadata validationMetadata,
21-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
22-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
23-
@Nullable PathToSchemasMap ifPathToSchemas
12+
ValidationData data
2413
) {
14+
var anyOf = data.schema().anyOf;
15+
if (anyOf == null) {
16+
return null;
17+
}
2518
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
2619
List<Class<? extends JsonSchema>> validatedAnyOfClasses = new ArrayList<>();
2720
for(Class<? extends JsonSchema> anyOfClass: anyOf) {
28-
if (anyOfClass == schema.getClass()) {
21+
if (anyOfClass == data.schema().getClass()) {
2922
/*
3023
optimistically assume that schema will pass validation
3124
do not invoke _validate on it because that is recursive
@@ -35,15 +28,15 @@ public AnyOfValidator(List<Class<? extends JsonSchema>> anyOf) {
3528
}
3629
try {
3730
JsonSchema anyOfSchema = JsonSchemaFactory.getInstance(anyOfClass);
38-
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, arg, validationMetadata);
31+
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, data.arg(), data.validationMetadata());
3932
validatedAnyOfClasses.add(anyOfClass);
4033
pathToSchemas.update(otherPathToSchemas);
4134
} catch (ValidationException e) {
4235
// silence exceptions because the code needs to accumulate anyof_classes
4336
}
4437
}
4538
if (validatedAnyOfClasses.isEmpty()) {
46-
throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+
39+
throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+
4740
"of the anyOf schemas matched the input data."
4841
);
4942
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,30 @@
44
import org.checkerframework.checker.nullness.qual.Nullable;
55

66
import java.math.BigDecimal;
7-
import java.util.List;
87
import java.util.Objects;
98

109
public class ConstValidator extends BigDecimalValidator implements KeywordValidator {
11-
public final @Nullable Object constValue;
12-
13-
public ConstValidator(@Nullable Object constValue) {
14-
this.constValue = constValue;
15-
}
16-
1710
@Override
1811
public @Nullable PathToSchemasMap validate(
19-
JsonSchema schema,
20-
@Nullable Object arg,
21-
ValidationMetadata validationMetadata,
22-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
23-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
24-
@Nullable PathToSchemasMap ifPathToSchemas
12+
ValidationData data
2513
) {
26-
if (arg instanceof Number) {
27-
BigDecimal castArg = getBigDecimal((Number) arg);
14+
if (!data.schema().constValueSet) {
15+
return null;
16+
}
17+
var constValue = data.schema().constValue;
18+
if (data.arg() instanceof Number numberArg) {
19+
BigDecimal castArg = getBigDecimal(numberArg);
2820
if (Objects.equals(castArg, constValue)) {
2921
return null;
3022
}
3123
if (constValue instanceof BigDecimal && ((BigDecimal) constValue).compareTo(castArg) == 0) {
3224
return null;
3325
}
3426
} else {
35-
if (Objects.equals(arg, constValue)) {
27+
if (Objects.equals(data.arg(), constValue)) {
3628
return null;
3729
}
3830
}
39-
throw new ValidationException("Invalid value "+arg+" was not equal to const "+constValue);
31+
throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue);
4032
}
41-
}
33+
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,21 @@
33
import org.checkerframework.checker.nullness.qual.Nullable;
44
import org.openapijsonschematools.client.exceptions.ValidationException;
55

6-
import java.util.ArrayList;
76
import java.util.List;
87

98
public class ContainsValidator implements KeywordValidator {
10-
public final Class<? extends JsonSchema> contains;
11-
12-
public ContainsValidator(Class<? extends JsonSchema> contains) {
13-
this.contains = contains;
14-
}
15-
169
@Override
1710
public @Nullable PathToSchemasMap validate(
18-
JsonSchema schema,
19-
@Nullable Object arg,
20-
ValidationMetadata validationMetadata,
21-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
22-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
23-
@Nullable PathToSchemasMap ifPathToSchemas
11+
ValidationData data
2412
) {
25-
if (!(arg instanceof List)) {
13+
if (!(data.arg() instanceof List)) {
2614
return null;
2715
}
16+
var containsPathToSchemas = data.containsPathToSchemas();
2817
if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) {
2918
throw new ValidationException(
30-
"Validation failed for contains keyword in class="+schema.getClass()
31-
+ " at pathToItem="+validationMetadata.pathToItem()+". No "
19+
"Validation failed for contains keyword in class="+data.schema().getClass()
20+
+ " at pathToItem="+data.validationMetadata().pathToItem()+". No "
3221
+ "items validated to the contains schema."
3322
);
3423
}
@@ -38,42 +27,4 @@ public ContainsValidator(Class<? extends JsonSchema> contains) {
3827
}
3928
return pathToSchemas;
4029
}
41-
42-
public List<PathToSchemasMap> getContainsPathToSchemas(
43-
@Nullable Object arg,
44-
ValidationMetadata validationMetadata
45-
) {
46-
if (!(arg instanceof List)) {
47-
return new ArrayList<>();
48-
}
49-
@Nullable List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
50-
int i = 0;
51-
for(Object itemValue: (List<?>) arg) {
52-
PathToSchemasMap thesePathToSchemas = new PathToSchemasMap();
53-
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
54-
itemPathToItem.add(i);
55-
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
56-
itemPathToItem,
57-
validationMetadata.configuration(),
58-
validationMetadata.validatedPathToSchemas(),
59-
validationMetadata.seenClasses()
60-
);
61-
JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains);
62-
if (itemValidationMetadata.validationRanEarlier(containsSchema)) {
63-
// todo add_deeper_validated_schemas
64-
containsPathToSchemas.add(thesePathToSchemas);
65-
i += 1;
66-
continue;
67-
}
68-
69-
try {
70-
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(
71-
containsSchema, itemValue, itemValidationMetadata);
72-
containsPathToSchemas.add(otherPathToSchemas);
73-
} catch (ValidationException ignored) {
74-
;
75-
}
76-
}
77-
return containsPathToSchemas;
78-
}
7930
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,27 @@
44
import org.openapijsonschematools.client.exceptions.ValidationException;
55

66
import java.util.HashSet;
7-
import java.util.List;
87
import java.util.Map;
98
import java.util.Set;
109

1110
public class DependentRequiredValidator implements KeywordValidator {
12-
public final Map<String, Set<String>> dependentRequired;
13-
14-
public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
15-
this.dependentRequired = dependentRequired;
16-
}
17-
1811
@Override
1912
public @Nullable PathToSchemasMap validate(
20-
JsonSchema schema,
21-
@Nullable Object arg,
22-
ValidationMetadata validationMetadata,
23-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
24-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
25-
@Nullable PathToSchemasMap ifPathToSchemas
13+
ValidationData data
2614
) {
27-
if (!(arg instanceof Map)) {
15+
if (!(data.arg() instanceof Map<?, ?> mapArg)) {
16+
return null;
17+
}
18+
var dependentRequired = data.schema().dependentRequired;
19+
if (dependentRequired == null) {
2820
return null;
2921
}
3022
for (Map.Entry<String, Set<String>> entry: dependentRequired.entrySet()) {
31-
if (!((Map<?, ?>) arg).containsKey(entry.getKey())) {
23+
if (!mapArg.containsKey(entry.getKey())) {
3224
continue;
3325
}
3426
Set<String> missingKeys = new HashSet<>(entry.getValue());
35-
for (Object objKey: ((Map<?, ?>) arg).keySet()) {
27+
for (Object objKey: mapArg.keySet()) {
3628
if (objKey instanceof String key) {
3729
missingKeys.remove(key);
3830
}
@@ -42,7 +34,7 @@ public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
4234
}
4335
throw new ValidationException(
4436
"Validation failed for dependentRequired because these_keys="+missingKeys+" are "+
45-
"missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass()
37+
"missing at pathToItem="+data.validationMetadata().pathToItem()+" in class "+data.schema().getClass()
4638
);
4739
}
4840
return null;

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,20 @@
22

33
import org.checkerframework.checker.nullness.qual.Nullable;
44

5-
import java.util.ArrayList;
65
import java.util.LinkedHashSet;
7-
import java.util.List;
86
import java.util.Map;
97
import java.util.Set;
108

119
public class DependentSchemasValidator implements KeywordValidator {
12-
public final Map<String, Class<? extends JsonSchema>> dependentSchemas;
13-
14-
public DependentSchemasValidator(Map<String, Class<? extends JsonSchema>> dependentSchemas) {
15-
this.dependentSchemas = dependentSchemas;
16-
}
17-
1810
@Override
1911
public @Nullable PathToSchemasMap validate(
20-
JsonSchema schema,
21-
@Nullable Object arg,
22-
ValidationMetadata validationMetadata,
23-
@Nullable List<PathToSchemasMap> containsPathToSchemas,
24-
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
25-
@Nullable PathToSchemasMap ifPathToSchemas
12+
ValidationData data
2613
) {
27-
if (!(arg instanceof Map<?, ?> mapArg)) {
14+
if (!(data.arg() instanceof Map<?, ?> mapArg)) {
15+
return null;
16+
}
17+
var dependentSchemas = data.schema().dependentSchemas;
18+
if (dependentSchemas == null) {
2819
return null;
2920
}
3021
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
@@ -41,10 +32,9 @@ public DependentSchemasValidator(Map<String, Class<? extends JsonSchema>> depend
4132
}
4233
Class<? extends JsonSchema> dependentSchemaClass = entry.getValue();
4334
JsonSchema dependentSchema = JsonSchemaFactory.getInstance(dependentSchemaClass);
44-
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, arg, validationMetadata);
35+
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, mapArg, data.validationMetadata());
4536
pathToSchemas.update(otherPathToSchemas);
4637
}
4738
return pathToSchemas;
4839
}
4940
}
50-

0 commit comments

Comments
 (0)