diff --git a/docs/generators/java.md b/docs/generators/java.md index 1df76c075fc..fbc033160f5 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -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 diff --git a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES index 6c89a46b018..f22ef910054 100644 --- a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES @@ -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 diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java index dc36864089b..550b384d702 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java @@ -19,7 +19,7 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java index 02aecb3dbf2..13b72b0976c 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java @@ -15,7 +15,7 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java index e978af7ee5f..7ab78f6ffb1 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java @@ -18,7 +18,7 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java index e2fd692dde0..0de1d98a87a 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java @@ -19,7 +19,7 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { BigDecimal castArg = getBigDecimal((Number) arg); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java index a2bca9506ad..10ab214c5a6 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java @@ -18,12 +18,12 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List 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 " @@ -44,7 +44,7 @@ public List getContainsPathToSchemas( if (!(arg instanceof List)) { return new ArrayList<>(); } - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = new ArrayList<>(); int i = 0; for(Object itemValue: (List) arg) { PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java index 7f448bb4afa..7102fe13c4b 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java @@ -24,7 +24,7 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java index e4e7d58d6a0..b5f13f6e68d 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java index 56fe9360e21..ded38226b98 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java index 8753e693df5..8bbabfaa139 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java @@ -148,7 +148,7 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { validateNumericFormat( diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java index ea82ab7bd19..fc9e0454687 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java @@ -17,7 +17,7 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java index 92b17cca2ae..44c83b6d379 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java @@ -47,6 +47,8 @@ public abstract class JsonSchema { public final @Nullable Object constValue; public final boolean constValueSet; public final @Nullable Class contains; + public final @Nullable Integer maxContains; + public final @Nullable Integer minContains; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -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; } @@ -250,7 +266,7 @@ public static PathToSchemasMap validate( LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = null; KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java index b726051cd2e..191148fe7bf 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java @@ -147,4 +147,14 @@ public JsonSchemaInfo contains(Class 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; + } } \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java index 896c8b52b35..d106dba9680 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java @@ -11,7 +11,7 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java new file mode 100644 index 00000000000..3b61e377df3 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java index 05a3c83b919..35f1ab771f9 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java @@ -17,7 +17,7 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java index ff8b68eb3c6..d45fa4aec05 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java @@ -17,7 +17,7 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java index 1bff35c458c..d3ca51afd54 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java @@ -18,7 +18,7 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java index 023f09353c6..8ac89924b7f 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java @@ -17,7 +17,7 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java new file mode 100644 index 00000000000..dccb15435a4 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java index 6aa2bfa7161..790a84d323b 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java @@ -17,7 +17,7 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java index 35bcd82cc60..885b3293dc4 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java @@ -17,7 +17,7 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java index 247b730b5a6..28f777b515d 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java @@ -18,7 +18,7 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java index e8fd4f74954..86aacbc97f0 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java @@ -17,7 +17,7 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java index be7ae76af99..129b6382e60 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java @@ -18,7 +18,7 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java index caafdf59470..7d28774a9d3 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java @@ -22,7 +22,7 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas; try { diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java index 5206c597b6a..2ddb40e1aeb 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java @@ -18,7 +18,7 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java index 9e28025ae9a..7ab82a715fb 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java @@ -18,7 +18,7 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java index 1b8faefd80a..8f52ce0bd26 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java @@ -20,7 +20,7 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 660f88ac893..2a4b53f1ece 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java @@ -20,7 +20,7 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java index 266c77f4f46..3d9d490d345 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java @@ -19,7 +19,7 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { Class argClass; if (arg == null) { diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java index 58376c9b7f2..5916946e50f 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java @@ -19,7 +19,7 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES index 5f8c5d29a21..12d9180bf19 100644 --- a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES @@ -287,10 +287,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 diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md index ab298edf3c6..7b7046b3c73 100644 --- a/samples/client/3_1_0_unit_test/java/docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md @@ -19,6 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | +| Integer | maxContains = 1 | ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/MincontainsWithoutContainsIsIgnored.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MincontainsWithoutContainsIsIgnored.md index 7cba08a9d51..13fd5266232 100644 --- a/samples/client/3_1_0_unit_test/java/docs/components/schemas/MincontainsWithoutContainsIsIgnored.md +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MincontainsWithoutContainsIsIgnored.md @@ -19,6 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | +| Integer | minContains = 1 | ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MaxcontainsWithoutContainsIsIgnored.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MaxcontainsWithoutContainsIsIgnored.java index 1f01091b40b..25719eff992 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MaxcontainsWithoutContainsIsIgnored.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MaxcontainsWithoutContainsIsIgnored.java @@ -46,6 +46,7 @@ public static class MaxcontainsWithoutContainsIsIgnored1 extends JsonSchema impl protected MaxcontainsWithoutContainsIsIgnored1() { super(new JsonSchemaInfo() + .maxContains(1) ); } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MincontainsWithoutContainsIsIgnored.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MincontainsWithoutContainsIsIgnored.java index abf20840e1e..b2416e86247 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MincontainsWithoutContainsIsIgnored.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MincontainsWithoutContainsIsIgnored.java @@ -46,6 +46,7 @@ public static class MincontainsWithoutContainsIsIgnored1 extends JsonSchema impl protected MincontainsWithoutContainsIsIgnored1() { super(new JsonSchemaInfo() + .minContains(1) ); } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java index dc36864089b..550b384d702 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java @@ -19,7 +19,7 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java index 02aecb3dbf2..13b72b0976c 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java @@ -15,7 +15,7 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java index e978af7ee5f..7ab78f6ffb1 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java @@ -18,7 +18,7 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java index e2fd692dde0..0de1d98a87a 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java @@ -19,7 +19,7 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { BigDecimal castArg = getBigDecimal((Number) arg); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java index a2bca9506ad..10ab214c5a6 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java @@ -18,12 +18,12 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List 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 " @@ -44,7 +44,7 @@ public List getContainsPathToSchemas( if (!(arg instanceof List)) { return new ArrayList<>(); } - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = new ArrayList<>(); int i = 0; for(Object itemValue: (List) arg) { PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java index 7f448bb4afa..7102fe13c4b 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java @@ -24,7 +24,7 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java index e4e7d58d6a0..b5f13f6e68d 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java index 56fe9360e21..ded38226b98 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java index 8753e693df5..8bbabfaa139 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java @@ -148,7 +148,7 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { validateNumericFormat( diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java index ea82ab7bd19..fc9e0454687 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java @@ -17,7 +17,7 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java index 92b17cca2ae..44c83b6d379 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java @@ -47,6 +47,8 @@ public abstract class JsonSchema { public final @Nullable Object constValue; public final boolean constValueSet; public final @Nullable Class contains; + public final @Nullable Integer maxContains; + public final @Nullable Integer minContains; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -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; } @@ -250,7 +266,7 @@ public static PathToSchemasMap validate( LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = null; KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java index b726051cd2e..191148fe7bf 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java @@ -147,4 +147,14 @@ public JsonSchemaInfo contains(Class 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; + } } \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java index 896c8b52b35..d106dba9680 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java @@ -11,7 +11,7 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java new file mode 100644 index 00000000000..3b61e377df3 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java index 05a3c83b919..35f1ab771f9 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java @@ -17,7 +17,7 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java index ff8b68eb3c6..d45fa4aec05 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java @@ -17,7 +17,7 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java index 1bff35c458c..d3ca51afd54 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java @@ -18,7 +18,7 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java index 023f09353c6..8ac89924b7f 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java @@ -17,7 +17,7 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java new file mode 100644 index 00000000000..dccb15435a4 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java index 6aa2bfa7161..790a84d323b 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java @@ -17,7 +17,7 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java index 35bcd82cc60..885b3293dc4 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java @@ -17,7 +17,7 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java index 247b730b5a6..28f777b515d 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java @@ -18,7 +18,7 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java index e8fd4f74954..86aacbc97f0 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java @@ -17,7 +17,7 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java index be7ae76af99..129b6382e60 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java @@ -18,7 +18,7 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java index caafdf59470..7d28774a9d3 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java @@ -22,7 +22,7 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas; try { diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java index 5206c597b6a..2ddb40e1aeb 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java @@ -18,7 +18,7 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java index 9e28025ae9a..7ab82a715fb 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java @@ -18,7 +18,7 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java index 1b8faefd80a..8f52ce0bd26 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java @@ -20,7 +20,7 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 660f88ac893..2a4b53f1ece 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java @@ -20,7 +20,7 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java index 266c77f4f46..3d9d490d345 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java @@ -19,7 +19,7 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { Class argClass; if (arg == null) { diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java index 58376c9b7f2..5916946e50f 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java @@ -19,7 +19,7 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index cb71415ab9c..65fbd2c52fb 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -715,10 +715,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 diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java index dc36864089b..550b384d702 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java @@ -19,7 +19,7 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java index 02aecb3dbf2..13b72b0976c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AllOfValidator.java @@ -15,7 +15,7 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java index e978af7ee5f..7ab78f6ffb1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AnyOfValidator.java @@ -18,7 +18,7 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java index e2fd692dde0..0de1d98a87a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java @@ -19,7 +19,7 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { BigDecimal castArg = getBigDecimal((Number) arg); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java index a2bca9506ad..10ab214c5a6 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java @@ -18,12 +18,12 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List 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 " @@ -44,7 +44,7 @@ public List getContainsPathToSchemas( if (!(arg instanceof List)) { return new ArrayList<>(); } - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = new ArrayList<>(); int i = 0; for(Object itemValue: (List) arg) { PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java index 7f448bb4afa..7102fe13c4b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java @@ -24,7 +24,7 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java index e4e7d58d6a0..b5f13f6e68d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java index 56fe9360e21..ded38226b98 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java @@ -17,7 +17,7 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java index 8753e693df5..8bbabfaa139 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java @@ -148,7 +148,7 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { validateNumericFormat( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java index ea82ab7bd19..fc9e0454687 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ItemsValidator.java @@ -17,7 +17,7 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java index 92b17cca2ae..44c83b6d379 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java @@ -47,6 +47,8 @@ public abstract class JsonSchema { public final @Nullable Object constValue; public final boolean constValueSet; public final @Nullable Class contains; + public final @Nullable Integer maxContains; + public final @Nullable Integer minContains; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -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; } @@ -250,7 +266,7 @@ public static PathToSchemasMap validate( LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = null; KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java index b726051cd2e..191148fe7bf 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java @@ -147,4 +147,14 @@ public JsonSchemaInfo contains(Class 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; + } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java index 896c8b52b35..d106dba9680 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/KeywordValidator.java @@ -11,7 +11,7 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java new file mode 100644 index 00000000000..3b61e377df3 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java index 05a3c83b919..35f1ab771f9 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java @@ -17,7 +17,7 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java index ff8b68eb3c6..d45fa4aec05 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxLengthValidator.java @@ -17,7 +17,7 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java index 1bff35c458c..d3ca51afd54 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxPropertiesValidator.java @@ -18,7 +18,7 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java index 023f09353c6..8ac89924b7f 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java @@ -17,7 +17,7 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java new file mode 100644 index 00000000000..dccb15435a4 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java @@ -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 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; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java index 6aa2bfa7161..790a84d323b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java @@ -17,7 +17,7 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java index 35bcd82cc60..885b3293dc4 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java @@ -17,7 +17,7 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java index 247b730b5a6..28f777b515d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java @@ -18,7 +18,7 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java index e8fd4f74954..86aacbc97f0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java @@ -17,7 +17,7 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java index be7ae76af99..129b6382e60 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java @@ -18,7 +18,7 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java index caafdf59470..7d28774a9d3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java @@ -22,7 +22,7 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas; try { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java index 5206c597b6a..2ddb40e1aeb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java @@ -18,7 +18,7 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java index 9e28025ae9a..7ab82a715fb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java @@ -18,7 +18,7 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java index 1b8faefd80a..8f52ce0bd26 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java @@ -20,7 +20,7 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 660f88ac893..2a4b53f1ece 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java @@ -20,7 +20,7 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java index 266c77f4f46..3d9d490d345 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java @@ -19,7 +19,7 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { Class argClass; if (arg == null) { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java index 58376c9b7f2..5916946e50f 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java @@ -19,7 +19,7 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 8affdd5bc01..91983f9a0a3 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -268,12 +268,12 @@ public JavaClientGenerator() { SchemaFeature.Format, // SchemaFeature.If, SchemaFeature.Items, - // SchemaFeature.MaxContains, + SchemaFeature.MaxContains, SchemaFeature.MaxItems, SchemaFeature.MaxLength, SchemaFeature.MaxProperties, SchemaFeature.Maximum, - // SchemaFeature.MinContains, + SchemaFeature.MinContains, SchemaFeature.MinItems, SchemaFeature.MinLength, SchemaFeature.MinProperties, @@ -591,10 +591,12 @@ public void processOpts() { keywordValidatorFiles.add("LongValueMethod"); keywordValidatorFiles.add("MapSchemaValidator"); keywordValidatorFiles.add("MapUtils"); + keywordValidatorFiles.add("MaxContainsValidator"); keywordValidatorFiles.add("MaximumValidator"); keywordValidatorFiles.add("MaxItemsValidator"); keywordValidatorFiles.add("MaxLengthValidator"); keywordValidatorFiles.add("MaxPropertiesValidator"); + keywordValidatorFiles.add("MinContainsValidator"); keywordValidatorFiles.add("MinimumValidator"); keywordValidatorFiles.add("MinItemsValidator"); keywordValidatorFiles.add("MinLengthValidator"); diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_anytypeOrMultitype.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_anytypeOrMultitype.hbs index 5e96f3bdae6..9ab119aaee9 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_anytypeOrMultitype.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_anytypeOrMultitype.hbs @@ -102,6 +102,12 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements { {{#if contains}} {{> src/main/java/packagename/components/schemas/SchemaClass/_contains }} {{/if}} + {{#neq maxContains null}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }} + {{/neq}} + {{#neq minContains null}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }} + {{/neq}} ); } diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_list.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_list.hbs index 099c9ad41c2..4a0f2355b4c 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_list.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_list.hbs @@ -47,6 +47,12 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements L {{#if contains}} {{> src/main/java/packagename/components/schemas/SchemaClass/_contains }} {{/if}} + {{#neq maxContains null}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }} + {{/neq}} + {{#neq minContains null}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }} + {{/neq}} ); } diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_maxContains.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_maxContains.hbs new file mode 100644 index 00000000000..75f36089843 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_maxContains.hbs @@ -0,0 +1,5 @@ +{{#if forDocs}} +maxContains = {{maxContains}} +{{~else}} +.maxContains({{maxContains}}) +{{/if}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_minContains.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_minContains.hbs new file mode 100644 index 00000000000..213ca5c7cc6 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_minContains.hbs @@ -0,0 +1,5 @@ +{{#if forDocs}} +minContains = {{minContains}} +{{~else}} +.minContains({{minContains}}) +{{/if}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/docschema_fields_field.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/docschema_fields_field.hbs index efb38bf3a12..f37276d3e64 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/docschema_fields_field.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/docschema_fields_field.hbs @@ -76,3 +76,9 @@ {{#if contains}} | Class | {{> src/main/java/packagename/components/schemas/SchemaClass/_contains }} | {{/if}} +{{#neq maxContains null}} +| Integer | {{> src/main/java/packagename/components/schemas/SchemaClass/_maxContains }} | +{{/neq}} +{{#neq minContains null}} +| Integer | {{> src/main/java/packagename/components/schemas/SchemaClass/_minContains }} | +{{/neq}} diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/AdditionalPropertiesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/AdditionalPropertiesValidator.hbs index 057da5b50c0..593095be85e 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/AdditionalPropertiesValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/AdditionalPropertiesValidator.hbs @@ -19,7 +19,7 @@ public class AdditionalPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/AllOfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/AllOfValidator.hbs index 616d68dc400..d5905f64e7d 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/AllOfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/AllOfValidator.hbs @@ -15,7 +15,7 @@ public class AllOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/AnyOfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/AnyOfValidator.hbs index fd1db3b2a31..338c2a3a593 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/AnyOfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/AnyOfValidator.hbs @@ -18,7 +18,7 @@ public class AnyOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ConstValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ConstValidator.hbs index fdad6a2e3ed..18a54529355 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ConstValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ConstValidator.hbs @@ -19,7 +19,7 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { BigDecimal castArg = getBigDecimal((Number) arg); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ContainsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ContainsValidator.hbs index 0c762fbd014..cc3b162efd0 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ContainsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ContainsValidator.hbs @@ -18,12 +18,12 @@ public class ContainsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List 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 " @@ -44,7 +44,7 @@ public class ContainsValidator implements KeywordValidator { if (!(arg instanceof List)) { return new ArrayList<>(); } - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = new ArrayList<>(); int i = 0; for(Object itemValue: (List) arg) { PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/EnumValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/EnumValidator.hbs index 7454e4e3c01..e7590d0d56f 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/EnumValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/EnumValidator.hbs @@ -24,7 +24,7 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMaximumValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMaximumValidator.hbs index 1f23dcbfe2b..e3eee58de47 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMaximumValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMaximumValidator.hbs @@ -17,7 +17,7 @@ public class ExclusiveMaximumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMinimumValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMinimumValidator.hbs index 84c9c958918..0606ed7f765 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMinimumValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ExclusiveMinimumValidator.hbs @@ -17,7 +17,7 @@ public class ExclusiveMinimumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/FormatValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/FormatValidator.hbs index 38aacc62838..87b2ce57967 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/FormatValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/FormatValidator.hbs @@ -148,7 +148,7 @@ public class FormatValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (arg instanceof Number) { validateNumericFormat( diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ItemsValidator.hbs index 362f29e214c..b2767199cdd 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ItemsValidator.hbs @@ -17,7 +17,7 @@ public class ItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs index e8b61a3716e..a2f163bf0d9 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs @@ -47,6 +47,8 @@ public abstract class JsonSchema { public final @Nullable Object constValue; public final boolean constValueSet; public final @Nullable Class contains; + public final @Nullable Integer maxContains; + public final @Nullable Integer minContains; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -236,6 +238,20 @@ public abstract class JsonSchema { 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; } @@ -250,7 +266,7 @@ public abstract class JsonSchema { LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; - List containsPathToSchemas = new ArrayList<>(); + @Nullable List containsPathToSchemas = null; KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchemaInfo.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchemaInfo.hbs index 2ce538de955..9f436b810cc 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchemaInfo.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchemaInfo.hbs @@ -147,4 +147,14 @@ public class JsonSchemaInfo { 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; + } } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/KeywordValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/KeywordValidator.hbs index 2c418faab06..15aeeddfbc5 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/KeywordValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/KeywordValidator.hbs @@ -11,7 +11,7 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxContainsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxContainsValidator.hbs new file mode 100644 index 00000000000..2c0a3da5b39 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxContainsValidator.hbs @@ -0,0 +1,36 @@ +package {{{packageName}}}.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.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 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; + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxItemsValidator.hbs index ab22403dab2..168918680cd 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxItemsValidator.hbs @@ -17,7 +17,7 @@ public class MaxItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxLengthValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxLengthValidator.hbs index 7ac1512460f..9034c63a187 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxLengthValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxLengthValidator.hbs @@ -17,7 +17,7 @@ public class MaxLengthValidator extends LengthValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxPropertiesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxPropertiesValidator.hbs index 4ca96783d59..655d6962cf2 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxPropertiesValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxPropertiesValidator.hbs @@ -18,7 +18,7 @@ public class MaxPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaximumValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaximumValidator.hbs index e896a028443..9b95bd10420 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaximumValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaximumValidator.hbs @@ -17,7 +17,7 @@ public class MaximumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinContainsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinContainsValidator.hbs new file mode 100644 index 00000000000..f2092606885 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinContainsValidator.hbs @@ -0,0 +1,36 @@ +package {{{packageName}}}.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.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 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; + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinItemsValidator.hbs index 8d9d4bf8084..28e5ed8d008 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinItemsValidator.hbs @@ -17,7 +17,7 @@ public class MinItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinLengthValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinLengthValidator.hbs index 2658276c42d..4712cb5c693 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinLengthValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinLengthValidator.hbs @@ -17,7 +17,7 @@ public class MinLengthValidator extends LengthValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinPropertiesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinPropertiesValidator.hbs index c600e575856..0a22211205e 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinPropertiesValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinPropertiesValidator.hbs @@ -18,7 +18,7 @@ public class MinPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinimumValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinimumValidator.hbs index aeb8868b2bf..b494cfa8c46 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MinimumValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MinimumValidator.hbs @@ -17,7 +17,7 @@ public class MinimumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MultipleOfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MultipleOfValidator.hbs index cc6e1fc2f8a..1ff91055797 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/MultipleOfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/MultipleOfValidator.hbs @@ -18,7 +18,7 @@ public class MultipleOfValidator extends BigDecimalValidator implements KeywordV JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Number)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/NotValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/NotValidator.hbs index 933e215680d..627a32dff65 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/NotValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/NotValidator.hbs @@ -22,7 +22,7 @@ public class NotValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas; try { diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/OneOfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/OneOfValidator.hbs index 4d5a7ffd0ab..22a631cdd26 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/OneOfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/OneOfValidator.hbs @@ -18,7 +18,7 @@ public class OneOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternValidator.hbs index ffdad52c829..aa2eb093266 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternValidator.hbs @@ -18,7 +18,7 @@ public class PatternValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof String)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertiesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertiesValidator.hbs index 48f26a579e2..da38d014330 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertiesValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertiesValidator.hbs @@ -20,7 +20,7 @@ public class PropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs index 3c6cdf9ff88..7dc2b7fe0af 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs @@ -20,7 +20,7 @@ public class RequiredValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/TypeValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/TypeValidator.hbs index 2ad5acc9ef3..81402a8d039 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/TypeValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/TypeValidator.hbs @@ -19,7 +19,7 @@ public class TypeValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { Class argClass; if (arg == null) { diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/UniqueItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/UniqueItemsValidator.hbs index 146f6352caf..02a26776e1e 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/UniqueItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/UniqueItemsValidator.hbs @@ -19,7 +19,7 @@ public class UniqueItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - List containsPathToSchemas + @Nullable List containsPathToSchemas ) { if (!(arg instanceof List)) { return null;