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

Java, adds min/maxContains #361

Merged
merged 5 commits into from
Jan 12, 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
4 changes: 2 additions & 2 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,12 +289,12 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|Format|✓|OAS2,OAS3
|If|✗|OAS3
|Items|✓|OAS2,OAS3
|MaxContains||OAS3
|MaxContains||OAS3
|MaxItems|✓|OAS2,OAS3
|MaxLength|✓|OAS2,OAS3
|MaxProperties|✓|OAS2,OAS3
|Maximum|✓|OAS2,OAS3
|MinContains||OAS3
|MinContains||OAS3
|MinItems|✓|OAS2,OAS3
|MinLength|✓|OAS2,OAS3
|MinProperties|✓|OAS2,OAS3
Expand Down
2 changes: 2 additions & 0 deletions samples/client/3_0_3_unit_test/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,12 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/LongEnumValid
src/main/java/org/openapijsonschematools/client/schemas/validation/LongValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MapSchemaValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MapUtils.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public AdditionalPropertiesValidator(Class<? extends JsonSchema> additionalPrope
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map<?, ?> mapArg)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public AllOfValidator(List<Class<? extends JsonSchema>> allOf) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
for(Class<? extends JsonSchema> allOfClass: allOf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public AnyOfValidator(List<Class<? extends JsonSchema>> anyOf) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
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 @@ -19,7 +19,7 @@ public ConstValidator(@Nullable Object constValue) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (arg instanceof Number) {
BigDecimal castArg = getBigDecimal((Number) arg);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ public ContainsValidator(Class<? extends JsonSchema> contains) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
if (containsPathToSchemas.isEmpty()) {
if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) {
throw new ValidationException(
"Validation failed for contains keyword in class="+schema.getClass()
+ " at pathToItem="+validationMetadata.pathToItem()+". No "
Expand All @@ -44,7 +44,7 @@ public List<PathToSchemasMap> getContainsPathToSchemas(
if (!(arg instanceof List)) {
return new ArrayList<>();
}
List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
@Nullable List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
int i = 0;
for(Object itemValue: (List<?>) arg) {
PathToSchemasMap thesePathToSchemas = new PathToSchemasMap();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ private boolean enumContainsArg(@Nullable Object arg){
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
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 @@ -17,7 +17,7 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (arg instanceof Number) {
validateNumericFormat(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public ItemsValidator(Class<? extends JsonSchema> items) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ public abstract class JsonSchema {
public final @Nullable Object constValue;
public final boolean constValueSet;
public final @Nullable Class<? extends JsonSchema> contains;
public final @Nullable Integer maxContains;
public final @Nullable Integer minContains;
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;

protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
Expand Down Expand Up @@ -236,6 +238,20 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
new ContainsValidator(this.contains)
);
}
this.maxContains = jsonSchemaInfo.maxContains;
if (this.maxContains != null) {
keywordToValidator.put(
"maxContains",
new MaxContainsValidator(this.maxContains)
);
}
this.minContains = jsonSchemaInfo.minContains;
if (this.minContains != null) {
keywordToValidator.put(
"minContains",
new MinContainsValidator(this.minContains)
);
}
this.keywordToValidator = keywordToValidator;
}

Expand All @@ -250,7 +266,7 @@ public static PathToSchemasMap validate(
LinkedHashSet<String> disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords();
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
LinkedHashMap<String, KeywordValidator> thisKeywordToValidator = jsonSchema.keywordToValidator;
List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
@Nullable List<PathToSchemasMap> containsPathToSchemas = null;
KeywordValidator containsValidator = thisKeywordToValidator.get("contains");
if (containsValidator != null) {
containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,14 @@ public JsonSchemaInfo contains(Class<? extends JsonSchema> contains) {
this.contains = contains;
return this;
}
public @Nullable Integer maxContains = null;
public JsonSchemaInfo maxContains(Integer maxContains) {
this.maxContains = maxContains;
return this;
}
public @Nullable Integer minContains = null;
public JsonSchemaInfo minContains(Integer minContains) {
this.minContains = minContains;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public interface KeywordValidator {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) throws ValidationException;

default List<PathToSchemasMap> getContainsPathToSchemas(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.openapijsonschematools.client.schemas.validation;

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

import java.util.List;

public class MaxContainsValidator implements KeywordValidator {
public final int maxContains;

public MaxContainsValidator(int maxContains) {
this.maxContains = maxContains;
}

@Override
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
if (containsPathToSchemas == null) {
return null;
}
if (containsPathToSchemas.size() > maxContains) {
throw new ValidationException(
"Validation failed for maxContains keyword in class="+schema.getClass()+
" at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema."
);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MaxItemsValidator(int maxItems) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MaxLengthValidator(int maxLength) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public MaxPropertiesValidator(int maxProperties) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MaximumValidator(Number maximum) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.openapijsonschematools.client.schemas.validation;

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

import java.util.List;

public class MinContainsValidator implements KeywordValidator {
public final int minContains;

public MinContainsValidator(int minContains) {
this.minContains = minContains;
}

@Override
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
if (containsPathToSchemas == null) {
return null;
}
if (containsPathToSchemas.size() < minContains) {
throw new ValidationException(
"Validation failed for minContains keyword in class="+schema.getClass()+
" at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema."
);
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MinItemsValidator(int minItems) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MinLengthValidator(int minLength) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public MinPropertiesValidator(int minProperties) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public MinimumValidator(Number minimum) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public MultipleOfValidator(BigDecimal multipleOf) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public NotValidator(Class<? extends JsonSchema> not) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
PathToSchemasMap pathToSchemas;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public OneOfValidator(List<Class<? extends JsonSchema>> oneOf) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
List<Class<? extends JsonSchema>> validatedOneOfClasses = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public PatternValidator(Pattern pattern) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public PropertiesValidator(Map<String, Class<? extends JsonSchema>> properties)
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map<?, ?> mapArg)) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public RequiredValidator(Set<String> required) {
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
@Nullable List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map)) {
return null;
Expand Down
Loading