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

Java, adds if json schema keyword feature #369

Merged
merged 4 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|ExclusiveMinimum|✓|OAS2,OAS3
|ExclusiveMaximum|✓|OAS2,OAS3
|Format|✓|OAS2,OAS3
|If||OAS3
|If||OAS3
|Items|✓|OAS2,OAS3
|MaxContains|✓|OAS3
|MaxItems|✓|OAS2,OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/FloatValueMet
src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FrozenList.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FrozenMap.java
src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/IntegerEnumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/IntegerValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public AdditionalPropertiesValidator(Class<? extends JsonSchema> additionalPrope
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Map<?, ?> mapArg)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public AllOfValidator(List<Class<? extends JsonSchema>> allOf) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
for(Class<? extends JsonSchema> allOfClass: allOf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public AnyOfValidator(List<Class<? extends JsonSchema>> anyOf) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
List<Class<? extends JsonSchema>> validatedAnyOfClasses = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public ConstValidator(@Nullable Object constValue) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (arg instanceof Number) {
BigDecimal castArg = getBigDecimal((Number) arg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public ContainsValidator(Class<? extends JsonSchema> contains) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public DependentRequiredValidator(Map<String, Set<String>> dependentRequired) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public DependentSchemasValidator(Map<String, Class<? extends JsonSchema>> depend
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Map<?, ?> mapArg)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ private boolean enumContainsArg(@Nullable Object arg){
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (enumValues.isEmpty()) {
throw new ValidationException("No value can match enum because enum is empty");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (arg instanceof Number) {
validateNumericFormat(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.openapijsonschematools.client.schemas.validation;

import org.openapijsonschematools.client.exceptions.ValidationException;
import org.openapijsonschematools.client.exceptions.InvalidTypeException;
import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class IfValidator implements KeywordValidator {
public final Class<? extends JsonSchema> ifSchema;

public IfValidator(Class<? extends JsonSchema> ifSchema) {
this.ifSchema = ifSchema;
}

@Override
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (ifPathToSchemas == null) {
throw new ValidationException("Invalid type for ifPathToSchemas");
}
/*
if is false use case
ifPathToSchemas == {}
no need to add any data to pathToSchemas

if true, then true -> true for whole schema
so validate_then will add ifPathToSchemas data to pathToSchemas
*/
return null;
}

public PathToSchemasMap getIfPathToSchemas(
@Nullable Object arg,
ValidationMetadata validationMetadata
) {
JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema);
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
try {
var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata);
pathToSchemas.update(otherPathToSchemas);
} catch (ValidationException | InvalidTypeException ignored) {}
return pathToSchemas;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public ItemsValidator(Class<? extends JsonSchema> items) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List<?> listArg)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public abstract class JsonSchema {
public final @Nullable Map<String, Class<? extends JsonSchema>> dependentSchemas;
public @Nullable Map<Pattern, Class<? extends JsonSchema>> patternProperties;
public @Nullable List<Class<? extends JsonSchema>> prefixItems;
public final @Nullable Class<? extends JsonSchema> ifSchema;
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;

protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
Expand Down Expand Up @@ -292,6 +293,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
new PrefixItemsValidator(this.prefixItems)
);
}
this.ifSchema = jsonSchemaInfo.ifSchema;
if (this.ifSchema != null) {
keywordToValidator.put(
"if",
new IfValidator(this.ifSchema)
);
}
this.keywordToValidator = keywordToValidator;
}

Expand All @@ -316,6 +324,11 @@ public static PathToSchemasMap validate(
if (patternPropertiesValidator != null) {
patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata);
}
@Nullable PathToSchemasMap ifPathToSchemas = null;
KeywordValidator ifValidator = thisKeywordToValidator.get("if");
if (ifValidator != null) {
ifPathToSchemas = ifValidator.getIfPathToSchemas(arg, validationMetadata);
}
for (Map.Entry<String, KeywordValidator> entry: thisKeywordToValidator.entrySet()) {
String jsonKeyword = entry.getKey();
if (disabledKeywords.contains(jsonKeyword)) {
Expand All @@ -330,7 +343,8 @@ public static PathToSchemasMap validate(
arg,
validationMetadata,
containsPathToSchemas,
patternPropertiesPathToSchemas
patternPropertiesPathToSchemas,
ifPathToSchemas
);
if (otherPathToSchemas == null) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,4 +182,9 @@ public JsonSchemaInfo prefixItems(List<Class<? extends JsonSchema>> prefixItems)
this.prefixItems = prefixItems;
return this;
}
public @Nullable Class<? extends JsonSchema> ifSchema = null;
public JsonSchemaInfo ifSchema(Class<? extends JsonSchema> ifSchema) {
this.ifSchema = ifSchema;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public interface KeywordValidator {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) throws ValidationException;

default List<PathToSchemasMap> getContainsPathToSchemas(
Expand All @@ -28,4 +29,11 @@ default PathToSchemasMap getPatternPropertiesPathToSchemas(
) {
return new PathToSchemasMap();
}

default PathToSchemasMap getIfPathToSchemas(
@Nullable Object arg,
ValidationMetadata validationMetadata
) {
return new PathToSchemasMap();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MaxContainsValidator(int maxContains) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MaxItemsValidator(int maxItems) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MaxLengthValidator(int maxLength) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public MaxPropertiesValidator(int maxProperties) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MaximumValidator(Number maximum) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MinContainsValidator(int minContains) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MinItemsValidator(int minItems) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MinLengthValidator(int minLength) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public MinPropertiesValidator(int minProperties) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public MinimumValidator(Number minimum) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public MultipleOfValidator(BigDecimal multipleOf) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ public NotValidator(Class<? extends JsonSchema> not) {
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
) {
PathToSchemasMap pathToSchemas;
try {
Expand Down
Loading