diff --git a/docs/generators/java.md b/docs/generators/java.md index 62f31a5020a..a620205f723 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -304,7 +304,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |Nullable|✓|OAS3 |OneOf|✓|OAS3 |Pattern|✓|OAS2,OAS3 -|PatternProperties|✗|OAS3 +|PatternProperties|✓|OAS3 |PrefixItems|✗|OAS3 |Properties|✓|OAS2,OAS3 |PropertyNames|✓|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 84896bf3af2..cb9d2945326 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 @@ -257,6 +257,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/NullValueMeth src/main/java/org/openapijsonschematools/client/schemas/validation/NumberSchemaValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PathToSchemasMap.java +src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyEntry.java diff --git a/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md b/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md index aeb4f6987b1..9ab179eb48d 100644 --- a/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md +++ b/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md @@ -19,7 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | -| Pattern | pattern =
    "a+"
)))
| +| Pattern | pattern = Pattern.compile(
    "a+"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternValidation.md b/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternValidation.md index 5ec6df41670..5667d79b7b4 100644 --- a/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternValidation.md +++ b/samples/client/3_0_3_unit_test/java/docs/components/schemas/PatternValidation.md @@ -19,7 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | -| Pattern | pattern =
    "^a*$"
)))
| +| Pattern | pattern = Pattern.compile(
    "^a*$"
)
| ### Method Summary | Modifier and Type | Method and Description | 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 550b384d702..81adeddb054 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,8 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; @@ -34,11 +35,13 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.removeAll(schema.properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - // todo add handling for validatedPatternProperties for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); propPathToItem.add(addPropName); + if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + continue; + } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, validationMetadata.configuration(), 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 13b72b0976c..0c662704072 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,8 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7ab78f6ffb1..f170798d97c 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,8 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 0de1d98a87a..f77d5360885 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,8 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 10ab214c5a6..a4459d8a9db 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,7 +18,8 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/DependentRequiredValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java index 8c91c9316fc..554a49120d0 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java @@ -20,7 +20,8 @@ public DependentRequiredValidator(Map> dependentRequired) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/DependentSchemasValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java index a689279e1e1..6ad17c0d139 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java @@ -20,7 +20,8 @@ public DependentSchemasValidator(Map> depend JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/EnumValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java index 7102fe13c4b..ad242f735b2 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,8 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 b5f13f6e68d..64d86b2722a 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,8 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 ded38226b98..a596a7e80ce 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,8 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8bbabfaa139..be5e2d928b5 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,8 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 fc9e0454687..bf3ee6ecf15 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,8 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 562dc06cab0..e567b7f5dc2 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 @@ -52,6 +52,7 @@ public abstract class JsonSchema { public final @Nullable Class propertyNames; public @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; + public @Nullable Map> patternProperties; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -276,6 +277,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { new DependentSchemasValidator(this.dependentSchemas) ); } + this.patternProperties = jsonSchemaInfo.patternProperties; + if (this.patternProperties != null) { + keywordToValidator.put( + "patternProperties", + new PatternPropertiesValidator(this.patternProperties) + ); + } this.keywordToValidator = keywordToValidator; } @@ -295,6 +303,11 @@ public static PathToSchemasMap validate( if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); } + @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; + KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); + if (patternPropertiesValidator != null) { + patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); if (disabledKeywords.contains(jsonKeyword)) { @@ -308,7 +321,8 @@ public static PathToSchemasMap validate( jsonSchema, arg, validationMetadata, - containsPathToSchemas + containsPathToSchemas, + patternPropertiesPathToSchemas ); if (otherPathToSchemas == null) { continue; 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 c4f4ddf1042..45c911b0c18 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 @@ -172,4 +172,9 @@ public JsonSchemaInfo dependentSchemas(Map> this.dependentSchemas = dependentSchemas; return this; } + public @Nullable Map> patternProperties = null; + public JsonSchemaInfo patternProperties(Map> patternProperties) { + this.patternProperties = patternProperties; + 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 d106dba9680..3ff931654e5 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,8 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( @@ -20,4 +21,11 @@ default List getContainsPathToSchemas( ) { return new ArrayList<>(); } + + default PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + return new PathToSchemasMap(); + } } \ 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/MaxContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java index 3b61e377df3..a234c2907bd 100644 --- 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 @@ -17,7 +17,8 @@ public MaxContainsValidator(int maxContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/MaxItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java index 35f1ab771f9..21d175aeb60 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,8 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d45fa4aec05..4309ad392ab 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,8 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d3ca51afd54..0933d14568b 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,8 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8ac89924b7f..b7c08a08cb5 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,8 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 index dccb15435a4..70239e3fa3b 100644 --- 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 @@ -17,7 +17,8 @@ public MinContainsValidator(int minContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/MinItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java index 790a84d323b..5b452150aef 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,8 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 885b3293dc4..9dbac1aeb11 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,8 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 28f777b515d..24bb979c613 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,8 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 86aacbc97f0..34d6d27c5bf 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,8 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 129b6382e60..b5601e16fc9 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,8 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7d28774a9d3..5a9e59f530b 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,8 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 2ddb40e1aeb..e0c51fe2a11 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,8 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/PatternPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java new file mode 100644 index 00000000000..fa486ddcdab --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java @@ -0,0 +1,67 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class PatternPropertiesValidator implements KeywordValidator { + public final Map> patternProperties; + + public PatternPropertiesValidator(Map> patternProperties) { + this.patternProperties = patternProperties; + } + + @Override + public @Nullable PathToSchemasMap validate( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas + ) { + if (!(arg instanceof Map)) { + return null; + } + return patternPropertiesPathToSchemas; + } + + public PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg)) { + return new PathToSchemasMap(); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: mapArg.entrySet()) { + Object entryKey = entry.getKey(); + if (!(entryKey instanceof String key)) { + throw new InvalidTypeException("Invalid non-string type for map key"); + } + List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + propPathToItem.add(key); + ValidationMetadata propValidationMetadata = new ValidationMetadata( + propPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + for (Map.Entry> patternPropEntry: patternProperties.entrySet()) { + if (!patternPropEntry.getKey().matcher(key).find()) { + continue; + } + + Class patternPropClass = patternPropEntry.getValue(); + JsonSchema patternPropSchema = JsonSchemaFactory.getInstance(patternPropClass); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(patternPropSchema, entry.getValue(), propValidationMetadata); + pathToSchemas.update(otherPathToSchemas); + } + } + return pathToSchemas; + } +} + 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 7ab82a715fb..92678f1cca4 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,8 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8f52ce0bd26..94599597a13 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,8 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/PropertyNamesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java index b0c50ba11e3..f4ec5ab6239 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java @@ -18,7 +18,8 @@ public PropertyNamesValidator(Class propertyNames) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/RequiredValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 2a4b53f1ece..148be09c410 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,8 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 3d9d490d345..fd827d49e13 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,8 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 5916946e50f..419823634e3 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,8 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java index 374665ef028..e23076a75b1 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java @@ -78,7 +78,8 @@ public void testCorrectPropertySucceeds() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -108,7 +109,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -131,7 +133,8 @@ public void testIncorrectPropertyValueFails() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java index b584efdf406..69ffff00ce1 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java @@ -34,7 +34,8 @@ public void testIntFormatSucceedsWithFloat() { NumberJsonSchema.getInstance(), 1.0f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -46,7 +47,8 @@ public void testIntFormatFailsWithFloat() { NumberJsonSchema.getInstance(), 3.14f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -57,7 +59,8 @@ public void testIntFormatSucceedsWithInt() { NumberJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -69,7 +72,8 @@ public void testInt32UnderMinFails() { NumberJsonSchema.getInstance(), -2147483649L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -80,7 +84,8 @@ public void testInt32InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -2147483648, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -92,7 +97,8 @@ public void testInt32InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 2147483647, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -104,7 +110,8 @@ public void testInt32OverMaxFails() { NumberJsonSchema.getInstance(), 2147483648L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -116,7 +123,8 @@ public void testInt64UnderMinFails() { NumberJsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -127,7 +135,8 @@ public void testInt64InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -9223372036854775808L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -139,7 +148,8 @@ public void testInt64InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 9223372036854775807L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -152,7 +162,8 @@ public void testInt64OverMaxFails() { NumberJsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -163,7 +174,8 @@ public void testFloatUnderMinFails() { NumberJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -174,7 +186,8 @@ public void testFloatInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -186,7 +199,8 @@ public void testFloatInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -198,7 +212,8 @@ public void testFloatOverMaxFails() { NumberJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -209,7 +224,8 @@ public void testDoubleUnderMinFails() { NumberJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -220,7 +236,8 @@ public void testDoubleInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -232,7 +249,8 @@ public void testDoubleInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -244,7 +262,8 @@ public void testDoubleOverMaxFails() { NumberJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -255,7 +274,8 @@ public void testInvalidNumberStringFails() { NumberJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -266,7 +286,8 @@ public void testValidFloatNumberStringSucceeds() { NumberJsonSchema.getInstance(), "3.14", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -278,7 +299,8 @@ public void testValidIntNumberStringSucceeds() { NumberJsonSchema.getInstance(), "1", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -290,7 +312,8 @@ public void testInvalidDateStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -301,7 +324,8 @@ public void testValidDateStringSucceeds() { StringJsonSchema.getInstance(), "2017-01-20", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -313,7 +337,8 @@ public void testInvalidDateTimeStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -324,7 +349,8 @@ public void testValidDateTimeStringSucceeds() { StringJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java index 84da9687817..2e3fcdb5129 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java @@ -37,7 +37,8 @@ public void testCorrectItemsSucceeds() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -67,7 +68,8 @@ public void testNotApplicableTypeReturnsNull() { ListJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -89,8 +91,8 @@ public void testIncorrectItemFails() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } - diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java index 8d1d3fc053b..9367dc3268d 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java @@ -41,7 +41,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -73,7 +74,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -98,7 +100,8 @@ public void testIncorrectPropertyValueFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java index a5dbf4a8c03..53d0fced6ca 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java @@ -40,7 +40,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -62,7 +63,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -87,7 +89,8 @@ public void testIncorrectPropertyFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java index 362cca6e8ba..1dffdb7eb98 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java @@ -32,7 +32,8 @@ public void testValidateSucceeds() { StringJsonSchema.getInstance(), "hi", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -52,7 +53,8 @@ public void testValidateFailsIntIsNotString() { StringJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file 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 e959fef3770..1aa3d5b1e04 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 @@ -67,6 +67,7 @@ docs/components/schemas/MinitemsValidation.md docs/components/schemas/MinlengthValidation.md docs/components/schemas/MinpropertiesValidation.md docs/components/schemas/MultipleDependentsRequired.md +docs/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.md docs/components/schemas/MultipleTypesCanBeSpecifiedInAnArray.md docs/components/schemas/NestedAllofToCheckValidationSemantics.md docs/components/schemas/NestedAnyofToCheckValidationSemantics.md @@ -87,13 +88,16 @@ docs/components/schemas/OneofWithEmptySchema.md docs/components/schemas/OneofWithRequired.md docs/components/schemas/PatternIsNotAnchored.md docs/components/schemas/PatternValidation.md +docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md +docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md docs/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.md docs/components/schemas/PropertiesWithEscapedCharacters.md docs/components/schemas/PropertiesWithNullValuedInstanceProperties.md docs/components/schemas/PropertyNamedRefThatIsNotAReference.md docs/components/schemas/PropertynamesValidation.md docs/components/schemas/RegexFormat.md +docs/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.md docs/components/schemas/RelativeJsonPointerFormat.md docs/components/schemas/RequiredDefaultValidation.md docs/components/schemas/RequiredPropertiesWhoseNamesAreJavascriptObjectPropertyNames.md @@ -187,6 +191,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/MinitemsValid src/main/java/org/openapijsonschematools/client/components/schemas/MinlengthValidation.java src/main/java/org/openapijsonschematools/client/components/schemas/MinpropertiesValidation.java src/main/java/org/openapijsonschematools/client/components/schemas/MultipleDependentsRequired.java +src/main/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.java src/main/java/org/openapijsonschematools/client/components/schemas/MultipleTypesCanBeSpecifiedInAnArray.java src/main/java/org/openapijsonschematools/client/components/schemas/NestedAllofToCheckValidationSemantics.java src/main/java/org/openapijsonschematools/client/components/schemas/NestedAnyofToCheckValidationSemantics.java @@ -207,13 +212,16 @@ src/main/java/org/openapijsonschematools/client/components/schemas/OneofWithEmpt src/main/java/org/openapijsonschematools/client/components/schemas/OneofWithRequired.java src/main/java/org/openapijsonschematools/client/components/schemas/PatternIsNotAnchored.java src/main/java/org/openapijsonschematools/client/components/schemas/PatternValidation.java +src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.java src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java +src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.java src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.java src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesWithEscapedCharacters.java src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesWithNullValuedInstanceProperties.java src/main/java/org/openapijsonschematools/client/components/schemas/PropertyNamedRefThatIsNotAReference.java src/main/java/org/openapijsonschematools/client/components/schemas/PropertynamesValidation.java src/main/java/org/openapijsonschematools/client/components/schemas/RegexFormat.java +src/main/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.java src/main/java/org/openapijsonschematools/client/components/schemas/RelativeJsonPointerFormat.java src/main/java/org/openapijsonschematools/client/components/schemas/RequiredDefaultValidation.java src/main/java/org/openapijsonschematools/client/components/schemas/RequiredPropertiesWhoseNamesAreJavascriptObjectPropertyNames.java @@ -319,6 +327,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/NullValueMeth src/main/java/org/openapijsonschematools/client/schemas/validation/NumberSchemaValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PathToSchemasMap.java +src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyEntry.java diff --git a/samples/client/3_1_0_unit_test/java/README.md b/samples/client/3_1_0_unit_test/java/README.md index b913f62785b..feaf7979fd3 100644 --- a/samples/client/3_1_0_unit_test/java/README.md +++ b/samples/client/3_1_0_unit_test/java/README.md @@ -225,6 +225,7 @@ allowed input and output types. | [MinlengthValidation.MinlengthValidation1](docs/components/schemas/MinlengthValidation.md#minlengthvalidation1) | | | [MinpropertiesValidation.MinpropertiesValidation1](docs/components/schemas/MinpropertiesValidation.md#minpropertiesvalidation1) | | | [MultipleDependentsRequired.MultipleDependentsRequired1](docs/components/schemas/MultipleDependentsRequired.md#multipledependentsrequired1) | | +| [MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1](docs/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.md#multiplesimultaneouspatternpropertiesarevalidated1) | | | [MultipleTypesCanBeSpecifiedInAnArray.MultipleTypesCanBeSpecifiedInAnArray1](docs/components/schemas/MultipleTypesCanBeSpecifiedInAnArray.md#multipletypescanbespecifiedinanarray1) | | | [NestedAllofToCheckValidationSemantics.NestedAllofToCheckValidationSemantics1](docs/components/schemas/NestedAllofToCheckValidationSemantics.md#nestedalloftocheckvalidationsemantics1) | | | [NestedAnyofToCheckValidationSemantics.NestedAnyofToCheckValidationSemantics1](docs/components/schemas/NestedAnyofToCheckValidationSemantics.md#nestedanyoftocheckvalidationsemantics1) | | @@ -245,13 +246,16 @@ allowed input and output types. | [OneofWithRequired.OneofWithRequired1](docs/components/schemas/OneofWithRequired.md#oneofwithrequired1) | | | [PatternIsNotAnchored.PatternIsNotAnchored1](docs/components/schemas/PatternIsNotAnchored.md#patternisnotanchored1) | | | [PatternValidation.PatternValidation1](docs/components/schemas/PatternValidation.md#patternvalidation1) | | +| [PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1](docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md#patternpropertiesvalidatespropertiesmatchingaregex1) | | | [PatternpropertiesWithNullValuedInstanceProperties.PatternpropertiesWithNullValuedInstanceProperties1](docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md#patternpropertieswithnullvaluedinstanceproperties1) | | +| [PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1](docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md#propertiespatternpropertiesadditionalpropertiesinteraction1) | | | [PropertiesWhoseNamesAreJavascriptObjectPropertyNames.PropertiesWhoseNamesAreJavascriptObjectPropertyNames1](docs/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.md#propertieswhosenamesarejavascriptobjectpropertynames1) | | | [PropertiesWithEscapedCharacters.PropertiesWithEscapedCharacters1](docs/components/schemas/PropertiesWithEscapedCharacters.md#propertieswithescapedcharacters1) | | | [PropertiesWithNullValuedInstanceProperties.PropertiesWithNullValuedInstanceProperties1](docs/components/schemas/PropertiesWithNullValuedInstanceProperties.md#propertieswithnullvaluedinstanceproperties1) | | | [PropertyNamedRefThatIsNotAReference.PropertyNamedRefThatIsNotAReference1](docs/components/schemas/PropertyNamedRefThatIsNotAReference.md#propertynamedrefthatisnotareference1) | | | [PropertynamesValidation.PropertynamesValidation1](docs/components/schemas/PropertynamesValidation.md#propertynamesvalidation1) | | | [RegexFormat.RegexFormat1](docs/components/schemas/RegexFormat.md#regexformat1) | | +| [RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1](docs/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.md#regexesarenotanchoredbydefaultandarecasesensitive1) | | | [RelativeJsonPointerFormat.RelativeJsonPointerFormat1](docs/components/schemas/RelativeJsonPointerFormat.md#relativejsonpointerformat1) | | | [RequiredDefaultValidation.RequiredDefaultValidation1](docs/components/schemas/RequiredDefaultValidation.md#requireddefaultvalidation1) | | | [RequiredPropertiesWhoseNamesAreJavascriptObjectPropertyNames.RequiredPropertiesWhoseNamesAreJavascriptObjectPropertyNames1](docs/components/schemas/RequiredPropertiesWhoseNamesAreJavascriptObjectPropertyNames.md#requiredpropertieswhosenamesarejavascriptobjectpropertynames1) | | diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.md new file mode 100644 index 00000000000..89a30c0fa90 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.md @@ -0,0 +1,73 @@ +# MultipleSimultaneousPatternpropertiesAreValidated +org.openapijsonschematools.client.components.schemas.MultipleSimultaneousPatternpropertiesAreValidated.java +public class MultipleSimultaneousPatternpropertiesAreValidated + +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| static class | [MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1](#multiplesimultaneouspatternpropertiesarevalidated1)
schema class | +| static class | [MultipleSimultaneousPatternpropertiesAreValidated.Aaa](#aaa)
schema class | +| static class | [MultipleSimultaneousPatternpropertiesAreValidated.A](#a)
schema class | + +## MultipleSimultaneousPatternpropertiesAreValidated1 +public static class MultipleSimultaneousPatternpropertiesAreValidated1
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Map> | patternProperties = Map.ofEntries(
    new AbstractMap.SimpleEntry<>(Pattern.compile("a*"), [A.class](#a))),
    new AbstractMap.SimpleEntry<>(Pattern.compile("aaa*"), [Aaa.class](#aaa)))
)
| + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | validate(String arg, SchemaConfiguration configuration) | +| Void | validate(Void arg, SchemaConfiguration configuration) | +| int | validate(int arg, SchemaConfiguration configuration) | +| long | validate(long arg, SchemaConfiguration configuration) | +| float | validate(float arg, SchemaConfiguration configuration) | +| double | validate(double arg, SchemaConfiguration configuration) | +| boolean | validate(boolean arg, SchemaConfiguration configuration) | +| FrozenMap | validate(Map<?, ?> arg, SchemaConfiguration configuration) | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## Aaa +public static class Aaa
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Number | maximum = 20 | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | validate(String arg, SchemaConfiguration configuration) | +| Void | validate(Void arg, SchemaConfiguration configuration) | +| int | validate(int arg, SchemaConfiguration configuration) | +| long | validate(long arg, SchemaConfiguration configuration) | +| float | validate(float arg, SchemaConfiguration configuration) | +| double | validate(double arg, SchemaConfiguration configuration) | +| boolean | validate(boolean arg, SchemaConfiguration configuration) | +| FrozenMap | validate(Map<?, ?> arg, SchemaConfiguration configuration) | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## A +public static class A
+extends IntJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.IntJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md index aeb4f6987b1..9ab179eb48d 100644 --- a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternIsNotAnchored.md @@ -19,7 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | -| Pattern | pattern =
    "a+"
)))
| +| Pattern | pattern = Pattern.compile(
    "a+"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternValidation.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternValidation.md index 5ec6df41670..5667d79b7b4 100644 --- a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternValidation.md +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternValidation.md @@ -19,7 +19,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | -| Pattern | pattern =
    "^a*$"
)))
| +| Pattern | pattern = Pattern.compile(
    "^a*$"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md new file mode 100644 index 00000000000..21341ded6ec --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md @@ -0,0 +1,48 @@ +# PatternpropertiesValidatesPropertiesMatchingARegex +org.openapijsonschematools.client.components.schemas.PatternpropertiesValidatesPropertiesMatchingARegex.java +public class PatternpropertiesValidatesPropertiesMatchingARegex + +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| static class | [PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1](#patternpropertiesvalidatespropertiesmatchingaregex1)
schema class | +| static class | [PatternpropertiesValidatesPropertiesMatchingARegex.Fo](#fo)
schema class | + +## PatternpropertiesValidatesPropertiesMatchingARegex1 +public static class PatternpropertiesValidatesPropertiesMatchingARegex1
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Map> | patternProperties = Map.ofEntries(
    new AbstractMap.SimpleEntry<>(Pattern.compile("f.*o"), [Fo.class](#fo)))
)
| + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | validate(String arg, SchemaConfiguration configuration) | +| Void | validate(Void arg, SchemaConfiguration configuration) | +| int | validate(int arg, SchemaConfiguration configuration) | +| long | validate(long arg, SchemaConfiguration configuration) | +| float | validate(float arg, SchemaConfiguration configuration) | +| double | validate(double arg, SchemaConfiguration configuration) | +| boolean | validate(boolean arg, SchemaConfiguration configuration) | +| FrozenMap | validate(Map<?, ?> arg, SchemaConfiguration configuration) | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## Fo +public static class Fo
+extends IntJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.IntJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md index 7c8fec505ad..6db1c759154 100644 --- a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md @@ -20,6 +20,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | +| Map> | patternProperties = Map.ofEntries(
    new AbstractMap.SimpleEntry<>(Pattern.compile("^.*bar$"), [Bar.class](#bar)))
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md new file mode 100644 index 00000000000..b95184cb465 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md @@ -0,0 +1,163 @@ +# PropertiesPatternpropertiesAdditionalpropertiesInteraction +org.openapijsonschematools.client.components.schemas.PropertiesPatternpropertiesAdditionalpropertiesInteraction.java +public class PropertiesPatternpropertiesAdditionalpropertiesInteraction + +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema +- classes to store validated map payloads, extends FrozenMap +- classes to build inputs for map payloads + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1](#propertiespatternpropertiesadditionalpropertiesinteraction1)
schema class | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder)
builder for Map payloads | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteractionMap](#propertiespatternpropertiesadditionalpropertiesinteractionmap)
output class for Map payloads | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.Bar](#bar)
schema class | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.Foo](#foo)
schema class | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.Fo](#fo)
schema class | +| static class | [PropertiesPatternpropertiesAdditionalpropertiesInteraction.AdditionalProperties](#additionalproperties)
schema class | + +## PropertiesPatternpropertiesAdditionalpropertiesInteraction1 +public static class PropertiesPatternpropertiesAdditionalpropertiesInteraction1
+extends JsonSchema + +A schema class that validates payloads + +### Code Sample +``` +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.FrozenList; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; + +import java.util.Arrays; +import java.util.List; +import java.util.AbstractMap; + +static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + +// Map validation +PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteractionMap validatedPayload = + PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.validate( + new PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder() + .additionalProperty("someAdditionalProperty", 1) + + .build(), + configuration +); +``` + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Set> | type = Set.of(Map.class) | +| Map> | properties = Map.ofEntries(
    new PropertyEntry("foo", [Foo.class](#foo))),
    new PropertyEntry("bar", [Bar.class](#bar)))
)
| +| Class | additionalProperties = [AdditionalProperties.class](#additionalproperties) | +| Map> | patternProperties = Map.ofEntries(
    new AbstractMap.SimpleEntry<>(Pattern.compile("f.o"), [Fo.class](#fo)))
)
| + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMap](#propertiespatternpropertiesadditionalpropertiesinteractionmap) | validate([Map<?, ?>](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder +public class PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder
+builder for `Map` + +A class that builds the Map input type + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder()
Creates a builder that contains an empty map | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| Map | build()
Returns map input that should be used with Schema.validate | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | foo(List<@Nullable Object> value) | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | bar(List<@Nullable Object> value) | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | additionalProperty(String key, int value) | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | additionalProperty(String key, float value) | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | additionalProperty(String key, long value) | +| [PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) | additionalProperty(String key, double value) | + +## PropertiesPatternpropertiesAdditionalpropertiesInteractionMap +public static class PropertiesPatternpropertiesAdditionalpropertiesInteractionMap
+extends FrozenMap + +A class to store validated Map payloads + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| static [PropertiesPatternpropertiesAdditionalpropertiesInteractionMap](#propertiespatternpropertiesadditionalpropertiesinteractionmap) | of([Map](#propertiespatternpropertiesadditionalpropertiesinteractionmapbuilder) arg, SchemaConfiguration configuration) | +| FrozenList | foo()
[optional] | +| FrozenList | bar()
[optional] | +| Number | getAdditionalProperty(String name)
provides type safety for additional properties | + +## Bar +public static class Bar
+extends ListJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.ListJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +## Foo +public static class Foo
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Set> | type = Set.of(List.class) | +| Integer | maxItems = 3 | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## Fo +public static class Fo
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Integer | minItems = 2 | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | validate(String arg, SchemaConfiguration configuration) | +| Void | validate(Void arg, SchemaConfiguration configuration) | +| int | validate(int arg, SchemaConfiguration configuration) | +| long | validate(long arg, SchemaConfiguration configuration) | +| float | validate(float arg, SchemaConfiguration configuration) | +| double | validate(double arg, SchemaConfiguration configuration) | +| boolean | validate(boolean arg, SchemaConfiguration configuration) | +| FrozenMap | validate(Map<?, ?> arg, SchemaConfiguration configuration) | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## AdditionalProperties +public static class AdditionalProperties
+extends IntJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.IntJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/3_1_0_unit_test/java/docs/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.md b/samples/client/3_1_0_unit_test/java/docs/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.md new file mode 100644 index 00000000000..18d88bca856 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/docs/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.md @@ -0,0 +1,59 @@ +# RegexesAreNotAnchoredByDefaultAndAreCaseSensitive +org.openapijsonschematools.client.components.schemas.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.java +public class RegexesAreNotAnchoredByDefaultAndAreCaseSensitive + +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| static class | [RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1](#regexesarenotanchoredbydefaultandarecasesensitive1)
schema class | +| static class | [RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.X](#x)
schema class | +| static class | [RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.Schema092](#schema092)
schema class | + +## RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1 +public static class RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1
+extends JsonSchema + +A schema class that validates payloads + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| Map> | patternProperties = Map.ofEntries(
    new AbstractMap.SimpleEntry<>(Pattern.compile("[0-9]{2,}"), [Schema092.class](#schema092))),
    new AbstractMap.SimpleEntry<>(Pattern.compile("X_"), [X.class](#x)))
)
| + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | validate(String arg, SchemaConfiguration configuration) | +| Void | validate(Void arg, SchemaConfiguration configuration) | +| int | validate(int arg, SchemaConfiguration configuration) | +| long | validate(long arg, SchemaConfiguration configuration) | +| float | validate(float arg, SchemaConfiguration configuration) | +| double | validate(double arg, SchemaConfiguration configuration) | +| boolean | validate(boolean arg, SchemaConfiguration configuration) | +| FrozenMap | validate(Map<?, ?> arg, SchemaConfiguration configuration) | +| FrozenList<@Nullable Object> | validate(List arg, SchemaConfiguration configuration) | +| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) | +## X +public static class X
+extends StringJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.StringJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +## Schema092 +public static class Schema092
+extends BooleanJsonSchema + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.BooleanJsonSchema | +| ------------------------------------------------------------------ | +| validate | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.java new file mode 100644 index 00000000000..22dc5fc75bc --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidated.java @@ -0,0 +1,450 @@ +package org.openapijsonschematools.client.components.schemas; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidAdditionalPropertyException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.UnsetAddPropsSetter; +import org.openapijsonschematools.client.schemas.validation.BooleanSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.FrozenList; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.ListSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NullSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NumberSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.StringSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class MultipleSimultaneousPatternpropertiesAreValidated { + // nest classes so all schemas and input/output classes can be public + + + public static class A extends IntJsonSchema { + private static @Nullable A instance = null; + public static A getInstance() { + if (instance == null) { + instance = new A(); + } + return instance; + } + } + + + public static class Aaa extends JsonSchema implements NullSchemaValidator, BooleanSchemaValidator, NumberSchemaValidator, StringSchemaValidator, ListSchemaValidator>, MapSchemaValidator> { + private static @Nullable Aaa instance = null; + + protected Aaa() { + super(new JsonSchemaInfo() + .maximum(20) + ); + } + + public static Aaa getInstance() { + if (instance == null) { + instance = new Aaa(); + } + return instance; + } + + @Override + public Void validate(Void arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Void castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public boolean validate(boolean arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + boolean castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public Number validate(Number arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Number castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public int validate(int arg, SchemaConfiguration configuration) { + return (int) validate((Number) arg, configuration); + } + + public long validate(long arg, SchemaConfiguration configuration) { + return (long) validate((Number) arg, configuration); + } + + public float validate(float arg, SchemaConfiguration configuration) { + return (float) validate((Number) arg, configuration); + } + + public double validate(double arg, SchemaConfiguration configuration) { + return (double) validate((Number) arg, configuration); + } + + @Override + public String validate(String arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + String castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public String validate(LocalDate arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(ZonedDateTime arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(UUID arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public FrozenMap<@Nullable Object> getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return castProperties; + } + + public FrozenMap<@Nullable Object> validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg == null) { + return validate((Void) null, configuration); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return validate(boolArg, configuration); + } else if (arg instanceof Number) { + return validate((Number) arg, configuration); + } else if (arg instanceof String) { + return validate((String) arg, configuration); + } else if (arg instanceof List) { + return validate((List) arg, configuration); + } else if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg == null) { + return getNewInstance((Void) null, pathToItem, pathToSchemas); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return getNewInstance(boolArg, pathToItem, pathToSchemas); + } else if (arg instanceof Number) { + return getNewInstance((Number) arg, pathToItem, pathToSchemas); + } else if (arg instanceof String) { + return getNewInstance((String) arg, pathToItem, pathToSchemas); + } else if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } else if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } + + public static class MultipleSimultaneousPatternpropertiesAreValidated1 extends JsonSchema implements NullSchemaValidator, BooleanSchemaValidator, NumberSchemaValidator, StringSchemaValidator, ListSchemaValidator>, MapSchemaValidator> { + /* + NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + */ + private static @Nullable MultipleSimultaneousPatternpropertiesAreValidated1 instance = null; + + protected MultipleSimultaneousPatternpropertiesAreValidated1() { + super(new JsonSchemaInfo() + .patternProperties(Map.ofEntries( + new AbstractMap.SimpleEntry<>(Pattern.compile("a*"), A.class), + new AbstractMap.SimpleEntry<>(Pattern.compile("aaa*"), Aaa.class) + )) + ); + } + + public static MultipleSimultaneousPatternpropertiesAreValidated1 getInstance() { + if (instance == null) { + instance = new MultipleSimultaneousPatternpropertiesAreValidated1(); + } + return instance; + } + + @Override + public Void validate(Void arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Void castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public boolean validate(boolean arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + boolean castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public Number validate(Number arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Number castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public int validate(int arg, SchemaConfiguration configuration) { + return (int) validate((Number) arg, configuration); + } + + public long validate(long arg, SchemaConfiguration configuration) { + return (long) validate((Number) arg, configuration); + } + + public float validate(float arg, SchemaConfiguration configuration) { + return (float) validate((Number) arg, configuration); + } + + public double validate(double arg, SchemaConfiguration configuration) { + return (double) validate((Number) arg, configuration); + } + + @Override + public String validate(String arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + String castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public String validate(LocalDate arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(ZonedDateTime arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(UUID arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public FrozenMap<@Nullable Object> getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return castProperties; + } + + public FrozenMap<@Nullable Object> validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg == null) { + return validate((Void) null, configuration); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return validate(boolArg, configuration); + } else if (arg instanceof Number) { + return validate((Number) arg, configuration); + } else if (arg instanceof String) { + return validate((String) arg, configuration); + } else if (arg instanceof List) { + return validate((List) arg, configuration); + } else if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg == null) { + return getNewInstance((Void) null, pathToItem, pathToSchemas); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return getNewInstance(boolArg, pathToItem, pathToSchemas); + } else if (arg instanceof Number) { + return getNewInstance((Number) arg, pathToItem, pathToSchemas); + } else if (arg instanceof String) { + return getNewInstance((String) arg, pathToItem, pathToSchemas); + } else if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } else if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.java new file mode 100644 index 00000000000..bfa5eb9c00d --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.java @@ -0,0 +1,254 @@ +package org.openapijsonschematools.client.components.schemas; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidAdditionalPropertyException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.UnsetAddPropsSetter; +import org.openapijsonschematools.client.schemas.validation.BooleanSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.FrozenList; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.ListSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NullSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NumberSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.StringSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class PatternpropertiesValidatesPropertiesMatchingARegex { + // nest classes so all schemas and input/output classes can be public + + + public static class Fo extends IntJsonSchema { + private static @Nullable Fo instance = null; + public static Fo getInstance() { + if (instance == null) { + instance = new Fo(); + } + return instance; + } + } + + + public static class PatternpropertiesValidatesPropertiesMatchingARegex1 extends JsonSchema implements NullSchemaValidator, BooleanSchemaValidator, NumberSchemaValidator, StringSchemaValidator, ListSchemaValidator>, MapSchemaValidator> { + /* + NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + */ + private static @Nullable PatternpropertiesValidatesPropertiesMatchingARegex1 instance = null; + + protected PatternpropertiesValidatesPropertiesMatchingARegex1() { + super(new JsonSchemaInfo() + .patternProperties(Map.ofEntries( + new AbstractMap.SimpleEntry<>(Pattern.compile("f.*o"), Fo.class) + )) + ); + } + + public static PatternpropertiesValidatesPropertiesMatchingARegex1 getInstance() { + if (instance == null) { + instance = new PatternpropertiesValidatesPropertiesMatchingARegex1(); + } + return instance; + } + + @Override + public Void validate(Void arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Void castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public boolean validate(boolean arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + boolean castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public Number validate(Number arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Number castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public int validate(int arg, SchemaConfiguration configuration) { + return (int) validate((Number) arg, configuration); + } + + public long validate(long arg, SchemaConfiguration configuration) { + return (long) validate((Number) arg, configuration); + } + + public float validate(float arg, SchemaConfiguration configuration) { + return (float) validate((Number) arg, configuration); + } + + public double validate(double arg, SchemaConfiguration configuration) { + return (double) validate((Number) arg, configuration); + } + + @Override + public String validate(String arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + String castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public String validate(LocalDate arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(ZonedDateTime arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(UUID arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public FrozenMap<@Nullable Object> getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return castProperties; + } + + public FrozenMap<@Nullable Object> validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg == null) { + return validate((Void) null, configuration); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return validate(boolArg, configuration); + } else if (arg instanceof Number) { + return validate((Number) arg, configuration); + } else if (arg instanceof String) { + return validate((String) arg, configuration); + } else if (arg instanceof List) { + return validate((List) arg, configuration); + } else if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg == null) { + return getNewInstance((Void) null, pathToItem, pathToSchemas); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return getNewInstance(boolArg, pathToItem, pathToSchemas); + } else if (arg instanceof Number) { + return getNewInstance((Number) arg, pathToItem, pathToSchemas); + } else if (arg instanceof String) { + return getNewInstance((String) arg, pathToItem, pathToSchemas); + } else if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } else if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java index f1447b1a0c0..a634e683d22 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java @@ -1,6 +1,7 @@ package org.openapijsonschematools.client.components.schemas; import java.time.LocalDate; import java.time.ZonedDateTime; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; @@ -10,6 +11,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; @@ -58,6 +60,9 @@ public static class PatternpropertiesWithNullValuedInstanceProperties1 extends J protected PatternpropertiesWithNullValuedInstanceProperties1() { super(new JsonSchemaInfo() + .patternProperties(Map.ofEntries( + new AbstractMap.SimpleEntry<>(Pattern.compile("^.*bar$"), Bar.class) + )) ); } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.java new file mode 100644 index 00000000000..756dca96e07 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.java @@ -0,0 +1,537 @@ +package org.openapijsonschematools.client.components.schemas; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidAdditionalPropertyException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.BaseBuilder; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.ListJsonSchema; +import org.openapijsonschematools.client.schemas.UnsetAddPropsSetter; +import org.openapijsonschematools.client.schemas.validation.BooleanSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.FrozenList; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.ListSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.NullSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NumberSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.StringSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class PropertiesPatternpropertiesAdditionalpropertiesInteraction { + // nest classes so all schemas and input/output classes can be public + + + public static class AdditionalProperties extends IntJsonSchema { + private static @Nullable AdditionalProperties instance = null; + public static AdditionalProperties getInstance() { + if (instance == null) { + instance = new AdditionalProperties(); + } + return instance; + } + } + + + public static class Fo extends JsonSchema implements NullSchemaValidator, BooleanSchemaValidator, NumberSchemaValidator, StringSchemaValidator, ListSchemaValidator>, MapSchemaValidator> { + private static @Nullable Fo instance = null; + + protected Fo() { + super(new JsonSchemaInfo() + .minItems(2) + ); + } + + public static Fo getInstance() { + if (instance == null) { + instance = new Fo(); + } + return instance; + } + + @Override + public Void validate(Void arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Void castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public boolean validate(boolean arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + boolean castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public Number validate(Number arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Number castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public int validate(int arg, SchemaConfiguration configuration) { + return (int) validate((Number) arg, configuration); + } + + public long validate(long arg, SchemaConfiguration configuration) { + return (long) validate((Number) arg, configuration); + } + + public float validate(float arg, SchemaConfiguration configuration) { + return (float) validate((Number) arg, configuration); + } + + public double validate(double arg, SchemaConfiguration configuration) { + return (double) validate((Number) arg, configuration); + } + + @Override + public String validate(String arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + String castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public String validate(LocalDate arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(ZonedDateTime arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(UUID arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public FrozenMap<@Nullable Object> getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return castProperties; + } + + public FrozenMap<@Nullable Object> validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg == null) { + return validate((Void) null, configuration); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return validate(boolArg, configuration); + } else if (arg instanceof Number) { + return validate((Number) arg, configuration); + } else if (arg instanceof String) { + return validate((String) arg, configuration); + } else if (arg instanceof List) { + return validate((List) arg, configuration); + } else if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg == null) { + return getNewInstance((Void) null, pathToItem, pathToSchemas); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return getNewInstance(boolArg, pathToItem, pathToSchemas); + } else if (arg instanceof Number) { + return getNewInstance((Number) arg, pathToItem, pathToSchemas); + } else if (arg instanceof String) { + return getNewInstance((String) arg, pathToItem, pathToSchemas); + } else if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } else if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } + + public static class Foo extends JsonSchema implements ListSchemaValidator> { + private static @Nullable Foo instance = null; + + protected Foo() { + super(new JsonSchemaInfo() + .type(Set.of(List.class)) + .maxItems(3) + ); + } + + public static Foo getInstance() { + if (instance == null) { + instance = new Foo(); + } + return instance; + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof List) { + return validate((List) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } + + public static class Bar extends ListJsonSchema { + private static @Nullable Bar instance = null; + public static Bar getInstance() { + if (instance == null) { + instance = new Bar(); + } + return instance; + } + } + + + public static class PropertiesPatternpropertiesAdditionalpropertiesInteractionMap extends FrozenMap { + protected PropertiesPatternpropertiesAdditionalpropertiesInteractionMap(FrozenMap m) { + super(m); + } + public static final Set requiredKeys = Set.of(); + public static final Set optionalKeys = Set.of( + "foo", + "bar" + ); + public static PropertiesPatternpropertiesAdditionalpropertiesInteractionMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance().validate(arg, configuration); + } + + public FrozenList foo() throws UnsetPropertyException { + String key = "foo"; + throwIfKeyNotPresent(key); + Object value = get(key); + if (!(value instanceof FrozenList)) { + throw new InvalidTypeException("Invalid value stored for foo"); + } + return (FrozenList) value; + } + + public FrozenList bar() throws UnsetPropertyException { + String key = "bar"; + throwIfKeyNotPresent(key); + Object value = get(key); + if (!(value instanceof FrozenList)) { + throw new InvalidTypeException("Invalid value stored for bar"); + } + return (FrozenList) value; + } + + public Number getAdditionalProperty(String name) throws UnsetPropertyException, InvalidAdditionalPropertyException { + throwIfKeyKnown(name, requiredKeys, optionalKeys); + var value = getOrThrow(name); + if (!(value instanceof Number)) { + throw new InvalidTypeException("Invalid value stored for " + name); + } + return (Number) value; + } + } + + public interface SetterForFoo { + Map getInstance(); + T getBuilderAfterFoo(Map instance); + + default T foo(List<@Nullable Object> value) { + var instance = getInstance(); + instance.put("foo", value); + return getBuilderAfterFoo(instance); + } + } + + public interface SetterForBar { + Map getInstance(); + T getBuilderAfterBar(Map instance); + + default T bar(List<@Nullable Object> value) { + var instance = getInstance(); + instance.put("bar", value); + return getBuilderAfterBar(instance); + } + } + + public interface SetterForAdditionalProperties { + Set getKnownKeys(); + Map getInstance(); + T getBuilderAfterAdditionalProperty(Map instance); + + default T additionalProperty(String key, int value) throws InvalidAdditionalPropertyException { + MapUtils.throwIfKeyKnown(key, getKnownKeys(), true); + var instance = getInstance(); + instance.put(key, value); + return getBuilderAfterAdditionalProperty(instance); + } + + default T additionalProperty(String key, float value) throws InvalidAdditionalPropertyException { + MapUtils.throwIfKeyKnown(key, getKnownKeys(), true); + var instance = getInstance(); + instance.put(key, value); + return getBuilderAfterAdditionalProperty(instance); + } + + default T additionalProperty(String key, long value) throws InvalidAdditionalPropertyException { + MapUtils.throwIfKeyKnown(key, getKnownKeys(), true); + var instance = getInstance(); + instance.put(key, value); + return getBuilderAfterAdditionalProperty(instance); + } + + default T additionalProperty(String key, double value) throws InvalidAdditionalPropertyException { + MapUtils.throwIfKeyKnown(key, getKnownKeys(), true); + var instance = getInstance(); + instance.put(key, value); + return getBuilderAfterAdditionalProperty(instance); + } + } + + public static class PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder implements BaseBuilder, SetterForFoo, SetterForBar, SetterForAdditionalProperties { + private final Map instance; + private static final Set knownKeys = Set.of( + "foo", + "bar" + ); + public Set getKnownKeys() { + return knownKeys; + } + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder getBuilderAfterFoo(Map instance) { + return this; + } + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder getBuilderAfterBar(Map instance) { + return this; + } + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMapBuilder getBuilderAfterAdditionalProperty(Map instance) { + return this; + } + } + + + public static class PropertiesPatternpropertiesAdditionalpropertiesInteraction1 extends JsonSchema implements MapSchemaValidator { + /* + NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + */ + private static @Nullable PropertiesPatternpropertiesAdditionalpropertiesInteraction1 instance = null; + + protected PropertiesPatternpropertiesAdditionalpropertiesInteraction1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("foo", Foo.class), + new PropertyEntry("bar", Bar.class) + )) + .additionalProperties(AdditionalProperties.class) + .patternProperties(Map.ofEntries( + new AbstractMap.SimpleEntry<>(Pattern.compile("f.o"), Fo.class) + )) + ); + } + + public static PropertiesPatternpropertiesAdditionalpropertiesInteraction1 getInstance() { + if (instance == null) { + instance = new PropertiesPatternpropertiesAdditionalpropertiesInteraction1(); + } + return instance; + } + + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + if (!(propertyInstance instanceof Object)) { + throw new InvalidTypeException("Invalid instantiated value"); + } + properties.put(propertyName, (Object) propertyInstance); + } + FrozenMap castProperties = new FrozenMap<>(properties); + return new PropertiesPatternpropertiesAdditionalpropertiesInteractionMap(castProperties); + } + + public PropertiesPatternpropertiesAdditionalpropertiesInteractionMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } + +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.java new file mode 100644 index 00000000000..96b9393ba91 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.java @@ -0,0 +1,267 @@ +package org.openapijsonschematools.client.components.schemas; +import java.time.LocalDate; +import java.time.ZonedDateTime; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidAdditionalPropertyException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.BooleanJsonSchema; +import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.UnsetAddPropsSetter; +import org.openapijsonschematools.client.schemas.validation.BooleanSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.FrozenList; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.ListSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NullSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.NumberSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.StringSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class RegexesAreNotAnchoredByDefaultAndAreCaseSensitive { + // nest classes so all schemas and input/output classes can be public + + + public static class Schema092 extends BooleanJsonSchema { + private static @Nullable Schema092 instance = null; + public static Schema092 getInstance() { + if (instance == null) { + instance = new Schema092(); + } + return instance; + } + } + + + public static class X extends StringJsonSchema { + private static @Nullable X instance = null; + public static X getInstance() { + if (instance == null) { + instance = new X(); + } + return instance; + } + } + + + public static class RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1 extends JsonSchema implements NullSchemaValidator, BooleanSchemaValidator, NumberSchemaValidator, StringSchemaValidator, ListSchemaValidator>, MapSchemaValidator> { + /* + NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + */ + private static @Nullable RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1 instance = null; + + protected RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1() { + super(new JsonSchemaInfo() + .patternProperties(Map.ofEntries( + new AbstractMap.SimpleEntry<>(Pattern.compile("[0-9]{2,}"), Schema092.class), + new AbstractMap.SimpleEntry<>(Pattern.compile("X_"), X.class) + )) + ); + } + + public static RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1 getInstance() { + if (instance == null) { + instance = new RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1(); + } + return instance; + } + + @Override + public Void validate(Void arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Void castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public boolean validate(boolean arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + boolean castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + @Override + public Number validate(Number arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Number castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public int validate(int arg, SchemaConfiguration configuration) { + return (int) validate((Number) arg, configuration); + } + + public long validate(long arg, SchemaConfiguration configuration) { + return (long) validate((Number) arg, configuration); + } + + public float validate(float arg, SchemaConfiguration configuration) { + return (float) validate((Number) arg, configuration); + } + + public double validate(double arg, SchemaConfiguration configuration) { + return (double) validate((Number) arg, configuration); + } + + @Override + public String validate(String arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + String castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + getPathToSchemas(this, castArg, validationMetadata, pathSet); + return castArg; + } + + public String validate(LocalDate arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(ZonedDateTime arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + public String validate(UUID arg, SchemaConfiguration configuration) throws ValidationException { + return validate(arg.toString(), configuration); + } + + @Override + public FrozenList<@Nullable Object> getNewInstance(List arg, List pathToItem, PathToSchemasMap pathToSchemas) { + List<@Nullable Object> items = new ArrayList<>(); + int i = 0; + for (Object item: arg) { + List itemPathToItem = new ArrayList<>(pathToItem); + itemPathToItem.add(i); + LinkedHashMap schemas = pathToSchemas.get(itemPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema itemSchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object itemInstance = itemSchema.getNewInstance(item, itemPathToItem, pathToSchemas); + items.add(itemInstance); + i += 1; + } + FrozenList<@Nullable Object> newInstanceItems = new FrozenList<>(items); + return newInstanceItems; + } + + public FrozenList<@Nullable Object> validate(List arg, SchemaConfiguration configuration) throws ValidationException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + List castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public FrozenMap<@Nullable Object> getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return castProperties; + } + + public FrozenMap<@Nullable Object> validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0]"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + PathToSchemasMap validatedPathToSchemas = new PathToSchemasMap(); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, validatedPathToSchemas, new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg == null) { + return validate((Void) null, configuration); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return validate(boolArg, configuration); + } else if (arg instanceof Number) { + return validate((Number) arg, configuration); + } else if (arg instanceof String) { + return validate((String) arg, configuration); + } else if (arg instanceof List) { + return validate((List) arg, configuration); + } else if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg == null) { + return getNewInstance((Void) null, pathToItem, pathToSchemas); + } else if (arg instanceof Boolean) { + boolean boolArg = (Boolean) arg; + return getNewInstance(boolArg, pathToItem, pathToSchemas); + } else if (arg instanceof Number) { + return getNewInstance((Number) arg, pathToItem, pathToSchemas); + } else if (arg instanceof String) { + return getNewInstance((String) arg, pathToItem, pathToSchemas); + } else if (arg instanceof List) { + return getNewInstance((List) arg, pathToItem, pathToSchemas); + } else if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + } +} 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 550b384d702..81adeddb054 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,8 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; @@ -34,11 +35,13 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.removeAll(schema.properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - // todo add handling for validatedPatternProperties for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); propPathToItem.add(addPropName); + if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + continue; + } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, validationMetadata.configuration(), 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 13b72b0976c..0c662704072 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,8 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7ab78f6ffb1..f170798d97c 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,8 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 0de1d98a87a..f77d5360885 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,8 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 10ab214c5a6..a4459d8a9db 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,7 +18,8 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/DependentRequiredValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java index 8c91c9316fc..554a49120d0 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java @@ -20,7 +20,8 @@ public DependentRequiredValidator(Map> dependentRequired) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/DependentSchemasValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java index a689279e1e1..6ad17c0d139 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java @@ -20,7 +20,8 @@ public DependentSchemasValidator(Map> depend JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/EnumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java index 7102fe13c4b..ad242f735b2 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,8 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 b5f13f6e68d..64d86b2722a 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,8 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 ded38226b98..a596a7e80ce 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,8 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8bbabfaa139..be5e2d928b5 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,8 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 fc9e0454687..bf3ee6ecf15 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,8 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 562dc06cab0..e567b7f5dc2 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 @@ -52,6 +52,7 @@ public abstract class JsonSchema { public final @Nullable Class propertyNames; public @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; + public @Nullable Map> patternProperties; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -276,6 +277,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { new DependentSchemasValidator(this.dependentSchemas) ); } + this.patternProperties = jsonSchemaInfo.patternProperties; + if (this.patternProperties != null) { + keywordToValidator.put( + "patternProperties", + new PatternPropertiesValidator(this.patternProperties) + ); + } this.keywordToValidator = keywordToValidator; } @@ -295,6 +303,11 @@ public static PathToSchemasMap validate( if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); } + @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; + KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); + if (patternPropertiesValidator != null) { + patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); if (disabledKeywords.contains(jsonKeyword)) { @@ -308,7 +321,8 @@ public static PathToSchemasMap validate( jsonSchema, arg, validationMetadata, - containsPathToSchemas + containsPathToSchemas, + patternPropertiesPathToSchemas ); if (otherPathToSchemas == null) { continue; 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 c4f4ddf1042..45c911b0c18 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 @@ -172,4 +172,9 @@ public JsonSchemaInfo dependentSchemas(Map> this.dependentSchemas = dependentSchemas; return this; } + public @Nullable Map> patternProperties = null; + public JsonSchemaInfo patternProperties(Map> patternProperties) { + this.patternProperties = patternProperties; + 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 d106dba9680..3ff931654e5 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,8 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( @@ -20,4 +21,11 @@ default List getContainsPathToSchemas( ) { return new ArrayList<>(); } + + default PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + return new PathToSchemasMap(); + } } \ 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/MaxContainsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java index 3b61e377df3..a234c2907bd 100644 --- 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 @@ -17,7 +17,8 @@ public MaxContainsValidator(int maxContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/MaxItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxItemsValidator.java index 35f1ab771f9..21d175aeb60 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,8 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d45fa4aec05..4309ad392ab 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,8 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d3ca51afd54..0933d14568b 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,8 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8ac89924b7f..b7c08a08cb5 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,8 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 index dccb15435a4..70239e3fa3b 100644 --- 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 @@ -17,7 +17,8 @@ public MinContainsValidator(int minContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/MinItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinItemsValidator.java index 790a84d323b..5b452150aef 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,8 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 885b3293dc4..9dbac1aeb11 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,8 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 28f777b515d..24bb979c613 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,8 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 86aacbc97f0..34d6d27c5bf 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,8 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 129b6382e60..b5601e16fc9 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,8 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7d28774a9d3..5a9e59f530b 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,8 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 2ddb40e1aeb..e0c51fe2a11 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,8 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/PatternPropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java new file mode 100644 index 00000000000..fa486ddcdab --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java @@ -0,0 +1,67 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class PatternPropertiesValidator implements KeywordValidator { + public final Map> patternProperties; + + public PatternPropertiesValidator(Map> patternProperties) { + this.patternProperties = patternProperties; + } + + @Override + public @Nullable PathToSchemasMap validate( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas + ) { + if (!(arg instanceof Map)) { + return null; + } + return patternPropertiesPathToSchemas; + } + + public PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg)) { + return new PathToSchemasMap(); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: mapArg.entrySet()) { + Object entryKey = entry.getKey(); + if (!(entryKey instanceof String key)) { + throw new InvalidTypeException("Invalid non-string type for map key"); + } + List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + propPathToItem.add(key); + ValidationMetadata propValidationMetadata = new ValidationMetadata( + propPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + for (Map.Entry> patternPropEntry: patternProperties.entrySet()) { + if (!patternPropEntry.getKey().matcher(key).find()) { + continue; + } + + Class patternPropClass = patternPropEntry.getValue(); + JsonSchema patternPropSchema = JsonSchemaFactory.getInstance(patternPropClass); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(patternPropSchema, entry.getValue(), propValidationMetadata); + pathToSchemas.update(otherPathToSchemas); + } + } + return pathToSchemas; + } +} + 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 7ab82a715fb..92678f1cca4 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,8 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8f52ce0bd26..94599597a13 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,8 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/PropertyNamesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java index b0c50ba11e3..f4ec5ab6239 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java @@ -18,7 +18,8 @@ public PropertyNamesValidator(Class propertyNames) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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/RequiredValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 2a4b53f1ece..148be09c410 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,8 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 3d9d490d345..fd827d49e13 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,8 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 5916946e50f..419823634e3 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,8 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidatedTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidatedTest.java new file mode 100644 index 00000000000..1c9e027bdf5 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/MultipleSimultaneousPatternpropertiesAreValidatedTest.java @@ -0,0 +1,132 @@ +package org.openapijsonschematools.client.components.schemas; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.AbstractMap; + +public class MultipleSimultaneousPatternpropertiesAreValidatedTest { + static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.onlyFormat()); + + @Test + public void testASimultaneousMatchIsValidPasses() { + // a simultaneous match is valid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "aaaa", + 18 + ) + ), + configuration + ); + } + + @Test + public void testASingleValidMatchIsValidPasses() { + // a single valid match is valid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a", + 21 + ) + ), + configuration + ); + } + + @Test + public void testAnInvalidDueToTheOtherIsInvalidFails() { + // an invalid due to the other is invalid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "aaaa", + 31 + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testMultipleMatchesIsValidPasses() { + // multiple matches is valid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a", + 21 + ), + new AbstractMap.SimpleEntry( + "aaaa", + 18 + ) + ), + configuration + ); + } + + @Test + public void testAnInvalidDueToOneIsInvalidFails() { + // an invalid due to one is invalid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a", + "bar" + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testAnInvalidDueToBothIsInvalidFails() { + // an invalid due to both is invalid + final var schema = MultipleSimultaneousPatternpropertiesAreValidated.MultipleSimultaneousPatternpropertiesAreValidated1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "aaa", + "foo" + ), + new AbstractMap.SimpleEntry( + "aaaa", + 31 + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegexTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegexTest.java new file mode 100644 index 00000000000..0a067911bbc --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegexTest.java @@ -0,0 +1,133 @@ +package org.openapijsonschematools.client.components.schemas; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.AbstractMap; + +public class PatternpropertiesValidatesPropertiesMatchingARegexTest { + static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.onlyFormat()); + + @Test + public void testMultipleInvalidMatchesIsInvalidFails() { + // multiple invalid matches is invalid + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "foo", + "bar" + ), + new AbstractMap.SimpleEntry( + "foooooo", + "baz" + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testASingleValidMatchIsValidPasses() { + // a single valid match is valid + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "foo", + 1 + ) + ), + configuration + ); + } + + @Test + public void testIgnoresOtherNonObjectsPasses() { + // ignores other non-objects + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + schema.validate( + 12, + configuration + ); + } + + @Test + public void testASingleInvalidMatchIsInvalidFails() { + // a single invalid match is invalid + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "foo", + "bar" + ), + new AbstractMap.SimpleEntry( + "fooooo", + 2 + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testMultipleValidMatchesIsValidPasses() { + // multiple valid matches is valid + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "foo", + 1 + ), + new AbstractMap.SimpleEntry( + "foooooo", + 2 + ) + ), + configuration + ); + } + + @Test + public void testIgnoresArraysPasses() { + // ignores arrays + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + schema.validate( + Arrays.asList( + "foo" + ), + configuration + ); + } + + @Test + public void testIgnoresStringsPasses() { + // ignores strings + final var schema = PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1.getInstance(); + schema.validate( + "foo", + configuration + ); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteractionTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteractionTest.java new file mode 100644 index 00000000000..ecdcb7e6268 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteractionTest.java @@ -0,0 +1,173 @@ +package org.openapijsonschematools.client.components.schemas; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.AbstractMap; + +public class PropertiesPatternpropertiesAdditionalpropertiesInteractionTest { + static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.onlyFormat()); + + @Test + public void testPropertyValidatesPropertyPasses() { + // property validates property + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "foo", + Arrays.asList( + 1, + 2 + ) + ) + ), + configuration + ); + } + + @Test + public void testAdditionalpropertyIgnoresPropertyPasses() { + // additionalProperty ignores property + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "bar", + Arrays.asList( + ) + ) + ), + configuration + ); + } + + @Test + public void testPatternpropertyInvalidatesPropertyFails() { + // patternProperty invalidates property + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "foo", + Arrays.asList( + ) + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testPatternpropertyValidatesNonpropertyPasses() { + // patternProperty validates nonproperty + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "fxo", + Arrays.asList( + 1, + 2 + ) + ) + ), + configuration + ); + } + + @Test + public void testPatternpropertyInvalidatesNonpropertyFails() { + // patternProperty invalidates nonproperty + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "fxo", + Arrays.asList( + ) + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testPropertyInvalidatesPropertyFails() { + // property invalidates property + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry>( + "foo", + Arrays.asList( + 1, + 2, + 3, + 4 + ) + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testAdditionalpropertyInvalidatesOthersFails() { + // additionalProperty invalidates others + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "quux", + "foo" + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testAdditionalpropertyValidatesOthersPasses() { + // additionalProperty validates others + final var schema = PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "quux", + 3 + ) + ), + configuration + ); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitiveTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitiveTest.java new file mode 100644 index 00000000000..89c540b0451 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/components/schemas/RegexesAreNotAnchoredByDefaultAndAreCaseSensitiveTest.java @@ -0,0 +1,89 @@ +package org.openapijsonschematools.client.components.schemas; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.AbstractMap; + +public class RegexesAreNotAnchoredByDefaultAndAreCaseSensitiveTest { + static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.onlyFormat()); + + @Test + public void testRegexesAreCaseSensitivePasses() { + // regexes are case sensitive + final var schema = RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a_x_3", + 3 + ) + ), + configuration + ); + } + + @Test + public void testNonRecognizedMembersAreIgnoredPasses() { + // non recognized members are ignored + final var schema = RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1.getInstance(); + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "answer 1", + "42" + ) + ), + configuration + ); + } + + @Test + public void testRecognizedMembersAreAccountedForFails() { + // recognized members are accounted for + final var schema = RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a31b", + null + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } + + @Test + public void testRegexesAreCaseSensitive2Fails() { + // regexes are case sensitive, 2 + final var schema = RegexesAreNotAnchoredByDefaultAndAreCaseSensitive.RegexesAreNotAnchoredByDefaultAndAreCaseSensitive1.getInstance(); + try { + schema.validate( + MapUtils.makeMap( + new AbstractMap.SimpleEntry( + "a_X_3", + 3 + ) + ), + configuration + ); + throw new RuntimeException("A different exception must be thrown"); + } catch (ValidationException | InvalidTypeException ignored) { + ; + } + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java index 374665ef028..e23076a75b1 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java @@ -78,7 +78,8 @@ public void testCorrectPropertySucceeds() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -108,7 +109,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -131,7 +133,8 @@ public void testIncorrectPropertyValueFails() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java index b584efdf406..69ffff00ce1 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java @@ -34,7 +34,8 @@ public void testIntFormatSucceedsWithFloat() { NumberJsonSchema.getInstance(), 1.0f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -46,7 +47,8 @@ public void testIntFormatFailsWithFloat() { NumberJsonSchema.getInstance(), 3.14f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -57,7 +59,8 @@ public void testIntFormatSucceedsWithInt() { NumberJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -69,7 +72,8 @@ public void testInt32UnderMinFails() { NumberJsonSchema.getInstance(), -2147483649L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -80,7 +84,8 @@ public void testInt32InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -2147483648, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -92,7 +97,8 @@ public void testInt32InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 2147483647, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -104,7 +110,8 @@ public void testInt32OverMaxFails() { NumberJsonSchema.getInstance(), 2147483648L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -116,7 +123,8 @@ public void testInt64UnderMinFails() { NumberJsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -127,7 +135,8 @@ public void testInt64InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -9223372036854775808L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -139,7 +148,8 @@ public void testInt64InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 9223372036854775807L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -152,7 +162,8 @@ public void testInt64OverMaxFails() { NumberJsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -163,7 +174,8 @@ public void testFloatUnderMinFails() { NumberJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -174,7 +186,8 @@ public void testFloatInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -186,7 +199,8 @@ public void testFloatInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -198,7 +212,8 @@ public void testFloatOverMaxFails() { NumberJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -209,7 +224,8 @@ public void testDoubleUnderMinFails() { NumberJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -220,7 +236,8 @@ public void testDoubleInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -232,7 +249,8 @@ public void testDoubleInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -244,7 +262,8 @@ public void testDoubleOverMaxFails() { NumberJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -255,7 +274,8 @@ public void testInvalidNumberStringFails() { NumberJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -266,7 +286,8 @@ public void testValidFloatNumberStringSucceeds() { NumberJsonSchema.getInstance(), "3.14", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -278,7 +299,8 @@ public void testValidIntNumberStringSucceeds() { NumberJsonSchema.getInstance(), "1", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -290,7 +312,8 @@ public void testInvalidDateStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -301,7 +324,8 @@ public void testValidDateStringSucceeds() { StringJsonSchema.getInstance(), "2017-01-20", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -313,7 +337,8 @@ public void testInvalidDateTimeStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -324,7 +349,8 @@ public void testValidDateTimeStringSucceeds() { StringJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java index 84da9687817..2e3fcdb5129 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java @@ -37,7 +37,8 @@ public void testCorrectItemsSucceeds() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -67,7 +68,8 @@ public void testNotApplicableTypeReturnsNull() { ListJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -89,8 +91,8 @@ public void testIncorrectItemFails() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } - diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java index 8d1d3fc053b..9367dc3268d 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java @@ -41,7 +41,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -73,7 +74,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -98,7 +100,8 @@ public void testIncorrectPropertyValueFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java index a5dbf4a8c03..53d0fced6ca 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java @@ -40,7 +40,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -62,7 +63,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -87,7 +89,8 @@ public void testIncorrectPropertyFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java index 362cca6e8ba..1dffdb7eb98 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java @@ -32,7 +32,8 @@ public void testValidateSucceeds() { StringJsonSchema.getInstance(), "hi", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -52,7 +53,8 @@ public void testValidateFailsIntIsNotString() { StringJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 1ff7ecf882a..e9b99c98b10 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -735,6 +735,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/NullValueMeth src/main/java/org/openapijsonschematools/client/schemas/validation/NumberSchemaValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PathToSchemasMap.java +src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyEntry.java diff --git a/samples/client/petstore/java/docs/components/schemas/Apple.md b/samples/client/petstore/java/docs/components/schemas/Apple.md index cc180e02a97..ed8c8fe9a9c 100644 --- a/samples/client/petstore/java/docs/components/schemas/Apple.md +++ b/samples/client/petstore/java/docs/components/schemas/Apple.md @@ -157,7 +157,7 @@ String validatedPayload = Apple.Origin.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "^[A-Z\\s]*$",
    Pattern.CASE_INSENSITIVE
)))
| +| Pattern | pattern = Pattern.compile(
    "^[A-Z\\s]*$",
    Pattern.CASE_INSENSITIVE
)
| ### Method Summary | Modifier and Type | Method and Description | @@ -196,7 +196,7 @@ String validatedPayload = Apple.Cultivar.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "^[a-zA-Z\\s]*$"
)))
| +| Pattern | pattern = Pattern.compile(
    "^[a-zA-Z\\s]*$"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/docs/components/schemas/ComposedOneOfDifferentTypes.md b/samples/client/petstore/java/docs/components/schemas/ComposedOneOfDifferentTypes.md index 33acb5f87f9..b3abb6224a3 100644 --- a/samples/client/petstore/java/docs/components/schemas/ComposedOneOfDifferentTypes.md +++ b/samples/client/petstore/java/docs/components/schemas/ComposedOneOfDifferentTypes.md @@ -80,7 +80,7 @@ String validatedPayload = ComposedOneOfDifferentTypes.Schema6.validate( | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| | String | type = "date-time"; | -| Pattern | pattern =
    "^2020.*"
)))
| +| Pattern | pattern = Pattern.compile(
    "^2020.*"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/docs/components/schemas/DateTimeWithValidations.md b/samples/client/petstore/java/docs/components/schemas/DateTimeWithValidations.md index 90cab7a79c1..42901d1c5a6 100644 --- a/samples/client/petstore/java/docs/components/schemas/DateTimeWithValidations.md +++ b/samples/client/petstore/java/docs/components/schemas/DateTimeWithValidations.md @@ -43,7 +43,7 @@ String validatedPayload = DateTimeWithValidations.DateTimeWithValidations1.valid | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| | String | type = "date-time"; | -| Pattern | pattern =
    "^2020.*"
)))
| +| Pattern | pattern = Pattern.compile(
    "^2020.*"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/docs/components/schemas/DateWithValidations.md b/samples/client/petstore/java/docs/components/schemas/DateWithValidations.md index 2e0e82126e3..5654efcd842 100644 --- a/samples/client/petstore/java/docs/components/schemas/DateWithValidations.md +++ b/samples/client/petstore/java/docs/components/schemas/DateWithValidations.md @@ -43,7 +43,7 @@ String validatedPayload = DateWithValidations.DateWithValidations1.validate( | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| | String | type = "date"; | -| Pattern | pattern =
    "^2020.*"
)))
| +| Pattern | pattern = Pattern.compile(
    "^2020.*"
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/docs/components/schemas/FormatTest.md b/samples/client/petstore/java/docs/components/schemas/FormatTest.md index 00841d28a0b..553716c02c5 100644 --- a/samples/client/petstore/java/docs/components/schemas/FormatTest.md +++ b/samples/client/petstore/java/docs/components/schemas/FormatTest.md @@ -542,7 +542,7 @@ String validatedPayload = FormatTest.PatternWithDigitsAndDelimiter.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "^image_\\d{1,3}$",
    Pattern.CASE_INSENSITIVE
)))
| +| Pattern | pattern = Pattern.compile(
    "^image_\\d{1,3}$",
    Pattern.CASE_INSENSITIVE
)
| ### Method Summary | Modifier and Type | Method and Description | @@ -584,7 +584,7 @@ String validatedPayload = FormatTest.PatternWithDigits.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "^\\d{10}$"
)))
| +| Pattern | pattern = Pattern.compile(
    "^\\d{10}$"
)
| ### Method Summary | Modifier and Type | Method and Description | @@ -716,7 +716,7 @@ String validatedPayload = FormatTest.StringSchema.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "[a-z]",
    Pattern.CASE_INSENSITIVE
)))
| +| Pattern | pattern = Pattern.compile(
    "[a-z]",
    Pattern.CASE_INSENSITIVE
)
| ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/docs/paths/fake/post/requestbody/content/applicationxwwwformurlencoded/Schema.md b/samples/client/petstore/java/docs/paths/fake/post/requestbody/content/applicationxwwwformurlencoded/Schema.md index df826f2bc7a..37f3c51226b 100644 --- a/samples/client/petstore/java/docs/paths/fake/post/requestbody/content/applicationxwwwformurlencoded/Schema.md +++ b/samples/client/petstore/java/docs/paths/fake/post/requestbody/content/applicationxwwwformurlencoded/Schema.md @@ -634,7 +634,7 @@ String validatedPayload = Schema.PatternWithoutDelimiter.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "^[A-Z].*"
)))
| +| Pattern | pattern = Pattern.compile(
    "^[A-Z].*"
)
| ### Method Summary | Modifier and Type | Method and Description | @@ -676,7 +676,7 @@ String validatedPayload = Schema.StringSchema.validate( | Modifier and Type | Field and Description | | ----------------- | ---------------------- | | Set> | type = Set.of(
    String.class
)
| -| Pattern | pattern =
    "[a-z]",
    Pattern.CASE_INSENSITIVE
)))
| +| Pattern | pattern = Pattern.compile(
    "[a-z]",
    Pattern.CASE_INSENSITIVE
)
| ### Method Summary | Modifier and Type | Method and Description | 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 550b384d702..81adeddb054 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,8 @@ public AdditionalPropertiesValidator(Class additionalPrope JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; @@ -34,11 +35,13 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.removeAll(schema.properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - // todo add handling for validatedPatternProperties for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); propPathToItem.add(addPropName); + if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + continue; + } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, validationMetadata.configuration(), 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 13b72b0976c..0c662704072 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,8 @@ public AllOfValidator(List> allOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7ab78f6ffb1..f170798d97c 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,8 @@ public AnyOfValidator(List> anyOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 0de1d98a87a..f77d5360885 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,8 @@ public ConstValidator(@Nullable Object constValue) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 10ab214c5a6..a4459d8a9db 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,7 +18,8 @@ public ContainsValidator(Class contains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java index 8c91c9316fc..554a49120d0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java @@ -20,7 +20,8 @@ public DependentRequiredValidator(Map> dependentRequired) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java index a689279e1e1..6ad17c0d139 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java @@ -20,7 +20,8 @@ public DependentSchemasValidator(Map> depend JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; 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 7102fe13c4b..ad242f735b2 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,8 @@ private boolean enumContainsArg(@Nullable Object arg){ JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 b5f13f6e68d..64d86b2722a 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,8 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 ded38226b98..a596a7e80ce 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,8 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8bbabfaa139..be5e2d928b5 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,8 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 fc9e0454687..bf3ee6ecf15 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,8 @@ public ItemsValidator(Class items) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 562dc06cab0..e567b7f5dc2 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 @@ -52,6 +52,7 @@ public abstract class JsonSchema { public final @Nullable Class propertyNames; public @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; + public @Nullable Map> patternProperties; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -276,6 +277,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { new DependentSchemasValidator(this.dependentSchemas) ); } + this.patternProperties = jsonSchemaInfo.patternProperties; + if (this.patternProperties != null) { + keywordToValidator.put( + "patternProperties", + new PatternPropertiesValidator(this.patternProperties) + ); + } this.keywordToValidator = keywordToValidator; } @@ -295,6 +303,11 @@ public static PathToSchemasMap validate( if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); } + @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; + KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); + if (patternPropertiesValidator != null) { + patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); if (disabledKeywords.contains(jsonKeyword)) { @@ -308,7 +321,8 @@ public static PathToSchemasMap validate( jsonSchema, arg, validationMetadata, - containsPathToSchemas + containsPathToSchemas, + patternPropertiesPathToSchemas ); if (otherPathToSchemas == null) { continue; 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 c4f4ddf1042..45c911b0c18 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 @@ -172,4 +172,9 @@ public JsonSchemaInfo dependentSchemas(Map> this.dependentSchemas = dependentSchemas; return this; } + public @Nullable Map> patternProperties = null; + public JsonSchemaInfo patternProperties(Map> patternProperties) { + this.patternProperties = patternProperties; + 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 d106dba9680..3ff931654e5 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,8 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( @@ -20,4 +21,11 @@ default List getContainsPathToSchemas( ) { return new ArrayList<>(); } + + default PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + return new PathToSchemasMap(); + } } \ No newline at end of file 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 index 3b61e377df3..a234c2907bd 100644 --- 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 @@ -17,7 +17,8 @@ public MaxContainsValidator(int maxContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; 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 35f1ab771f9..21d175aeb60 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,8 @@ public MaxItemsValidator(int maxItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d45fa4aec05..4309ad392ab 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,8 @@ public MaxLengthValidator(int maxLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d3ca51afd54..0933d14568b 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,8 @@ public MaxPropertiesValidator(int maxProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8ac89924b7f..b7c08a08cb5 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,8 @@ public MaximumValidator(Number maximum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 index dccb15435a4..70239e3fa3b 100644 --- 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 @@ -17,7 +17,8 @@ public MinContainsValidator(int minContains) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; 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 790a84d323b..5b452150aef 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,8 @@ public MinItemsValidator(int minItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 885b3293dc4..9dbac1aeb11 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,8 @@ public MinLengthValidator(int minLength) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 28f777b515d..24bb979c613 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,8 @@ public MinPropertiesValidator(int minProperties) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 86aacbc97f0..34d6d27c5bf 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,8 @@ public MinimumValidator(Number minimum) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 129b6382e60..b5601e16fc9 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,8 @@ public MultipleOfValidator(BigDecimal multipleOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 7d28774a9d3..5a9e59f530b 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,8 @@ public NotValidator(Class not) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 2ddb40e1aeb..e0c51fe2a11 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,8 @@ public OneOfValidator(List> oneOf) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java new file mode 100644 index 00000000000..fa486ddcdab --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java @@ -0,0 +1,67 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class PatternPropertiesValidator implements KeywordValidator { + public final Map> patternProperties; + + public PatternPropertiesValidator(Map> patternProperties) { + this.patternProperties = patternProperties; + } + + @Override + public @Nullable PathToSchemasMap validate( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas + ) { + if (!(arg instanceof Map)) { + return null; + } + return patternPropertiesPathToSchemas; + } + + public PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg)) { + return new PathToSchemasMap(); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: mapArg.entrySet()) { + Object entryKey = entry.getKey(); + if (!(entryKey instanceof String key)) { + throw new InvalidTypeException("Invalid non-string type for map key"); + } + List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + propPathToItem.add(key); + ValidationMetadata propValidationMetadata = new ValidationMetadata( + propPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + for (Map.Entry> patternPropEntry: patternProperties.entrySet()) { + if (!patternPropEntry.getKey().matcher(key).find()) { + continue; + } + + Class patternPropClass = patternPropEntry.getValue(); + JsonSchema patternPropSchema = JsonSchemaFactory.getInstance(patternPropClass); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(patternPropSchema, entry.getValue(), propValidationMetadata); + pathToSchemas.update(otherPathToSchemas); + } + } + return pathToSchemas; + } +} + 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 7ab82a715fb..92678f1cca4 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,8 @@ public PatternValidator(Pattern pattern) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 8f52ce0bd26..94599597a13 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,8 @@ public PropertiesValidator(Map> properties) JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java index b0c50ba11e3..f4ec5ab6239 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java @@ -18,7 +18,8 @@ public PropertyNamesValidator(Class propertyNames) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map)) { 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 2a4b53f1ece..148be09c410 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,8 @@ public RequiredValidator(Set required) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 3d9d490d345..fd827d49e13 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,8 @@ public TypeValidator(Set> type) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 5916946e50f..419823634e3 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,8 @@ public UniqueItemsValidator(boolean uniqueItems) { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java index 374665ef028..e23076a75b1 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java @@ -78,7 +78,8 @@ public void testCorrectPropertySucceeds() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -108,7 +109,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -131,7 +133,8 @@ public void testIncorrectPropertyValueFails() { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java index b584efdf406..69ffff00ce1 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/FormatValidatorTest.java @@ -34,7 +34,8 @@ public void testIntFormatSucceedsWithFloat() { NumberJsonSchema.getInstance(), 1.0f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -46,7 +47,8 @@ public void testIntFormatFailsWithFloat() { NumberJsonSchema.getInstance(), 3.14f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -57,7 +59,8 @@ public void testIntFormatSucceedsWithInt() { NumberJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -69,7 +72,8 @@ public void testInt32UnderMinFails() { NumberJsonSchema.getInstance(), -2147483649L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -80,7 +84,8 @@ public void testInt32InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -2147483648, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -92,7 +97,8 @@ public void testInt32InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 2147483647, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -104,7 +110,8 @@ public void testInt32OverMaxFails() { NumberJsonSchema.getInstance(), 2147483648L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -116,7 +123,8 @@ public void testInt64UnderMinFails() { NumberJsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -127,7 +135,8 @@ public void testInt64InclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -9223372036854775808L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -139,7 +148,8 @@ public void testInt64InclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 9223372036854775807L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -152,7 +162,8 @@ public void testInt64OverMaxFails() { NumberJsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -163,7 +174,8 @@ public void testFloatUnderMinFails() { NumberJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -174,7 +186,8 @@ public void testFloatInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -186,7 +199,8 @@ public void testFloatInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -198,7 +212,8 @@ public void testFloatOverMaxFails() { NumberJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -209,7 +224,8 @@ public void testDoubleUnderMinFails() { NumberJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -220,7 +236,8 @@ public void testDoubleInclusiveMinSucceeds() { NumberJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -232,7 +249,8 @@ public void testDoubleInclusiveMaxSucceeds() { NumberJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -244,7 +262,8 @@ public void testDoubleOverMaxFails() { NumberJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -255,7 +274,8 @@ public void testInvalidNumberStringFails() { NumberJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -266,7 +286,8 @@ public void testValidFloatNumberStringSucceeds() { NumberJsonSchema.getInstance(), "3.14", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -278,7 +299,8 @@ public void testValidIntNumberStringSucceeds() { NumberJsonSchema.getInstance(), "1", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -290,7 +312,8 @@ public void testInvalidDateStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -301,7 +324,8 @@ public void testValidDateStringSucceeds() { StringJsonSchema.getInstance(), "2017-01-20", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -313,7 +337,8 @@ public void testInvalidDateTimeStringFails() { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -324,7 +349,8 @@ public void testValidDateTimeStringSucceeds() { StringJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java index 84da9687817..2e3fcdb5129 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/ItemsValidatorTest.java @@ -37,7 +37,8 @@ public void testCorrectItemsSucceeds() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -67,7 +68,8 @@ public void testNotApplicableTypeReturnsNull() { ListJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -89,8 +91,8 @@ public void testIncorrectItemFails() { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } - diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java index 8d1d3fc053b..9367dc3268d 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java @@ -41,7 +41,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -73,7 +74,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -98,7 +100,8 @@ public void testIncorrectPropertyValueFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java index a5dbf4a8c03..53d0fced6ca 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/RequiredValidatorTest.java @@ -40,7 +40,8 @@ public void testCorrectPropertySucceeds() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -62,7 +63,8 @@ public void testNotApplicableTypeReturnsNull() { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -87,7 +89,8 @@ public void testIncorrectPropertyFails() { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java index 362cca6e8ba..1dffdb7eb98 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/schemas/validation/TypeValidatorTest.java @@ -32,7 +32,8 @@ public void testValidateSucceeds() { StringJsonSchema.getInstance(), "hi", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -52,7 +53,8 @@ public void testValidateFailsIntIsNotString() { StringJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 4213715c9eb..08b580f6fbd 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -283,7 +283,7 @@ public JavaClientGenerator() { SchemaFeature.Nullable, SchemaFeature.OneOf, SchemaFeature.Pattern, - // SchemaFeature.PatternProperties, + SchemaFeature.PatternProperties, // SchemaFeature.PrefixItems, SchemaFeature.Properties, SchemaFeature.PropertyNames, @@ -611,6 +611,7 @@ public void processOpts() { keywordValidatorFiles.add("NumberSchemaValidator"); keywordValidatorFiles.add("OneOfValidator"); keywordValidatorFiles.add("PathToSchemasMap"); + keywordValidatorFiles.add("PatternPropertiesValidator"); keywordValidatorFiles.add("PatternValidator"); keywordValidatorFiles.add("PropertiesValidator"); keywordValidatorFiles.add("PropertyEntry"); @@ -1351,6 +1352,7 @@ public Set getImports(String sourceJsonPath, CodegenSchema schema, Featu addDefaultValueImport(schema, imports); addDependentRequiredImports(schema, imports); addDependentSchemasImports(schema, imports); + addPatternPropertiesImports(schema, imports); if (schema.mapValueSchema != null) { imports.addAll(getDeeperImports(sourceJsonPath, schema.mapValueSchema)); } @@ -1464,6 +1466,14 @@ private void addPropertiesImports(CodegenSchema schema, Set imports) { } } + private void addPatternPropertiesImports(CodegenSchema schema, Set imports) { + if (schema.patternProperties != null) { + imports.add("import java.util.AbstractMap;"); + imports.add("import java.util.Map;"); + imports.add("import java.util.regex.Pattern;"); + } + } + private void addDependentSchemasImports(CodegenSchema schema, Set imports) { if (schema.dependentSchemas != null) { imports.add("import " + packageName + ".schemas.validation.PropertyEntry;"); @@ -1575,6 +1585,7 @@ private void addMapSchemaImports(Set imports, CodegenSchema schema) { addAdditionalPropertiesImports(schema, imports); addDependentRequiredImports(schema, imports); addDependentSchemasImports(schema, imports); + addPatternPropertiesImports(schema, imports); } private void addListSchemaImports(Set imports, CodegenSchema schema) { 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 00d012bfae9..7fc9005e25d 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 @@ -117,6 +117,9 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements { {{#if dependentSchemas}} {{> src/main/java/packagename/components/schemas/SchemaClass/_dependentSchemas }} {{/if}} + {{#if patternProperties}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_patternProperties }} + {{/if}} ); } @@ -141,9 +144,6 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements { {{#if else_}} {{!> components/schemas/schema_cls/_else }} {{/if}} -{{#if patternProperties}} - {{!> components/schemas/schema_cls/_pattern_properties }} -{{/if}} {{#if unevaluatedProperties}} {{!> components/schemas/schema_cls/_unevaluated_properties }} {{/if}} diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_map.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_map.hbs index bc64c46b230..ff80da53117 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_map.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_Schema_map.hbs @@ -56,6 +56,9 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements M {{#if dependentSchemas}} {{> src/main/java/packagename/components/schemas/SchemaClass/_dependentSchemas }} {{/if}} + {{#if patternProperties}} + {{> src/main/java/packagename/components/schemas/SchemaClass/_patternProperties }} + {{/if}} ); } @@ -77,9 +80,6 @@ public static class {{jsonPathPiece.pascalCase}} extends JsonSchema implements M {{#if else_}} {{!> components/schemas/schema_cls/_else }} {{/if}} - {{#if patternProperties}} - {{!> components/schemas/schema_cls/_pattern_properties }} - {{/if}} {{#if unevaluatedProperties}} {{!> components/schemas/schema_cls/_unevaluated_properties }} {{/if}} diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_pattern.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_pattern.hbs index 01605354d05..616832ef70b 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_pattern.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_pattern.hbs @@ -1,5 +1,5 @@ {{#if forDocs}} -pattern =
+pattern = Pattern.compile(
{{~#with patternInfo}}     "{{{pattern.codeEscaped}}}"{{#if flags}},{{/if}}
{{~#if flags}} @@ -25,7 +25,7 @@ pattern =
{{~/eq}} {{/if}} {{/with}} -))){{#unless @last}},{{/unless}}
+){{#unless @last}},{{/unless}}
{{~else}} .pattern(Pattern.compile( {{#with patternInfo}} diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_patternProperties.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_patternProperties.hbs new file mode 100644 index 00000000000..0d32c7ebe91 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_patternProperties.hbs @@ -0,0 +1,29 @@ +{{#if forDocs}} +patternProperties = Map.ofEntries(
+ {{~#each patternProperties}} + {{#if refInfo.refClass}} + {{#if refInfo.refModule}} +    new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), [{{refInfo.refModule}}.{{refInfo.refClass}}.class]({{docRoot}}{{refInfo.ref.pathFromDocRoot}}.md#{{refInfo.ref.jsonPathPiece.kebabCase}})){{#unless @last}},{{/unless}}
+ {{~else}} +    new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), [{{refInfo.refClass}}.class](#{{refInfo.ref.jsonPathPiece.kebabCase}}))){{#unless @last}},{{/unless}}
+ {{~/if}} + {{else}} +    new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), [{{jsonPathPiece.pascalCase}}.class](#{{jsonPathPiece.kebabCase}}))){{#unless @last}},{{/unless}}
+ {{~/if}} + {{/each}} +)
+{{~else}} +.patternProperties(Map.ofEntries( + {{#each patternProperties}} + {{#if refInfo.refClass}} + {{#if refInfo.refModule}} + new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), {{refInfo.refModule}}.{{refInfo.refClass}}.class){{#unless @last}},{{/unless}} + {{else}} + new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), {{refInfo.refClass}}.class){{#unless @last}},{{/unless}} + {{/if}} + {{else}} + new AbstractMap.SimpleEntry<>(Pattern.compile("{{{@key.pattern.codeEscaped}}}"), {{jsonPathPiece.pascalCase}}.class){{#unless @last}},{{/unless}} + {{/if}} + {{/each}} +)) +{{/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 83eebd3db96..f35d40c3a48 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 @@ -91,3 +91,6 @@ {{#if dependentSchemas}} | Map> | {{> src/main/java/packagename/components/schemas/SchemaClass/_dependentSchemas }} | {{/if}} +{{#if patternProperties}} +| Map> | {{> src/main/java/packagename/components/schemas/SchemaClass/_patternProperties }} | +{{/if}} 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 593095be85e..a663139ed25 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,8 @@ public class AdditionalPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; @@ -34,11 +35,13 @@ public class AdditionalPropertiesValidator implements KeywordValidator { presentAdditionalProperties.removeAll(schema.properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - // todo add handling for validatedPatternProperties for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); propPathToItem.add(addPropName); + if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + continue; + } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, validationMetadata.configuration(), 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 d5905f64e7d..2b854c663a7 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,8 @@ public class AllOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 338c2a3a593..b8388f6b1ea 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,8 @@ public class AnyOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 18a54529355..dd7ce482763 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,8 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 cc3b162efd0..3fe088160e3 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,7 +18,8 @@ public class ContainsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentRequiredValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentRequiredValidator.hbs index 13a9f9ed85b..d2e4cf54127 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentRequiredValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentRequiredValidator.hbs @@ -20,7 +20,8 @@ public class DependentRequiredValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentSchemasValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentSchemasValidator.hbs index 63b71af44d3..ccba0e0ccb0 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentSchemasValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/DependentSchemasValidator.hbs @@ -20,7 +20,8 @@ public class DependentSchemasValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; 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 e7590d0d56f..f01d44a9283 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,8 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 e3eee58de47..0bd17793d00 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,8 @@ public class ExclusiveMaximumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 0606ed7f765..0769eb5a234 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,8 @@ public class ExclusiveMinimumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 87b2ce57967..a72c29dc9a7 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,8 @@ public class FormatValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 b2767199cdd..3cabd40e097 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,8 @@ public class ItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 d473bea8a76..a11e5e67d1d 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 @@ -52,6 +52,7 @@ public abstract class JsonSchema { public final @Nullable Class propertyNames; public @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; + public @Nullable Map> patternProperties; private final LinkedHashMap keywordToValidator; protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { @@ -276,6 +277,13 @@ public abstract class JsonSchema { new DependentSchemasValidator(this.dependentSchemas) ); } + this.patternProperties = jsonSchemaInfo.patternProperties; + if (this.patternProperties != null) { + keywordToValidator.put( + "patternProperties", + new PatternPropertiesValidator(this.patternProperties) + ); + } this.keywordToValidator = keywordToValidator; } @@ -295,6 +303,11 @@ public abstract class JsonSchema { if (containsValidator != null) { containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); } + @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; + KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); + if (patternPropertiesValidator != null) { + patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); if (disabledKeywords.contains(jsonKeyword)) { @@ -308,7 +321,8 @@ public abstract class JsonSchema { jsonSchema, arg, validationMetadata, - containsPathToSchemas + containsPathToSchemas, + patternPropertiesPathToSchemas ); if (otherPathToSchemas == null) { continue; 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 36a24aaa12b..abe43046af9 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 @@ -172,4 +172,9 @@ public class JsonSchemaInfo { this.dependentSchemas = dependentSchemas; return this; } + public @Nullable Map> patternProperties = null; + public JsonSchemaInfo patternProperties(Map> patternProperties) { + this.patternProperties = patternProperties; + 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 15aeeddfbc5..88d7d629c71 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,8 @@ public interface KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) throws ValidationException; default List getContainsPathToSchemas( @@ -20,4 +21,11 @@ public interface KeywordValidator { ) { return new ArrayList<>(); } + + default PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + return new PathToSchemasMap(); + } } \ No newline at end of file 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 index 2c0a3da5b39..21f5cacfdf7 100644 --- 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 @@ -17,7 +17,8 @@ public class MaxContainsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; 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 168918680cd..1a10c405461 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,8 @@ public class MaxItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 9034c63a187..57c0bd7d43b 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,8 @@ public class MaxLengthValidator extends LengthValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 655d6962cf2..5da40fbdbb2 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,8 @@ public class MaxPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 9b95bd10420..cdbf12e8a53 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,8 @@ public class MaximumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 index f2092606885..3be311d9c06 100644 --- 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 @@ -17,7 +17,8 @@ public class MinContainsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; 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 28e5ed8d008..91bbe5aae6f 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,8 @@ public class MinItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 4712cb5c693..15a5b461493 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,8 @@ public class MinLengthValidator extends LengthValidator implements KeywordValida JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 0a22211205e..626a62f39a7 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,8 @@ public class MinPropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 b494cfa8c46..0fb2e9655bb 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,8 @@ public class MinimumValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 1ff91055797..69c4e69b012 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,8 @@ public class MultipleOfValidator extends BigDecimalValidator implements KeywordV JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 627a32dff65..0d94f56e4a1 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,8 @@ public class NotValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 22a631cdd26..249e16a37c1 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,8 @@ public class OneOfValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternPropertiesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternPropertiesValidator.hbs new file mode 100644 index 00000000000..f63d9e740ec --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PatternPropertiesValidator.hbs @@ -0,0 +1,67 @@ +package {{{packageName}}}.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.exceptions.InvalidTypeException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class PatternPropertiesValidator implements KeywordValidator { + public final Map> patternProperties; + + public PatternPropertiesValidator(Map> patternProperties) { + this.patternProperties = patternProperties; + } + + @Override + public @Nullable PathToSchemasMap validate( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas + ) { + if (!(arg instanceof Map)) { + return null; + } + return patternPropertiesPathToSchemas; + } + + public PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg)) { + return new PathToSchemasMap(); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: mapArg.entrySet()) { + Object entryKey = entry.getKey(); + if (!(entryKey instanceof String key)) { + throw new InvalidTypeException("Invalid non-string type for map key"); + } + List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + propPathToItem.add(key); + ValidationMetadata propValidationMetadata = new ValidationMetadata( + propPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + for (Map.Entry> patternPropEntry: patternProperties.entrySet()) { + if (!patternPropEntry.getKey().matcher(key).find()) { + continue; + } + + Class patternPropClass = patternPropEntry.getValue(); + JsonSchema patternPropSchema = JsonSchemaFactory.getInstance(patternPropClass); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(patternPropSchema, entry.getValue(), propValidationMetadata); + pathToSchemas.update(otherPathToSchemas); + } + } + return pathToSchemas; + } +} + 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 aa2eb093266..3d8c157a278 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,8 @@ public class PatternValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 da38d014330..8d80522f127 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,8 @@ public class PropertiesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map mapArg)) { return null; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertyNamesValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertyNamesValidator.hbs index 1c0160c9805..78b9241fe64 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertyNamesValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PropertyNamesValidator.hbs @@ -18,7 +18,8 @@ public class PropertyNamesValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof Map)) { 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 7dc2b7fe0af..a8588e19e80 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,8 @@ public class RequiredValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 81402a8d039..a505eab1c62 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,8 @@ public class TypeValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { 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 02a26776e1e..2cf70f5c6e1 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,8 @@ public class UniqueItemsValidator implements KeywordValidator { JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas ) { if (!(arg instanceof List)) { return null; diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/AdditionalPropertiesValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/AdditionalPropertiesValidatorTest.hbs index 7c8248033a7..479ff44de01 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/AdditionalPropertiesValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/AdditionalPropertiesValidatorTest.hbs @@ -78,7 +78,8 @@ public class AdditionalPropertiesValidatorTest { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -108,7 +109,8 @@ public class AdditionalPropertiesValidatorTest { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -131,7 +133,8 @@ public class AdditionalPropertiesValidatorTest { ObjectWithPropsSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/FormatValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/FormatValidatorTest.hbs index 7e7c6179705..f086fec751c 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/FormatValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/FormatValidatorTest.hbs @@ -34,7 +34,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 1.0f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -46,7 +47,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 3.14f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -57,7 +59,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -69,7 +72,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -2147483649L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -80,7 +84,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -2147483648, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -92,7 +97,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 2147483647, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -104,7 +110,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 2147483648L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -116,7 +123,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -127,7 +135,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -9223372036854775808L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -139,7 +148,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 9223372036854775807L, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -152,7 +162,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -163,7 +174,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -174,7 +186,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -186,7 +199,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -198,7 +212,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -209,7 +224,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -220,7 +236,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -232,7 +249,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -244,7 +262,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -255,7 +274,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -266,7 +286,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), "3.14", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -278,7 +299,8 @@ public class FormatValidatorTest { NumberJsonSchema.getInstance(), "1", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -290,7 +312,8 @@ public class FormatValidatorTest { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -301,7 +324,8 @@ public class FormatValidatorTest { StringJsonSchema.getInstance(), "2017-01-20", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -313,7 +337,8 @@ public class FormatValidatorTest { StringJsonSchema.getInstance(), "abc", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } @@ -324,7 +349,8 @@ public class FormatValidatorTest { StringJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/ItemsValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/ItemsValidatorTest.hbs index a3aa7ce1fe4..64b81a509e2 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/ItemsValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/ItemsValidatorTest.hbs @@ -37,7 +37,8 @@ public class ItemsValidatorTest { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -67,7 +68,8 @@ public class ItemsValidatorTest { ListJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -89,8 +91,8 @@ public class ItemsValidatorTest { ListJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } - diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/PropertiesValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/PropertiesValidatorTest.hbs index a4e7201e6bc..3c78216d94e 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/PropertiesValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/PropertiesValidatorTest.hbs @@ -41,7 +41,8 @@ public class PropertiesValidatorTest { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -73,7 +74,8 @@ public class PropertiesValidatorTest { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -98,7 +100,8 @@ public class PropertiesValidatorTest { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/RequiredValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/RequiredValidatorTest.hbs index be23d531464..2389c80a55f 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/RequiredValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/RequiredValidatorTest.hbs @@ -40,7 +40,8 @@ public class RequiredValidatorTest { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -62,7 +63,8 @@ public class RequiredValidatorTest { MapJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemas); } @@ -87,7 +89,8 @@ public class RequiredValidatorTest { MapJsonSchema.getInstance(), arg, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/schemas/validation/TypeValidatorTest.hbs b/src/main/resources/java/src/test/java/packagename/schemas/validation/TypeValidatorTest.hbs index 28b970b73e6..ff19572c628 100644 --- a/src/main/resources/java/src/test/java/packagename/schemas/validation/TypeValidatorTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/schemas/validation/TypeValidatorTest.hbs @@ -32,7 +32,8 @@ public class TypeValidatorTest { StringJsonSchema.getInstance(), "hi", validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() ); assertNull(pathToSchemasMap); } @@ -52,7 +53,8 @@ public class TypeValidatorTest { StringJsonSchema.getInstance(), 1, validationMetadata, - new ArrayList<>() + new ArrayList<>(), + new PathToSchemasMap() )); } } \ No newline at end of file diff --git a/src/test/resources/3_1/unit_test_spec/3_1_0_unit_test_spec_nopaths.yaml b/src/test/resources/3_1/unit_test_spec/3_1_0_unit_test_spec_nopaths.yaml index b0eac1c1607..0cafe38d3e7 100644 --- a/src/test/resources/3_1/unit_test_spec/3_1_0_unit_test_spec_nopaths.yaml +++ b/src/test/resources/3_1/unit_test_spec/3_1_0_unit_test_spec_nopaths.yaml @@ -447,6 +447,25 @@ components: PatternIsNotAnchored: $schema: https://json-schema.org/draft/2020-12/schema pattern: a+ + PatternpropertiesValidatesPropertiesMatchingARegex: + $schema: https://json-schema.org/draft/2020-12/schema + patternProperties: + f.*o: + type: integer + MultipleSimultaneousPatternpropertiesAreValidated: + $schema: https://json-schema.org/draft/2020-12/schema + patternProperties: + a*: + type: integer + aaa*: + maximum: 20 + RegexesAreNotAnchoredByDefaultAndAreCaseSensitive: + $schema: https://json-schema.org/draft/2020-12/schema + patternProperties: + '[0-9]{2,}': + type: boolean + X_: + type: string PatternpropertiesWithNullValuedInstanceProperties: $schema: https://json-schema.org/draft/2020-12/schema patternProperties: @@ -459,6 +478,19 @@ components: type: integer bar: type: string + PropertiesPatternpropertiesAdditionalpropertiesInteraction: + $schema: https://json-schema.org/draft/2020-12/schema + properties: + foo: + type: array + maxItems: 3 + bar: + type: array + patternProperties: + f.o: + minItems: 2 + additionalProperties: + type: integer PropertiesWithEscapedCharacters: $schema: https://json-schema.org/draft/2020-12/schema properties: @@ -2708,6 +2740,114 @@ components: data: xxaayy valid: true comment: null + PatternpropertiesValidatesPropertiesMatchingARegex: + ASingleValidMatchIsValid: + description: a single valid match is valid + data: + foo: 1 + valid: true + comment: null + MultipleValidMatchesIsValid: + description: multiple valid matches is valid + data: + foo: 1 + foooooo: 2 + valid: true + comment: null + ASingleInvalidMatchIsInvalid: + description: a single invalid match is invalid + data: + foo: bar + fooooo: 2 + valid: false + comment: null + MultipleInvalidMatchesIsInvalid: + description: multiple invalid matches is invalid + data: + foo: bar + foooooo: baz + valid: false + comment: null + IgnoresArrays: + description: ignores arrays + data: + - foo + valid: true + comment: null + IgnoresStrings: + description: ignores strings + data: foo + valid: true + comment: null + IgnoresOtherNonObjects: + description: ignores other non-objects + data: 12 + valid: true + comment: null + MultipleSimultaneousPatternpropertiesAreValidated: + ASingleValidMatchIsValid: + description: a single valid match is valid + data: + a: 21 + valid: true + comment: null + ASimultaneousMatchIsValid: + description: a simultaneous match is valid + data: + aaaa: 18 + valid: true + comment: null + MultipleMatchesIsValid: + description: multiple matches is valid + data: + a: 21 + aaaa: 18 + valid: true + comment: null + AnInvalidDueToOneIsInvalid: + description: an invalid due to one is invalid + data: + a: bar + valid: false + comment: null + AnInvalidDueToTheOtherIsInvalid: + description: an invalid due to the other is invalid + data: + aaaa: 31 + valid: false + comment: null + AnInvalidDueToBothIsInvalid: + description: an invalid due to both is invalid + data: + aaa: foo + aaaa: 31 + valid: false + comment: null + RegexesAreNotAnchoredByDefaultAndAreCaseSensitive: + NonRecognizedMembersAreIgnored: + description: non recognized members are ignored + data: + answer 1: '42' + valid: true + comment: null + RecognizedMembersAreAccountedFor: + description: recognized members are accounted for + data: + a31b: null + valid: false + comment: null + RegexesAreCaseSensitive: + description: regexes are case sensitive + data: + a_x_3: 3 + valid: true + comment: null + RegexesAreCaseSensitive2: + description: regexes are case sensitive, 2 + data: + a_X_3: 3 + valid: false + comment: null PatternpropertiesWithNullValuedInstanceProperties: AllowsNullValues: description: allows null values @@ -2753,6 +2893,63 @@ components: data: 12 valid: true comment: null + PropertiesPatternpropertiesAdditionalpropertiesInteraction: + PropertyValidatesProperty: + description: property validates property + data: + foo: + - 1 + - 2 + valid: true + comment: null + PropertyInvalidatesProperty: + description: property invalidates property + data: + foo: + - 1 + - 2 + - 3 + - 4 + valid: false + comment: null + PatternpropertyInvalidatesProperty: + description: patternProperty invalidates property + data: + foo: [] + valid: false + comment: null + PatternpropertyValidatesNonproperty: + description: patternProperty validates nonproperty + data: + fxo: + - 1 + - 2 + valid: true + comment: null + PatternpropertyInvalidatesNonproperty: + description: patternProperty invalidates nonproperty + data: + fxo: [] + valid: false + comment: null + AdditionalpropertyIgnoresProperty: + description: additionalProperty ignores property + data: + bar: [] + valid: true + comment: null + AdditionalpropertyValidatesOthers: + description: additionalProperty validates others + data: + quux: 3 + valid: true + comment: null + AdditionalpropertyInvalidatesOthers: + description: additionalProperty invalidates others + data: + quux: foo + valid: false + comment: null PropertiesWithEscapedCharacters: ObjectWithAllNumbersIsValid: description: object with all numbers is valid diff --git a/src/test/resources/3_1/unit_test_spec/spec_writer.py b/src/test/resources/3_1/unit_test_spec/spec_writer.py index 81ee57e9dbe..54283899f62 100644 --- a/src/test/resources/3_1/unit_test_spec/spec_writer.py +++ b/src/test/resources/3_1/unit_test_spec/spec_writer.py @@ -716,11 +716,7 @@ def write_openapi_spec(): 'IfAppearsAtTheEndWhenSerializedKeywordProcessingSequence', 'IgnoreThenWithoutIf', 'IgnoreElseWithoutIf', - 'MultipleSimultaneousPatternpropertiesAreValidated', 'NonAsciiPatternWithAdditionalproperties', - 'PatternpropertiesValidatesPropertiesMatchingARegex', - 'PropertiesPatternpropertiesAdditionalpropertiesInteraction', - 'RegexesAreNotAnchoredByDefaultAndAreCaseSensitive', 'UnevaluateditemsAsSchema', 'UnevaluateditemsWithNullInstanceElements', 'UnevaluatedpropertiesNotAffectedByPropertynames',