From eeb2c3ef1cb5fee9d89057556d4d0716e160178b Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 12:15:02 -0800 Subject: [PATCH 01/21] Updates many validators to accept a single input --- .../AdditionalPropertiesValidator.java | 23 ++-- .../schemas/validation/AllOfValidator.java | 11 +- .../schemas/validation/AnyOfValidator.java | 13 +-- .../schemas/validation/ConstValidator.java | 15 +-- .../schemas/validation/ContainsValidator.java | 21 ++-- .../DependentRequiredValidator.java | 16 +-- .../validation/DependentSchemasValidator.java | 13 +-- .../validation/ExclusiveMaximumValidator.java | 29 ++--- .../validation/ExclusiveMinimumValidator.java | 29 ++--- .../schemas/validation/FormatValidator.java | 110 ++++++++---------- .../schemas/validation/IfValidator.java | 16 +-- .../schemas/validation/ItemsValidator.java | 19 ++- .../schemas/validation/KeywordValidator.java | 7 +- .../validation/MaxContainsValidator.java | 17 +-- .../schemas/validation/MaxItemsValidator.java | 13 +-- .../validation/MaxLengthValidator.java | 15 +-- .../validation/MaxPropertiesValidator.java | 14 +-- .../schemas/validation/MaximumValidator.java | 29 ++--- .../validation/MinContainsValidator.java | 17 +-- .../schemas/validation/MinItemsValidator.java | 13 +-- .../validation/MinLengthValidator.java | 15 +-- .../validation/MinPropertiesValidator.java | 14 +-- .../schemas/validation/MinimumValidator.java | 29 ++--- .../validation/MultipleOfValidator.java | 14 +-- .../schemas/validation/NotValidator.java | 18 +-- .../schemas/validation/OneOfValidator.java | 15 +-- .../PatternPropertiesValidator.java | 11 +- .../schemas/validation/PatternValidator.java | 14 +-- .../validation/PrefixItemsValidator.java | 17 +-- .../validation/PropertiesValidator.java | 19 ++- .../schemas/validation/ValidationData.java | 14 +++ .../generators/JavaClientGenerator.java | 1 + .../AdditionalPropertiesValidator.hbs | 23 ++-- .../schemas/validation/AllOfValidator.hbs | 11 +- .../schemas/validation/AnyOfValidator.hbs | 13 +-- .../schemas/validation/ConstValidator.hbs | 17 +-- .../schemas/validation/ContainsValidator.hbs | 21 ++-- .../validation/DependentRequiredValidator.hbs | 16 +-- .../validation/DependentSchemasValidator.hbs | 14 +-- .../validation/ExclusiveMaximumValidator.hbs | 29 ++--- .../validation/ExclusiveMinimumValidator.hbs | 29 ++--- .../schemas/validation/FormatValidator.hbs | 110 ++++++++---------- .../schemas/validation/IfValidator.hbs | 16 +-- .../schemas/validation/ItemsValidator.hbs | 19 ++- .../schemas/validation/KeywordValidator.hbs | 7 +- .../validation/MaxContainsValidator.hbs | 17 +-- .../schemas/validation/MaxItemsValidator.hbs | 13 +-- .../schemas/validation/MaxLengthValidator.hbs | 15 +-- .../validation/MaxPropertiesValidator.hbs | 14 +-- .../schemas/validation/MaximumValidator.hbs | 31 ++--- .../validation/MinContainsValidator.hbs | 17 +-- .../schemas/validation/MinItemsValidator.hbs | 13 +-- .../schemas/validation/MinLengthValidator.hbs | 17 +-- .../validation/MinPropertiesValidator.hbs | 14 +-- .../schemas/validation/MinimumValidator.hbs | 29 ++--- .../validation/MultipleOfValidator.hbs | 16 +-- .../schemas/validation/NotValidator.hbs | 19 +-- .../schemas/validation/OneOfValidator.hbs | 15 +-- .../validation/PatternPropertiesValidator.hbs | 12 +- .../schemas/validation/PatternValidator.hbs | 14 +-- .../validation/PrefixItemsValidator.hbs | 17 +-- .../validation/PropertiesValidator.hbs | 19 ++- .../schemas/validation/ValidationData.hbs | 12 ++ 63 files changed, 444 insertions(+), 806 deletions(-) create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java create mode 100644 src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs 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 fd6fa6a4d29..6d67cfb4cb2 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 @@ -16,14 +16,9 @@ public AdditionalPropertiesValidator(Class additionalPrope @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } Set presentAdditionalProperties = new LinkedHashSet<>(); @@ -32,22 +27,22 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.add((String) key); } } - if (schema.properties != null) { - presentAdditionalProperties.removeAll(schema.properties.keySet()); + if (data.schema().properties != null) { + presentAdditionalProperties.removeAll(data.schema().properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(addPropName); - if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + if (data.patternPropertiesPathToSchemas() != null && data.patternPropertiesPathToSchemas().containsKey(propPathToItem)) { continue; } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema addPropsSchema = JsonSchemaFactory.getInstance(additionalProperties); if (propValidationMetadata.validationRanEarlier(addPropsSchema)) { 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 313e2d97446..64401d545c6 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 @@ -12,21 +12,14 @@ public AllOfValidator(List> allOf) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, data.arg(), data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } - - } 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 a4754dda464..d5bb6af9356 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 @@ -15,17 +15,12 @@ public AnyOfValidator(List> anyOf) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { - if (anyOfClass == schema.getClass()) { + if (anyOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke _validate on it because that is recursive @@ -35,7 +30,7 @@ public AnyOfValidator(List> anyOf) { } try { JsonSchema anyOfSchema = JsonSchemaFactory.getInstance(anyOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, data.arg(), data.validationMetadata()); validatedAnyOfClasses.add(anyOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,7 +38,7 @@ public AnyOfValidator(List> anyOf) { } } if (validatedAnyOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the anyOf schemas matched the input data." ); } 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 f797c68ab2e..87cb96cfd29 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 @@ -16,15 +16,10 @@ public ConstValidator(@Nullable Object constValue) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { return null; } @@ -32,10 +27,10 @@ public ConstValidator(@Nullable Object constValue) { return null; } } else { - if (Objects.equals(arg, constValue)) { + if (Objects.equals(data.arg(), constValue)) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not equal to const "+constValue); + throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue); } } 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 deaa878d5af..834af1bc094 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 @@ -15,25 +15,20 @@ public ContainsValidator(Class contains) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { + if (data.containsPathToSchemas() == null || data.containsPathToSchemas().isEmpty()) { throw new ValidationException( - "Validation failed for contains keyword in class="+schema.getClass() - + " at pathToItem="+validationMetadata.pathToItem()+". No " + "Validation failed for contains keyword in class="+data.schema().getClass() + + " at pathToItem="+data.validationMetadata().pathToItem()+". No " + "items validated to the contains schema." ); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - for (PathToSchemasMap otherPathToSchema: containsPathToSchemas) { + for (PathToSchemasMap otherPathToSchema: data.containsPathToSchemas()) { pathToSchemas.update(otherPathToSchema); } return pathToSchemas; @@ -70,9 +65,7 @@ public List getContainsPathToSchemas( PathToSchemasMap otherPathToSchemas = JsonSchema.validate( containsSchema, itemValue, itemValidationMetadata); containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) { - ; - } + } catch (ValidationException ignored) {} } return containsPathToSchemas; } 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 a5e92887928..7b332ebed34 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 @@ -4,7 +4,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -17,22 +16,17 @@ public DependentRequiredValidator(Map> dependentRequired) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } for (Map.Entry> entry: dependentRequired.entrySet()) { - if (!((Map) arg).containsKey(entry.getKey())) { + if (!mapArg.containsKey(entry.getKey())) { continue; } Set missingKeys = new HashSet<>(entry.getValue()); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { missingKeys.remove(key); } @@ -42,7 +36,7 @@ public DependentRequiredValidator(Map> dependentRequired) { } throw new ValidationException( "Validation failed for dependentRequired because these_keys="+missingKeys+" are "+ - "missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass() + "missing at pathToItem="+data.validationMetadata().pathToItem()+" in class "+data.schema().getClass() ); } 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 0ffa3b351ca..7de61b41124 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 @@ -2,9 +2,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -17,14 +15,9 @@ public DependentSchemasValidator(Map> depend @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -41,7 +34,7 @@ public DependentSchemasValidator(Map> depend } Class dependentSchemaClass = entry.getValue(); JsonSchema dependentSchema = JsonSchemaFactory.getInstance(dependentSchemaClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, mapArg, data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; 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 432d5b0f4de..e5e0b95d89b 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMaximumValidator implements KeywordValidator { public final Number exclusiveMaximum; @@ -14,37 +12,32 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMaximum.intValue()) > -1) { + String msg = "Value " + data.arg() + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMaximum.intValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMaximum.longValue()) > -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMaximum.longValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMaximum.floatValue()) > -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMaximum.floatValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMaximum.doubleValue()) > -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMaximum.doubleValue()) > -1) { throw new ValidationException(msg); } 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 d60c96f8325..2af236387e1 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMinimumValidator implements KeywordValidator { public final Number exclusiveMinimum; @@ -14,37 +12,32 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMinimum.intValue()) < 1) { + String msg = "Value " + data.arg() + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMinimum.intValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMinimum.longValue()) < 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMinimum.longValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMinimum.floatValue()) < 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMinimum.floatValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMinimum.doubleValue()) < 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMinimum.doubleValue()) < 1) { throw new ValidationException(msg); } 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 d782f2ce4a2..5994754f5e4 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 @@ -6,7 +6,6 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.format.DateTimeParseException; -import java.util.List; import java.util.UUID; public class FormatValidator implements KeywordValidator { @@ -25,12 +24,12 @@ public FormatValidator(String format) { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private Void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; if (arg instanceof Float || arg instanceof Double) { - Double doubleArg; + double doubleArg; if (arg instanceof Float) { doubleArg = arg.doubleValue(); } else { @@ -60,20 +59,17 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value " + arg + " for format int32 at " + validationMetadata.pathToItem() ); } - return null; } else if (format.equals("int64")) { if (intArg.compareTo(int64InclusiveMinimum) < 0 || intArg.compareTo(int64InclusiveMaximum) > 0) { throw new ValidationException( "Invalid value " + arg + " for format int64 at " + validationMetadata.pathToItem() ); } - return null; } - return null; } else if (format.equals("float") || format.equals("double")) { BigDecimal decimalArg; if (arg instanceof Float) { - decimalArg = new BigDecimal((Float) arg); + decimalArg = BigDecimal.valueOf(arg.doubleValue()); } else if (arg instanceof Double) { decimalArg = BigDecimal.valueOf((Double) arg); } else { @@ -85,83 +81,75 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value "+arg+" for format float at "+validationMetadata.pathToItem() ); } - return null; - } else if (format.equals("double")) { + } else { if (decimalArg.compareTo(doubleInclusiveMinimum) < 0 || decimalArg.compareTo(doubleInclusiveMaximum) > 0 ){ throw new ValidationException( "Invalid value "+arg+" for format double at "+validationMetadata.pathToItem() ); } - return null; } } - return null; } - private Void validateStringFormat(String arg, ValidationMetadata validationMetadata) { - if (format.equals("uuid")) { - try { - UUID.fromString(arg); - } catch (IllegalArgumentException e) { - throw new ValidationException( - "Value cannot be converted to a UUID. Invalid value "+ - arg+" for format uuid at "+validationMetadata.pathToItem() - ); + private void validateStringFormat(String arg, ValidationMetadata validationMetadata) { + switch (format) { + case "uuid" -> { + try { + UUID.fromString(arg); + } catch (IllegalArgumentException e) { + throw new ValidationException( + "Value cannot be converted to a UUID. Invalid value " + + arg + " for format uuid at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("number")) { - try { - new BigDecimal(arg); - } catch (NumberFormatException e) { - throw new ValidationException( - "Value cannot be converted to a decimal. Invalid value "+ - arg+" for format number at "+validationMetadata.pathToItem() - ); + case "number" -> { + try { + new BigDecimal(arg); + } catch (NumberFormatException e) { + throw new ValidationException( + "Value cannot be converted to a decimal. Invalid value " + + arg + " for format number at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date")) { - try { - new CustomIsoparser().parseIsodate(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 date format. "+ - "Invalid value "+arg+" for format date at "+validationMetadata.pathToItem() - ); + case "date" -> { + try { + new CustomIsoparser().parseIsodate(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 date format. " + + "Invalid value " + arg + " for format date at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date-time")) { - try { - new CustomIsoparser().parseIsodatetime(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 datetime format. "+ - "Invalid value "+arg+" for format datetime at "+validationMetadata.pathToItem() - ); + case "date-time" -> { + try { + new CustomIsoparser().parseIsodatetime(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 datetime format. " + + "Invalid value " + arg + " for format datetime at " + validationMetadata.pathToItem() + ); + } } - return null; } - return null; } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { + if (data.arg() instanceof Number numberArg) { validateNumericFormat( - (Number) arg, - validationMetadata + numberArg, + data.validationMetadata() ); return null; - } else if (arg instanceof String) { + } else if (data.arg() instanceof String stringArg) { validateStringFormat( - (String) arg, - validationMetadata + stringArg, + data.validationMetadata() ); return null; } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java index e1634bd1b00..4e6f31a4eec 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java @@ -4,13 +4,6 @@ import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class IfValidator implements KeywordValidator { public final Class ifSchema; @@ -20,14 +13,9 @@ public IfValidator(Class ifSchema) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (ifPathToSchemas == null) { + if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } /* 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 5d146ab250c..7b5a83df805 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 @@ -14,30 +14,25 @@ public ItemsValidator(Class items) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - int minIndex = schema.prefixItems != null ? schema.prefixItems.size() : 0; + int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0; JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items); for(int i = minIndex; i < listArg.size(); i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); if (itemValidationMetadata.validationRanEarlier(itemsSchema)) { // todo add_deeper_validated_schemas 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 41b4b85eb2e..a00d38ad61b 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 @@ -8,12 +8,7 @@ public interface KeywordValidator { @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaxContainsValidator.java index 25482139fab..b49320b650f 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 @@ -14,23 +14,18 @@ public MaxContainsValidator(int maxContains) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() > maxContains) { + if (data.containsPathToSchemas().size() > maxContains) { throw new ValidationException( - "Validation failed for maxContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema." + "Validation failed for maxContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." ); } 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 bda6fb43ece..a5516129ab7 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 @@ -14,18 +14,13 @@ public MaxItemsValidator(int maxItems) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() > maxItems) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxItems of " + maxItems); + if (listArg.size() > maxItems) { + throw new ValidationException("Value " + listArg + " is invalid because has > the maxItems of " + maxItems); } 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 1a78623e0f4..8d701b41144 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaxLengthValidator extends LengthValidator implements KeywordValidator { public final int maxLength; @@ -14,19 +12,14 @@ public MaxLengthValidator(int maxLength) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length > maxLength) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxLength of " + maxLength); + throw new ValidationException("Value " + stringArg + " is invalid because has > the maxLength of " + maxLength); } 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 5928ec588ac..95689ae6fff 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 @@ -3,7 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public MaxPropertiesValidator(int maxProperties) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() > maxProperties) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxProperties of " + maxProperties); + if (mapArg.size() > maxProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has > the maxProperties of " + maxProperties); } 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 25faceb4022..3ce6051fc5b 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaximumValidator implements KeywordValidator { public final Number maximum; @@ -14,37 +12,32 @@ public MaximumValidator(Number maximum) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is > the maximum of " + maximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(maximum.intValue()) == 1) { + String msg = "Value " + data.arg() + " is invalid because it is > the maximum of " + maximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(maximum.intValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(maximum.longValue()) == 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(maximum.longValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(maximum.floatValue()) == 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(maximum.floatValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(maximum.doubleValue()) == 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(maximum.doubleValue()) > 0) { throw new ValidationException(msg); } 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 2f34127155e..7bd04c76ff4 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 @@ -14,23 +14,18 @@ public MinContainsValidator(int minContains) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() < minContains) { + if (data.containsPathToSchemas().size() < minContains) { throw new ValidationException( - "Validation failed for minContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema." + "Validation failed for minContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too few items validated to the contains schema." ); } 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 7c46cbe8f94..0c3234c2500 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 @@ -14,18 +14,13 @@ public MinItemsValidator(int minItems) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() < minItems) { - throw new ValidationException("Value " + arg + " is invalid because has < the minItems of " + minItems); + if (listArg.size() < minItems) { + throw new ValidationException("Value " + listArg + " is invalid because has < the minItems of " + minItems); } 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 7c92205a9cf..ec9e946396b 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinLengthValidator extends LengthValidator implements KeywordValidator { public final int minLength; @@ -14,19 +12,14 @@ public MinLengthValidator(int minLength) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length < minLength) { - throw new ValidationException("Value " + arg + " is invalid because has < the minLength of " + minLength); + throw new ValidationException("Value " + stringArg + " is invalid because has < the minLength of " + minLength); } 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 c52b16000d8..6ffc9536944 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 @@ -3,7 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public MinPropertiesValidator(int minProperties) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() < minProperties) { - throw new ValidationException("Value " + arg + " is invalid because has < the minProperties of " + minProperties); + if (mapArg.size() < minProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has < the minProperties of " + minProperties); } 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 dec192d47df..61900a2362e 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 @@ -3,8 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinimumValidator implements KeywordValidator { public final Number minimum; @@ -14,37 +12,32 @@ public MinimumValidator(Number minimum) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is < the minimum of " + minimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(minimum.intValue()) == -1) { + String msg = "Value " + data.arg() + " is invalid because it is < the minimum of " + minimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(minimum.intValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(minimum.longValue()) == -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(minimum.longValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(minimum.floatValue()) == -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(minimum.floatValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(minimum.doubleValue()) == -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(minimum.doubleValue()) < 0) { throw new ValidationException(msg); } 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 15230b54275..b3479e23e5a 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 @@ -3,7 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public MultipleOfValidator(BigDecimal multipleOf) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number numberArg)) { return null; } - BigDecimal castArg = getBigDecimal((Number) arg); - String msg = "Value " + arg + " is invalid because it is not a multiple of " + multipleOf; + BigDecimal castArg = getBigDecimal(numberArg); + String msg = "Value " + numberArg + " is invalid because it is not a multiple of " + multipleOf; if (castArg.remainder(multipleOf).compareTo(BigDecimal.ZERO) != 0) { throw new ValidationException(msg); } 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 507c7f40fbc..a510430b655 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 @@ -3,13 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class NotValidator implements KeywordValidator { public final Class not; @@ -19,23 +12,18 @@ public NotValidator(Class not) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); - pathToSchemas = JsonSchema.validate(notSchema, arg, validationMetadata); + pathToSchemas = JsonSchema.validate(notSchema, data.arg(), data.validationMetadata()); } catch (ValidationException e) { return null; } if (!pathToSchemas.isEmpty()) { throw new ValidationException( - "Invalid value "+arg+" was passed in to "+schema.getClass()+". "+ + "Invalid value "+data.arg()+" was passed in to "+data.schema().getClass()+". "+ "Value is invalid because it is disallowed by not "+not ); } 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 5bc4bbd297b..0cd88e1a7fa 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 @@ -15,17 +15,12 @@ public OneOfValidator(List> oneOf) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { - if (oneOfClass == schema.getClass()) { + if (oneOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke validate on it because that is recursive @@ -35,7 +30,7 @@ public OneOfValidator(List> oneOf) { } try { JsonSchema oneOfSchema = JsonSchemaFactory.getInstance(oneOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, data.arg(), data.validationMetadata()); validatedOneOfClasses.add(oneOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,12 +38,12 @@ public OneOfValidator(List> oneOf) { } } if (validatedOneOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the oneOf schemas matched the input data." ); } if (validatedOneOfClasses.size() > 1) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". Multiple "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". Multiple "+ "oneOf schemas validated the data, but a max of one is allowed." ); } 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 index 6104329139f..564d7a22b6d 100644 --- 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 @@ -17,17 +17,12 @@ public PatternPropertiesValidator(Map> patt @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map)) { return null; } - return patternPropertiesPathToSchemas; + return data.patternPropertiesPathToSchemas(); } public PathToSchemasMap getPatternPropertiesPathToSchemas( 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 37e7a545711..57d1f5eaecb 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 @@ -3,7 +3,6 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.regex.Pattern; public class PatternValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public PatternValidator(Pattern pattern) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - if (!pattern.matcher((String) arg).find()) { - throw new ValidationException("Invalid value "+arg+" did not find a match for pattern "+pattern); + if (!pattern.matcher(stringArg).find()) { + throw new ValidationException("Invalid value "+stringArg+" did not find a match for pattern "+pattern); } return null; } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java index a8b2bda2a21..2210e30a3c6 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java @@ -14,14 +14,9 @@ public PrefixItemsValidator(List> prefixItems) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { @@ -30,13 +25,13 @@ public PrefixItemsValidator(List> prefixItems) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); int maxIndex = Math.min(listArg.size(), prefixItems.size()); for (int i=0; i < maxIndex; i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema itemsSchema = JsonSchemaFactory.getInstance(prefixItems.get(i)); PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata); 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 9b7d50b28d8..1d60593961d 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 @@ -17,14 +17,9 @@ public PropertiesValidator(Map> properties) @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -39,14 +34,14 @@ public PropertiesValidator(Map> properties) if (!presentProperties.contains(propName)) { continue; } - @Nullable Object propValue = ((Map) arg).get(propName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + @Nullable Object propValue = mapArg.get(propName); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(propName); ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); Class propClass = entry.getValue(); JsonSchema propSchema = JsonSchemaFactory.getInstance(propClass); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java new file mode 100644 index 00000000000..1825b158058 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; + +public record ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas, + @Nullable PathToSchemasMap ifPathToSchemas) { +} \ 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 b2aadbde0fc..4f6b21d2543 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -625,6 +625,7 @@ public void processOpts() { keywordValidatorFiles.add("TypeValidator"); keywordValidatorFiles.add("UniqueItemsValidator"); keywordValidatorFiles.add("UnsetAnyTypeJsonSchema"); + keywordValidatorFiles.add("ValidationData"); keywordValidatorFiles.add("ValidationMetadata"); for (String keywordValidatorFile: keywordValidatorFiles) { supportingFiles.add(new SupportingFile( 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 643b6496c4b..bce96a68e13 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 @@ -16,14 +16,9 @@ public class AdditionalPropertiesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } Set presentAdditionalProperties = new LinkedHashSet<>(); @@ -32,22 +27,22 @@ public class AdditionalPropertiesValidator implements KeywordValidator { presentAdditionalProperties.add((String) key); } } - if (schema.properties != null) { - presentAdditionalProperties.removeAll(schema.properties.keySet()); + if (data.schema().properties != null) { + presentAdditionalProperties.removeAll(data.schema().properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(addPropName); - if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + if (data.patternPropertiesPathToSchemas() != null && data.patternPropertiesPathToSchemas().containsKey(propPathToItem)) { continue; } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema addPropsSchema = JsonSchemaFactory.getInstance(additionalProperties); if (propValidationMetadata.validationRanEarlier(addPropsSchema)) { 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 505d16c9096..c92800d52e3 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 @@ -12,21 +12,14 @@ public class AllOfValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, data.arg(), data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } - - } 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 5c838eea6e8..7e472fdf0b3 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 @@ -15,17 +15,12 @@ public class AnyOfValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { - if (anyOfClass == schema.getClass()) { + if (anyOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke _validate on it because that is recursive @@ -35,7 +30,7 @@ public class AnyOfValidator implements KeywordValidator { } try { JsonSchema anyOfSchema = JsonSchemaFactory.getInstance(anyOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, data.arg(), data.validationMetadata()); validatedAnyOfClasses.add(anyOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,7 +38,7 @@ public class AnyOfValidator implements KeywordValidator { } } if (validatedAnyOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the anyOf schemas matched the input data." ); } 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 26874dbc717..27839a64053 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 @@ -16,15 +16,10 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { return null; } @@ -32,10 +27,10 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida return null; } } else { - if (Objects.equals(arg, constValue)) { + if (Objects.equals(data.arg(), constValue)) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not equal to const "+constValue); + throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue); } -} +} \ No newline at end of file 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 664d34edcf5..13a5feca9db 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 @@ -15,25 +15,20 @@ public class ContainsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { + if (data.containsPathToSchemas() == null || data.containsPathToSchemas().isEmpty()) { throw new ValidationException( - "Validation failed for contains keyword in class="+schema.getClass() - + " at pathToItem="+validationMetadata.pathToItem()+". No " + "Validation failed for contains keyword in class="+data.schema().getClass() + + " at pathToItem="+data.validationMetadata().pathToItem()+". No " + "items validated to the contains schema." ); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - for (PathToSchemasMap otherPathToSchema: containsPathToSchemas) { + for (PathToSchemasMap otherPathToSchema: data.containsPathToSchemas()) { pathToSchemas.update(otherPathToSchema); } return pathToSchemas; @@ -70,9 +65,7 @@ public class ContainsValidator implements KeywordValidator { PathToSchemasMap otherPathToSchemas = JsonSchema.validate( containsSchema, itemValue, itemValidationMetadata); containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) { - ; - } + } catch (ValidationException ignored) {} } return containsPathToSchemas; } 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 d100dddd2af..e88a04afd32 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 @@ -4,7 +4,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.exceptions.ValidationException; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -17,22 +16,17 @@ public class DependentRequiredValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } for (Map.Entry> entry: dependentRequired.entrySet()) { - if (!((Map) arg).containsKey(entry.getKey())) { + if (!mapArg.containsKey(entry.getKey())) { continue; } Set missingKeys = new HashSet<>(entry.getValue()); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { missingKeys.remove(key); } @@ -42,7 +36,7 @@ public class DependentRequiredValidator implements KeywordValidator { } throw new ValidationException( "Validation failed for dependentRequired because these_keys="+missingKeys+" are "+ - "missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass() + "missing at pathToItem="+data.validationMetadata().pathToItem()+" in class "+data.schema().getClass() ); } 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 5e78857a6f8..f57acf3873c 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 @@ -2,9 +2,7 @@ package {{{packageName}}}.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -17,14 +15,9 @@ public class DependentSchemasValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -41,10 +34,9 @@ public class DependentSchemasValidator implements KeywordValidator { } Class dependentSchemaClass = entry.getValue(); JsonSchema dependentSchema = JsonSchemaFactory.getInstance(dependentSchemaClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, mapArg, data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } } - 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 933c3bbd8fe..033abf6fd45 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMaximumValidator implements KeywordValidator { public final Number exclusiveMaximum; @@ -14,37 +12,32 @@ public class ExclusiveMaximumValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMaximum.intValue()) > -1) { + String msg = "Value " + data.arg() + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMaximum.intValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMaximum.longValue()) > -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMaximum.longValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMaximum.floatValue()) > -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMaximum.floatValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMaximum.doubleValue()) > -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMaximum.doubleValue()) > -1) { throw new ValidationException(msg); } 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 8b6ddb286c5..4e4e096760a 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMinimumValidator implements KeywordValidator { public final Number exclusiveMinimum; @@ -14,37 +12,32 @@ public class ExclusiveMinimumValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMinimum.intValue()) < 1) { + String msg = "Value " + data.arg() + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMinimum.intValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMinimum.longValue()) < 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMinimum.longValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMinimum.floatValue()) < 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMinimum.floatValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMinimum.doubleValue()) < 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMinimum.doubleValue()) < 1) { throw new ValidationException(msg); } 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 e3a03aebd6a..f5a7062396c 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 @@ -6,7 +6,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; import java.math.BigInteger; import java.time.format.DateTimeParseException; -import java.util.List; import java.util.UUID; public class FormatValidator implements KeywordValidator { @@ -25,12 +24,12 @@ public class FormatValidator implements KeywordValidator { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private Void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; if (arg instanceof Float || arg instanceof Double) { - Double doubleArg; + double doubleArg; if (arg instanceof Float) { doubleArg = arg.doubleValue(); } else { @@ -60,20 +59,17 @@ public class FormatValidator implements KeywordValidator { "Invalid value " + arg + " for format int32 at " + validationMetadata.pathToItem() ); } - return null; } else if (format.equals("int64")) { if (intArg.compareTo(int64InclusiveMinimum) < 0 || intArg.compareTo(int64InclusiveMaximum) > 0) { throw new ValidationException( "Invalid value " + arg + " for format int64 at " + validationMetadata.pathToItem() ); } - return null; } - return null; } else if (format.equals("float") || format.equals("double")) { BigDecimal decimalArg; if (arg instanceof Float) { - decimalArg = new BigDecimal((Float) arg); + decimalArg = BigDecimal.valueOf(arg.doubleValue()); } else if (arg instanceof Double) { decimalArg = BigDecimal.valueOf((Double) arg); } else { @@ -85,83 +81,75 @@ public class FormatValidator implements KeywordValidator { "Invalid value "+arg+" for format float at "+validationMetadata.pathToItem() ); } - return null; - } else if (format.equals("double")) { + } else { if (decimalArg.compareTo(doubleInclusiveMinimum) < 0 || decimalArg.compareTo(doubleInclusiveMaximum) > 0 ){ throw new ValidationException( "Invalid value "+arg+" for format double at "+validationMetadata.pathToItem() ); } - return null; } } - return null; } - private Void validateStringFormat(String arg, ValidationMetadata validationMetadata) { - if (format.equals("uuid")) { - try { - UUID.fromString(arg); - } catch (IllegalArgumentException e) { - throw new ValidationException( - "Value cannot be converted to a UUID. Invalid value "+ - arg+" for format uuid at "+validationMetadata.pathToItem() - ); + private void validateStringFormat(String arg, ValidationMetadata validationMetadata) { + switch (format) { + case "uuid" -> { + try { + UUID.fromString(arg); + } catch (IllegalArgumentException e) { + throw new ValidationException( + "Value cannot be converted to a UUID. Invalid value " + + arg + " for format uuid at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("number")) { - try { - new BigDecimal(arg); - } catch (NumberFormatException e) { - throw new ValidationException( - "Value cannot be converted to a decimal. Invalid value "+ - arg+" for format number at "+validationMetadata.pathToItem() - ); + case "number" -> { + try { + new BigDecimal(arg); + } catch (NumberFormatException e) { + throw new ValidationException( + "Value cannot be converted to a decimal. Invalid value " + + arg + " for format number at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date")) { - try { - new CustomIsoparser().parseIsodate(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 date format. "+ - "Invalid value "+arg+" for format date at "+validationMetadata.pathToItem() - ); + case "date" -> { + try { + new CustomIsoparser().parseIsodate(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 date format. " + + "Invalid value " + arg + " for format date at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date-time")) { - try { - new CustomIsoparser().parseIsodatetime(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 datetime format. "+ - "Invalid value "+arg+" for format datetime at "+validationMetadata.pathToItem() - ); + case "date-time" -> { + try { + new CustomIsoparser().parseIsodatetime(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 datetime format. " + + "Invalid value " + arg + " for format datetime at " + validationMetadata.pathToItem() + ); + } } - return null; } - return null; } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { + if (data.arg() instanceof Number numberArg) { validateNumericFormat( - (Number) arg, - validationMetadata + numberArg, + data.validationMetadata() ); return null; - } else if (arg instanceof String) { + } else if (data.arg() instanceof String stringArg) { validateStringFormat( - (String) arg, - validationMetadata + stringArg, + data.validationMetadata() ); return null; } diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs index 5b174883b2b..de730ac07d9 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs @@ -4,13 +4,6 @@ import {{{packageName}}}.exceptions.ValidationException; import {{{packageName}}}.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class IfValidator implements KeywordValidator { public final Class ifSchema; @@ -20,14 +13,9 @@ public class IfValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (ifPathToSchemas == null) { + if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } /* 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 8f97f9bff13..de02d6cfe03 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 @@ -14,30 +14,25 @@ public class ItemsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - int minIndex = schema.prefixItems != null ? schema.prefixItems.size() : 0; + int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0; JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items); for(int i = minIndex; i < listArg.size(); i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); if (itemValidationMetadata.validationRanEarlier(itemsSchema)) { // todo add_deeper_validated_schemas 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 381228b3282..c6eddd7f55e 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 @@ -8,12 +8,7 @@ import java.util.List; public interface KeywordValidator { @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) throws ValidationException; default List getContainsPathToSchemas( diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxContainsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/MaxContainsValidator.hbs index 4308f9e46e9..e53f8b66a5d 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 @@ -14,23 +14,18 @@ public class MaxContainsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() > maxContains) { + if (data.containsPathToSchemas().size() > maxContains) { throw new ValidationException( - "Validation failed for maxContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema." + "Validation failed for maxContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." ); } 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 98591a67fd0..6e45380d273 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 @@ -14,18 +14,13 @@ public class MaxItemsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() > maxItems) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxItems of " + maxItems); + if (listArg.size() > maxItems) { + throw new ValidationException("Value " + listArg + " is invalid because has > the maxItems of " + maxItems); } 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 fb970be06fb..0cb83eb7e25 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaxLengthValidator extends LengthValidator implements KeywordValidator { public final int maxLength; @@ -14,19 +12,14 @@ public class MaxLengthValidator extends LengthValidator implements KeywordValida @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length > maxLength) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxLength of " + maxLength); + throw new ValidationException("Value " + stringArg + " is invalid because has > the maxLength of " + maxLength); } 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 c3c398dd1e7..e84572cc0d3 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 @@ -3,7 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public class MaxPropertiesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() > maxProperties) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxProperties of " + maxProperties); + if (mapArg.size() > maxProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has > the maxProperties of " + maxProperties); } 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 67afa868a6f..8d7745df053 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaximumValidator implements KeywordValidator { public final Number maximum; @@ -14,41 +12,36 @@ public class MaximumValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is > the maximum of " + maximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(maximum.intValue()) == 1) { + String msg = "Value " + data.arg() + " is invalid because it is > the maximum of " + maximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(maximum.intValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(maximum.longValue()) == 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(maximum.longValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(maximum.floatValue()) == 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(maximum.floatValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(maximum.doubleValue()) == 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(maximum.doubleValue()) > 0) { throw new ValidationException(msg); } return null; } return null; } -} +} \ No newline at end of file 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 0dfa4ff0795..0f662efa9b6 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 @@ -14,23 +14,18 @@ public class MinContainsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() < minContains) { + if (data.containsPathToSchemas().size() < minContains) { throw new ValidationException( - "Validation failed for minContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema." + "Validation failed for minContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too few items validated to the contains schema." ); } 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 9216734c461..0ebe7ed649b 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 @@ -14,18 +14,13 @@ public class MinItemsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() < minItems) { - throw new ValidationException("Value " + arg + " is invalid because has < the minItems of " + minItems); + if (listArg.size() < minItems) { + throw new ValidationException("Value " + listArg + " is invalid because has < the minItems of " + minItems); } 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 925f83e5a3c..b1604b29fa8 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinLengthValidator extends LengthValidator implements KeywordValidator { public final int minLength; @@ -14,20 +12,15 @@ public class MinLengthValidator extends LengthValidator implements KeywordValida @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length < minLength) { - throw new ValidationException("Value " + arg + " is invalid because has < the minLength of " + minLength); + throw new ValidationException("Value " + stringArg + " is invalid because has < the minLength of " + minLength); } return null; } -} +} \ No newline at end of file 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 80ea144457f..6a2c391d553 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 @@ -3,7 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public class MinPropertiesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() < minProperties) { - throw new ValidationException("Value " + arg + " is invalid because has < the minProperties of " + minProperties); + if (mapArg.size() < minProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has < the minProperties of " + minProperties); } 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 55b9ed98cc2..3c4e715e5c1 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 @@ -3,8 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinimumValidator implements KeywordValidator { public final Number minimum; @@ -14,37 +12,32 @@ public class MinimumValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is < the minimum of " + minimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(minimum.intValue()) == -1) { + String msg = "Value " + data.arg() + " is invalid because it is < the minimum of " + minimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(minimum.intValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(minimum.longValue()) == -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(minimum.longValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(minimum.floatValue()) == -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(minimum.floatValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(minimum.doubleValue()) == -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(minimum.doubleValue()) < 0) { throw new ValidationException(msg); } 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 df3ed47bfc3..6858250347b 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 @@ -3,7 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { @@ -15,21 +14,16 @@ public class MultipleOfValidator extends BigDecimalValidator implements KeywordV @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + if (!(data.arg() instanceof Number numberArg)) { return null; } - BigDecimal castArg = getBigDecimal((Number) arg); - String msg = "Value " + arg + " is invalid because it is not a multiple of " + multipleOf; + BigDecimal castArg = getBigDecimal(numberArg); + String msg = "Value " + numberArg + " is invalid because it is not a multiple of " + multipleOf; if (castArg.remainder(multipleOf).compareTo(BigDecimal.ZERO) != 0) { throw new ValidationException(msg); } return null; } -} +} \ No newline at end of file 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 3ac7c4b3507..74caa05b1cc 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 @@ -3,13 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class NotValidator implements KeywordValidator { public final Class not; @@ -19,26 +12,22 @@ public class NotValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); - pathToSchemas = JsonSchema.validate(notSchema, arg, validationMetadata); + pathToSchemas = JsonSchema.validate(notSchema, data.arg(), data.validationMetadata()); } catch (ValidationException e) { return null; } if (!pathToSchemas.isEmpty()) { throw new ValidationException( - "Invalid value "+arg+" was passed in to "+schema.getClass()+". "+ + "Invalid value "+data.arg()+" was passed in to "+data.schema().getClass()+". "+ "Value is invalid because it is disallowed by not "+not ); } return null; } } + 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 a55f2f7b8ab..02d0f42837f 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 @@ -15,17 +15,12 @@ public class OneOfValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { - if (oneOfClass == schema.getClass()) { + if (oneOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke validate on it because that is recursive @@ -35,7 +30,7 @@ public class OneOfValidator implements KeywordValidator { } try { JsonSchema oneOfSchema = JsonSchemaFactory.getInstance(oneOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, data.arg(), data.validationMetadata()); validatedOneOfClasses.add(oneOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,12 +38,12 @@ public class OneOfValidator implements KeywordValidator { } } if (validatedOneOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the oneOf schemas matched the input data." ); } if (validatedOneOfClasses.size() > 1) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". Multiple "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". Multiple "+ "oneOf schemas validated the data, but a max of one is allowed." ); } 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 index b67f6f1c97e..1d3845f70d0 100644 --- 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 @@ -17,17 +17,12 @@ public class PatternPropertiesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map)) { return null; } - return patternPropertiesPathToSchemas; + return data.patternPropertiesPathToSchemas(); } public PathToSchemasMap getPatternPropertiesPathToSchemas( @@ -65,4 +60,3 @@ public class PatternPropertiesValidator implements KeywordValidator { 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 6cdc7f21a77..ce9e1f12d5f 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 @@ -3,7 +3,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.regex.Pattern; public class PatternValidator implements KeywordValidator { @@ -15,18 +14,13 @@ public class PatternValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + if (!(data.arg() instanceof String stringArg)) { return null; } - if (!pattern.matcher((String) arg).find()) { - throw new ValidationException("Invalid value "+arg+" did not find a match for pattern "+pattern); + if (!pattern.matcher(stringArg).find()) { + throw new ValidationException("Invalid value "+stringArg+" did not find a match for pattern "+pattern); } return null; } diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs index a938edfd38b..1b93003d4c9 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs @@ -14,14 +14,9 @@ public class PrefixItemsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { @@ -30,13 +25,13 @@ public class PrefixItemsValidator implements KeywordValidator { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); int maxIndex = Math.min(listArg.size(), prefixItems.size()); for (int i=0; i < maxIndex; i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema itemsSchema = JsonSchemaFactory.getInstance(prefixItems.get(i)); PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata); 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 0a60eefd072..a6dafcc609e 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 @@ -17,14 +17,9 @@ public class PropertiesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -39,14 +34,14 @@ public class PropertiesValidator implements KeywordValidator { if (!presentProperties.contains(propName)) { continue; } - @Nullable Object propValue = ((Map) arg).get(propName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + @Nullable Object propValue = mapArg.get(propName); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(propName); ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); Class propClass = entry.getValue(); JsonSchema propSchema = JsonSchemaFactory.getInstance(propClass); diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs new file mode 100644 index 00000000000..b77ce330391 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs @@ -0,0 +1,12 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public record ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas, + @Nullable PathToSchemasMap ifPathToSchemas +) {} \ No newline at end of file From cdaf9fde606ff27616987d4a9a3d2bc632204913 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 14:45:08 -0800 Subject: [PATCH 02/21] Updates remaining keywordValidators --- .../client/schemas/validation/JsonSchema.java | 6 +++--- .../validation/PropertyNamesValidator.java | 19 +++++++------------ .../schemas/validation/RequiredValidator.java | 13 ++++--------- .../schemas/validation/TypeValidator.java | 15 +++++---------- .../validation/UniqueItemsValidator.java | 11 +++-------- .../schemas/validation/JsonSchema.hbs | 6 +++--- .../validation/PropertyNamesValidator.hbs | 19 +++++++------------ .../schemas/validation/RequiredValidator.hbs | 13 ++++--------- .../schemas/validation/TypeValidator.hbs | 15 +++++---------- .../validation/UniqueItemsValidator.hbs | 11 +++-------- 10 files changed, 44 insertions(+), 84 deletions(-) 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 551c586665c..42aedfa66fb 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 @@ -338,7 +338,7 @@ public static PathToSchemasMap validate( } } KeywordValidator validator = entry.getValue(); - @Nullable PathToSchemasMap otherPathToSchemas = validator.validate( + ValidationData data = new ValidationData( jsonSchema, arg, validationMetadata, @@ -346,6 +346,7 @@ public static PathToSchemasMap validate( patternPropertiesPathToSchemas, ifPathToSchemas ); + @Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data); if (otherPathToSchemas == null) { continue; } @@ -401,10 +402,9 @@ protected List castToAllowedTypes(List arg, List pathToItem, Set argFixed = new LinkedHashMap<>(); for (Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { + if (!(entryKey instanceof String key)) { throw new InvalidTypeException("Invalid non-string key value"); } - String key = (String) entryKey; Object val = entry.getValue(); List newPathToItem = new ArrayList<>(pathToItem); newPathToItem.add(key); 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 5154911d484..b7cc3fcf27e 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 @@ -15,26 +15,21 @@ public PropertyNamesValidator(Class propertyNames) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } JsonSchema propertyNamesSchema = JsonSchemaFactory.getInstance(propertyNames); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(key); ValidationMetadata keyValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema.validate(propertyNamesSchema, key, keyValidationMetadata); } 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 f68aef2b87a..9212dbd3de4 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 @@ -17,18 +17,13 @@ public RequiredValidator(Set required) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } Set missingRequiredProperties = new HashSet<>(required); - for (Object key: ((Map) arg).keySet()) { + for (Object key: mapArg.keySet()) { if (key instanceof String) { missingRequiredProperties.remove(key); } @@ -40,7 +35,7 @@ public RequiredValidator(Set required) { pluralChar = "s"; } throw new ValidationException( - schema.getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps + data.schema().getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps ); } 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 f1fcd9d5cdd..e2c73342afe 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 @@ -16,22 +16,17 @@ public TypeValidator(Set> type) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { Class argClass; - if (arg == null) { + if (data.arg() == null) { argClass = Void.class; - } else if (arg instanceof List) { + } else if (data.arg() instanceof List) { argClass = List.class; - } else if (arg instanceof Map) { + } else if (data.arg() instanceof Map) { argClass = Map.class; } else { - argClass = arg.getClass(); + argClass = data.arg().getClass(); } if (!type.contains(argClass)) { throw new ValidationException("invalid type"); 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 4cdbbe01060..91f8efc5851 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 @@ -16,21 +16,16 @@ public UniqueItemsValidator(boolean uniqueItems) { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (!uniqueItems) { return null; } Set<@Nullable Object> seenItems = new HashSet<>(); - for (@Nullable Object item: (List) arg) { + for (@Nullable Object item: listArg) { int startingSeenItemsSize = seenItems.size(); seenItems.add(item); if (seenItems.size() == startingSeenItemsSize) { 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 e0af16453e0..fe309005d00 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 @@ -338,7 +338,7 @@ public abstract class JsonSchema { } } KeywordValidator validator = entry.getValue(); - @Nullable PathToSchemasMap otherPathToSchemas = validator.validate( + ValidationData data = new ValidationData( jsonSchema, arg, validationMetadata, @@ -346,6 +346,7 @@ public abstract class JsonSchema { patternPropertiesPathToSchemas, ifPathToSchemas ); + @Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data); if (otherPathToSchemas == null) { continue; } @@ -401,10 +402,9 @@ public abstract class JsonSchema { LinkedHashMap argFixed = new LinkedHashMap<>(); for (Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { + if (!(entryKey instanceof String key)) { throw new InvalidTypeException("Invalid non-string key value"); } - String key = (String) entryKey; Object val = entry.getValue(); List newPathToItem = new ArrayList<>(pathToItem); newPathToItem.add(key); 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 adeea3fe3bf..3511fcbaea1 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 @@ -15,26 +15,21 @@ public class PropertyNamesValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } JsonSchema propertyNamesSchema = JsonSchemaFactory.getInstance(propertyNames); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(key); ValidationMetadata keyValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema.validate(propertyNamesSchema, key, keyValidationMetadata); } 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 33d8e66bf6d..60c7db38172 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 @@ -17,18 +17,13 @@ public class RequiredValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { return null; } Set missingRequiredProperties = new HashSet<>(required); - for (Object key: ((Map) arg).keySet()) { + for (Object key: mapArg.keySet()) { if (key instanceof String) { missingRequiredProperties.remove(key); } @@ -40,7 +35,7 @@ public class RequiredValidator implements KeywordValidator { pluralChar = "s"; } throw new ValidationException( - schema.getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps + data.schema().getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps ); } 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 c8d37de1477..28fa80fc9c7 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 @@ -16,22 +16,17 @@ public class TypeValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { Class argClass; - if (arg == null) { + if (data.arg() == null) { argClass = Void.class; - } else if (arg instanceof List) { + } else if (data.arg() instanceof List) { argClass = List.class; - } else if (arg instanceof Map) { + } else if (data.arg() instanceof Map) { argClass = Map.class; } else { - argClass = arg.getClass(); + argClass = data.arg().getClass(); } if (!type.contains(argClass)) { throw new ValidationException("invalid type"); 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 06bce39321b..21f5575ca2f 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 @@ -16,21 +16,16 @@ public class UniqueItemsValidator implements KeywordValidator { @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (!uniqueItems) { return null; } Set<@Nullable Object> seenItems = new HashSet<>(); - for (@Nullable Object item: (List) arg) { + for (@Nullable Object item: listArg) { int startingSeenItemsSize = seenItems.size(); seenItems.add(item); if (seenItems.size() == startingSeenItemsSize) { From f7a555b826e4e907f6ee8d9cb5d902034d0a9e45 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 14:47:11 -0800 Subject: [PATCH 03/21] Fixes enum validator --- .../client/schemas/validation/EnumValidator.java | 16 +++++----------- .../schemas/validation/EnumValidator.hbs | 16 +++++----------- 2 files changed, 10 insertions(+), 22 deletions(-) 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 6cc9459e1a8..cb819afe711 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 @@ -4,7 +4,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { @@ -21,18 +20,13 @@ private boolean enumContainsArg(@Nullable Object arg){ @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (enumContainsArg(castArg)) { return null; } @@ -42,10 +36,10 @@ private boolean enumContainsArg(@Nullable Object arg){ } } } else { - if (enumContainsArg(arg)) { + if (enumContainsArg(data.arg())) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not one of the allowed enum "+enumValues); + throw new ValidationException("Invalid value "+data.arg()+" was not one of the allowed enum "+enumValues); } } 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 9ebbb8359be..6889e660e60 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 @@ -4,7 +4,6 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { @@ -21,18 +20,13 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (enumContainsArg(castArg)) { return null; } @@ -42,10 +36,10 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat } } } else { - if (enumContainsArg(arg)) { + if (enumContainsArg(data.arg())) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not one of the allowed enum "+enumValues); + throw new ValidationException("Invalid value "+data.arg()+" was not one of the allowed enum "+enumValues); } } From 0c9262d0e89a92b365f8affe96b7b17fda24b618 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:01:37 -0800 Subject: [PATCH 04/21] Adds vars to fix nullness checks --- .../client/schemas/validation/ContainsValidator.java | 5 +++-- .../client/schemas/validation/MaxContainsValidator.java | 5 +++-- .../client/schemas/validation/MaxItemsValidator.java | 2 +- .../client/schemas/validation/TypeValidator.java | 9 +++++---- .../packagename/schemas/validation/ContainsValidator.hbs | 5 +++-- .../schemas/validation/MaxContainsValidator.hbs | 5 +++-- .../packagename/schemas/validation/MaxItemsValidator.hbs | 2 +- .../packagename/schemas/validation/TypeValidator.hbs | 9 +++++---- 8 files changed, 24 insertions(+), 18 deletions(-) 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 834af1bc094..b4d91682ea4 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 @@ -20,7 +20,8 @@ public ContainsValidator(Class contains) { if (!(data.arg() instanceof List)) { return null; } - if (data.containsPathToSchemas() == null || data.containsPathToSchemas().isEmpty()) { + var containsPathToSchemas = data.containsPathToSchemas(); + if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { throw new ValidationException( "Validation failed for contains keyword in class="+data.schema().getClass() + " at pathToItem="+data.validationMetadata().pathToItem()+". No " @@ -28,7 +29,7 @@ public ContainsValidator(Class contains) { ); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - for (PathToSchemasMap otherPathToSchema: data.containsPathToSchemas()) { + for (PathToSchemasMap otherPathToSchema: containsPathToSchemas) { pathToSchemas.update(otherPathToSchema); } return pathToSchemas; 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 b49320b650f..37363f2f927 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 @@ -19,10 +19,11 @@ public MaxContainsValidator(int maxContains) { if (!(data.arg() instanceof List)) { return null; } - if (data.containsPathToSchemas() == null) { + var containsPathToSchemas = data.containsPathToSchemas(); + if (containsPathToSchemas == null) { return null; } - if (data.containsPathToSchemas().size() > maxContains) { + if (containsPathToSchemas.size() > maxContains) { throw new ValidationException( "Validation failed for maxContains keyword in class="+data.schema().getClass()+ " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." 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 a5516129ab7..a3f593b2cce 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 @@ -16,7 +16,7 @@ public MaxItemsValidator(int maxItems) { public @Nullable PathToSchemasMap validate( ValidationData data ) { - if (!(data.arg() instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.size() > maxItems) { 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 e2c73342afe..ee530cce481 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,14 +19,15 @@ public TypeValidator(Set> type) { ValidationData data ) { Class argClass; - if (data.arg() == null) { + var arg = data.arg(); + if (arg == null) { argClass = Void.class; - } else if (data.arg() instanceof List) { + } else if (arg instanceof List) { argClass = List.class; - } else if (data.arg() instanceof Map) { + } else if (arg instanceof Map) { argClass = Map.class; } else { - argClass = data.arg().getClass(); + argClass = arg.getClass(); } if (!type.contains(argClass)) { throw new ValidationException("invalid type"); 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 13a5feca9db..48e9c19f948 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 @@ -20,7 +20,8 @@ public class ContainsValidator implements KeywordValidator { if (!(data.arg() instanceof List)) { return null; } - if (data.containsPathToSchemas() == null || data.containsPathToSchemas().isEmpty()) { + var containsPathToSchemas = data.containsPathToSchemas(); + if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { throw new ValidationException( "Validation failed for contains keyword in class="+data.schema().getClass() + " at pathToItem="+data.validationMetadata().pathToItem()+". No " @@ -28,7 +29,7 @@ public class ContainsValidator implements KeywordValidator { ); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - for (PathToSchemasMap otherPathToSchema: data.containsPathToSchemas()) { + for (PathToSchemasMap otherPathToSchema: containsPathToSchemas) { pathToSchemas.update(otherPathToSchema); } return pathToSchemas; 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 e53f8b66a5d..4363c7d6d0e 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 @@ -19,10 +19,11 @@ public class MaxContainsValidator implements KeywordValidator { if (!(data.arg() instanceof List)) { return null; } - if (data.containsPathToSchemas() == null) { + var containsPathToSchemas = data.containsPathToSchemas(); + if (containsPathToSchemas == null) { return null; } - if (data.containsPathToSchemas().size() > maxContains) { + if (containsPathToSchemas.size() > maxContains) { throw new ValidationException( "Validation failed for maxContains keyword in class="+data.schema().getClass()+ " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." 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 6e45380d273..373cec4d8d3 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 @@ -16,7 +16,7 @@ public class MaxItemsValidator implements KeywordValidator { public @Nullable PathToSchemasMap validate( ValidationData data ) { - if (!(data.arg() instanceof List listArg)) { + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.size() > maxItems) { 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 28fa80fc9c7..a35ae28ff9f 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,14 +19,15 @@ public class TypeValidator implements KeywordValidator { ValidationData data ) { Class argClass; - if (data.arg() == null) { + var arg = data.arg(); + if (arg == null) { argClass = Void.class; - } else if (data.arg() instanceof List) { + } else if (arg instanceof List) { argClass = List.class; - } else if (data.arg() instanceof Map) { + } else if (arg instanceof Map) { argClass = Map.class; } else { - argClass = data.arg().getClass(); + argClass = arg.getClass(); } if (!type.contains(argClass)) { throw new ValidationException("invalid type"); From c9d55f5a4b8db8bada975d2e0bc85769b5801914 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:04:36 -0800 Subject: [PATCH 05/21] Fixes TypeValidatorTest --- .../schemas/validation/TypeValidatorTest.java | 28 +++++++++++-------- .../schemas/validation/TypeValidatorTest.hbs | 28 +++++++++++-------- 2 files changed, 32 insertions(+), 24 deletions(-) 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 48433e51455..9b4d61cc5dc 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 @@ -29,12 +29,14 @@ public void testValidateSucceeds() { new LinkedHashSet<>() ); @Nullable PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "hi", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "hi", + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemasMap); } @@ -51,12 +53,14 @@ public void testValidateFailsIntIsNotString() { new LinkedHashSet<>() ); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) )); } } \ 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 3ce4264cd1c..c1336ec8c6b 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 @@ -29,12 +29,14 @@ public class TypeValidatorTest { new LinkedHashSet<>() ); @Nullable PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "hi", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "hi", + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemasMap); } @@ -51,12 +53,14 @@ public class TypeValidatorTest { new LinkedHashSet<>() ); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) )); } } \ No newline at end of file From 8c8a6f7ca53d0db398c44c8b06ed35cdda5be88f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:07:05 -0800 Subject: [PATCH 06/21] Fixes AdditionalPropertiesValidatorTest --- .../AdditionalPropertiesValidatorTest.java | 42 +++++++++++-------- .../AdditionalPropertiesValidatorTest.hbs | 42 +++++++++++-------- 2 files changed, 48 insertions(+), 36 deletions(-) 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 7e6d7d09535..a50cc52749a 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 @@ -75,12 +75,14 @@ public void testCorrectPropertySucceeds() { FrozenMap arg = new FrozenMap<>(mutableMap); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -107,12 +109,14 @@ public void testNotApplicableTypeReturnsNull() { ); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -132,12 +136,14 @@ public void testIncorrectPropertyValueFails() { FrozenMap arg = new FrozenMap<>(mutableMap); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ No newline at end of file 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 2e1a80bc048..54fe845f41d 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 @@ -75,12 +75,14 @@ public class AdditionalPropertiesValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -107,12 +109,14 @@ public class AdditionalPropertiesValidatorTest { ); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -132,12 +136,14 @@ public class AdditionalPropertiesValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ No newline at end of file From 733defd4dac32df95f668451145fcd6cf08d3da3 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:12:15 -0800 Subject: [PATCH 07/21] Fixes PropertiesValidatorTest --- .../validation/PropertiesValidatorTest.java | 42 +++++++++++-------- .../validation/RequiredValidatorTest.java | 42 +++++++++++-------- .../validation/PropertiesValidatorTest.hbs | 42 +++++++++++-------- .../validation/RequiredValidatorTest.hbs | 42 +++++++++++-------- 4 files changed, 96 insertions(+), 72 deletions(-) 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 ea58d090f1f..ef29a09fc0b 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 @@ -38,12 +38,14 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -72,12 +74,14 @@ public void testNotApplicableTypeReturnsNull() { new LinkedHashSet<>() ); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -99,12 +103,14 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", 1); FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ 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 2c26d7c7954..31824b61755 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 @@ -37,12 +37,14 @@ public void testCorrectPropertySucceeds() { FrozenMap arg = new FrozenMap<>(mutableMap); final RequiredValidator validator = new RequiredValidator(requiredProperties); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -61,12 +63,14 @@ public void testNotApplicableTypeReturnsNull() { ); final RequiredValidator validator = new RequiredValidator(requiredProperties); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -88,12 +92,14 @@ public void testIncorrectPropertyFails() { FrozenMap arg = new FrozenMap<>(mutableMap); final RequiredValidator validator = new RequiredValidator(requiredProperties); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ No newline at end of file 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 05c565fabb9..9491a1f70bd 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 @@ -38,12 +38,14 @@ public class PropertiesValidatorTest { mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -72,12 +74,14 @@ public class PropertiesValidatorTest { new LinkedHashSet<>() ); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -99,12 +103,14 @@ public class PropertiesValidatorTest { mutableMap.put("someString", 1); FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ 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 746409eff44..b4fe364a174 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 @@ -37,12 +37,14 @@ public class RequiredValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); final RequiredValidator validator = new RequiredValidator(requiredProperties); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -61,12 +63,14 @@ public class RequiredValidatorTest { ); final RequiredValidator validator = new RequiredValidator(requiredProperties); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -88,12 +92,14 @@ public class RequiredValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); final RequiredValidator validator = new RequiredValidator(requiredProperties); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } \ No newline at end of file From 0b2185dac880e4c04b6c676e55384a41c1785c8f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:15:44 -0800 Subject: [PATCH 08/21] Updates ItemsValidatorTest --- .../validation/ItemsValidatorTest.java | 42 +++++++++++-------- .../schemas/validation/ItemsValidatorTest.hbs | 42 +++++++++++-------- 2 files changed, 48 insertions(+), 36 deletions(-) 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 f9c539091f3..c36766792f4 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 @@ -34,12 +34,14 @@ public void testCorrectItemsSucceeds() { FrozenList arg = new FrozenList<>(mutableList); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -66,12 +68,14 @@ public void testNotApplicableTypeReturnsNull() { ); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -90,12 +94,14 @@ public void testIncorrectItemFails() { FrozenList arg = new FrozenList<>(mutableList); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } 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 84f2ebfc8b3..4cb6b5c225a 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 @@ -34,12 +34,14 @@ public class ItemsValidatorTest { FrozenList arg = new FrozenList<>(mutableList); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -66,12 +68,14 @@ public class ItemsValidatorTest { ); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + 1, + validationMetadata, + null, + null, + null + ) ); assertNull(pathToSchemas); } @@ -90,12 +94,14 @@ public class ItemsValidatorTest { FrozenList arg = new FrozenList<>(mutableList); final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ListJsonSchema.getInstance(), + arg, + validationMetadata, + null, + null, + null + ) )); } } From 1032c971eddb9790448ba8056037e63fb8239724 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:25:59 -0800 Subject: [PATCH 09/21] Updates FormatValidatorTest --- .../schemas/validation/ValidationData.java | 8 + .../validation/FormatValidatorTest.java | 286 ++++++++---------- .../schemas/validation/ValidationData.hbs | 10 +- .../validation/FormatValidatorTest.hbs | 286 ++++++++---------- 4 files changed, 277 insertions(+), 313 deletions(-) diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java index 1825b158058..84f8350ebec 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java @@ -11,4 +11,12 @@ public record ValidationData( @Nullable List containsPathToSchemas, @Nullable PathToSchemasMap patternPropertiesPathToSchemas, @Nullable PathToSchemasMap ifPathToSchemas) { + + public ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + this(schema, arg, validationMetadata, null, null, null); + } } \ 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 87a6bafc05f..8e59bfdb380 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 @@ -31,12 +31,11 @@ private void assertNull(@Nullable Object object) { public void testIntFormatSucceedsWithFloat() { final FormatValidator validator = new FormatValidator("int"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.0f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1.0f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -45,12 +44,11 @@ public void testIntFormatSucceedsWithFloat() { public void testIntFormatFailsWithFloat() { final FormatValidator validator = new FormatValidator("int"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.14f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.14f, + validationMetadata + ) )); } @@ -58,12 +56,11 @@ public void testIntFormatFailsWithFloat() { public void testIntFormatSucceedsWithInt() { final FormatValidator validator = new FormatValidator("int"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -72,12 +69,11 @@ public void testIntFormatSucceedsWithInt() { public void testInt32UnderMinFails() { final FormatValidator validator = new FormatValidator("int32"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -2147483649L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -2147483649L, + validationMetadata + ) )); } @@ -85,12 +81,11 @@ public void testInt32UnderMinFails() { public void testInt32InclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("int32"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -2147483648, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -2147483648, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -99,12 +94,11 @@ public void testInt32InclusiveMinSucceeds() { public void testInt32InclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("int32"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 2147483647, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 2147483647, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -113,12 +107,11 @@ public void testInt32InclusiveMaxSucceeds() { public void testInt32OverMaxFails() { final FormatValidator validator = new FormatValidator("int32"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 2147483648L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 2147483648L, + validationMetadata + ) )); } @@ -127,12 +120,11 @@ public void testInt64UnderMinFails() { final FormatValidator validator = new FormatValidator("int64"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("-9223372036854775809"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigInteger("-9223372036854775809"), + validationMetadata + ) )); } @@ -140,12 +132,11 @@ public void testInt64UnderMinFails() { public void testInt64InclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("int64"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -9223372036854775808L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -9223372036854775808L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -154,12 +145,11 @@ public void testInt64InclusiveMinSucceeds() { public void testInt64InclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("int64"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 9223372036854775807L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 9223372036854775807L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -169,12 +159,11 @@ public void testInt64OverMaxFails() { final FormatValidator validator = new FormatValidator("int64"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("9223372036854775808"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigInteger("9223372036854775808"), + validationMetadata + ) )); } @@ -182,12 +171,11 @@ public void testInt64OverMaxFails() { public void testFloatUnderMinFails() { final FormatValidator validator = new FormatValidator("float"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -3.402823466385289e+38d, + validationMetadata + ) )); } @@ -195,12 +183,11 @@ public void testFloatUnderMinFails() { public void testFloatInclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("float"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -209,12 +196,11 @@ public void testFloatInclusiveMinSucceeds() { public void testFloatInclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("float"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -223,12 +209,11 @@ public void testFloatInclusiveMaxSucceeds() { public void testFloatOverMaxFails() { final FormatValidator validator = new FormatValidator("float"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.402823466385289e+38d, + validationMetadata + ) )); } @@ -236,12 +221,11 @@ public void testFloatOverMaxFails() { public void testDoubleUnderMinFails() { final FormatValidator validator = new FormatValidator("double"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("-1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigDecimal("-1.7976931348623157082e+308"), + validationMetadata + ) )); } @@ -249,12 +233,11 @@ public void testDoubleUnderMinFails() { public void testDoubleInclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("double"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -263,12 +246,11 @@ public void testDoubleInclusiveMinSucceeds() { public void testDoubleInclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("double"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -277,12 +259,11 @@ public void testDoubleInclusiveMaxSucceeds() { public void testDoubleOverMaxFails() { final FormatValidator validator = new FormatValidator("double"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigDecimal("1.7976931348623157082e+308"), + validationMetadata + ) )); } @@ -290,12 +271,11 @@ public void testDoubleOverMaxFails() { public void testInvalidNumberStringFails() { final FormatValidator validator = new FormatValidator("number"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -303,12 +283,11 @@ public void testInvalidNumberStringFails() { public void testValidFloatNumberStringSucceeds() { final FormatValidator validator = new FormatValidator("number"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "3.14", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "3.14", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -317,12 +296,11 @@ public void testValidFloatNumberStringSucceeds() { public void testValidIntNumberStringSucceeds() { final FormatValidator validator = new FormatValidator("number"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "1", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "1", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -331,12 +309,11 @@ public void testValidIntNumberStringSucceeds() { public void testInvalidDateStringFails() { final FormatValidator validator = new FormatValidator("date"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -344,12 +321,11 @@ public void testInvalidDateStringFails() { public void testValidDateStringSucceeds() { final FormatValidator validator = new FormatValidator("date"); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-01-20", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "2017-01-20", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -358,12 +334,11 @@ public void testValidDateStringSucceeds() { public void testInvalidDateTimeStringFails() { final FormatValidator validator = new FormatValidator("date-time"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -371,12 +346,11 @@ public void testInvalidDateTimeStringFails() { public void testValidDateTimeStringSucceeds() { final FormatValidator validator = new FormatValidator("date-time"); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-07-21T17:32:28Z", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "2017-07-21T17:32:28Z", + validationMetadata + ) ); assertNull(pathToSchemasMap); } diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs index b77ce330391..a0b084ff935 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs @@ -9,4 +9,12 @@ public record ValidationData( @Nullable List containsPathToSchemas, @Nullable PathToSchemasMap patternPropertiesPathToSchemas, @Nullable PathToSchemasMap ifPathToSchemas -) {} \ No newline at end of file +) { + public ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + this(schema, arg, validationMetadata, null, null, null); + } +} \ 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 c9027395af2..fbe31f1b61b 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 @@ -31,12 +31,11 @@ public class FormatValidatorTest { public void testIntFormatSucceedsWithFloat() { final FormatValidator validator = new FormatValidator("int"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.0f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1.0f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -45,12 +44,11 @@ public class FormatValidatorTest { public void testIntFormatFailsWithFloat() { final FormatValidator validator = new FormatValidator("int"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.14f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.14f, + validationMetadata + ) )); } @@ -58,12 +56,11 @@ public class FormatValidatorTest { public void testIntFormatSucceedsWithInt() { final FormatValidator validator = new FormatValidator("int"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -72,12 +69,11 @@ public class FormatValidatorTest { public void testInt32UnderMinFails() { final FormatValidator validator = new FormatValidator("int32"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -2147483649L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -2147483649L, + validationMetadata + ) )); } @@ -85,12 +81,11 @@ public class FormatValidatorTest { public void testInt32InclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("int32"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -2147483648, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -2147483648, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -99,12 +94,11 @@ public class FormatValidatorTest { public void testInt32InclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("int32"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 2147483647, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 2147483647, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -113,12 +107,11 @@ public class FormatValidatorTest { public void testInt32OverMaxFails() { final FormatValidator validator = new FormatValidator("int32"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 2147483648L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 2147483648L, + validationMetadata + ) )); } @@ -127,12 +120,11 @@ public class FormatValidatorTest { final FormatValidator validator = new FormatValidator("int64"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("-9223372036854775809"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigInteger("-9223372036854775809"), + validationMetadata + ) )); } @@ -140,12 +132,11 @@ public class FormatValidatorTest { public void testInt64InclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("int64"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -9223372036854775808L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -9223372036854775808L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -154,12 +145,11 @@ public class FormatValidatorTest { public void testInt64InclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("int64"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 9223372036854775807L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 9223372036854775807L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -169,12 +159,11 @@ public class FormatValidatorTest { final FormatValidator validator = new FormatValidator("int64"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("9223372036854775808"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigInteger("9223372036854775808"), + validationMetadata + ) )); } @@ -182,12 +171,11 @@ public class FormatValidatorTest { public void testFloatUnderMinFails() { final FormatValidator validator = new FormatValidator("float"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -3.402823466385289e+38d, + validationMetadata + ) )); } @@ -195,12 +183,11 @@ public class FormatValidatorTest { public void testFloatInclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("float"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -209,12 +196,11 @@ public class FormatValidatorTest { public void testFloatInclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("float"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -223,12 +209,11 @@ public class FormatValidatorTest { public void testFloatOverMaxFails() { final FormatValidator validator = new FormatValidator("float"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 3.402823466385289e+38d, + validationMetadata + ) )); } @@ -236,12 +221,11 @@ public class FormatValidatorTest { public void testDoubleUnderMinFails() { final FormatValidator validator = new FormatValidator("double"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("-1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigDecimal("-1.7976931348623157082e+308"), + validationMetadata + ) )); } @@ -249,12 +233,11 @@ public class FormatValidatorTest { public void testDoubleInclusiveMinSucceeds() { final FormatValidator validator = new FormatValidator("double"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + -1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -263,12 +246,11 @@ public class FormatValidatorTest { public void testDoubleInclusiveMaxSucceeds() { final FormatValidator validator = new FormatValidator("double"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + 1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -277,12 +259,11 @@ public class FormatValidatorTest { public void testDoubleOverMaxFails() { final FormatValidator validator = new FormatValidator("double"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + new BigDecimal("1.7976931348623157082e+308"), + validationMetadata + ) )); } @@ -290,12 +271,11 @@ public class FormatValidatorTest { public void testInvalidNumberStringFails() { final FormatValidator validator = new FormatValidator("number"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -303,12 +283,11 @@ public class FormatValidatorTest { public void testValidFloatNumberStringSucceeds() { final FormatValidator validator = new FormatValidator("number"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "3.14", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "3.14", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -317,12 +296,11 @@ public class FormatValidatorTest { public void testValidIntNumberStringSucceeds() { final FormatValidator validator = new FormatValidator("number"); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "1", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + NumberJsonSchema.getInstance(), + "1", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -331,12 +309,11 @@ public class FormatValidatorTest { public void testInvalidDateStringFails() { final FormatValidator validator = new FormatValidator("date"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -344,12 +321,11 @@ public class FormatValidatorTest { public void testValidDateStringSucceeds() { final FormatValidator validator = new FormatValidator("date"); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-01-20", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "2017-01-20", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @@ -358,12 +334,11 @@ public class FormatValidatorTest { public void testInvalidDateTimeStringFails() { final FormatValidator validator = new FormatValidator("date-time"); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @@ -371,12 +346,11 @@ public class FormatValidatorTest { public void testValidDateTimeStringSucceeds() { final FormatValidator validator = new FormatValidator("date-time"); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-07-21T17:32:28Z", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "2017-07-21T17:32:28Z", + validationMetadata + ) ); assertNull(pathToSchemasMap); } From 17f3b2ac1a751dbee95fcbd2f8d05b02cc57ccd7 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:37:16 -0800 Subject: [PATCH 10/21] Extracts getContainsPathToSchemas --- .../schemas/validation/ContainsValidator.java | 36 ---------------- .../client/schemas/validation/JsonSchema.java | 41 +++++++++++++++++-- .../schemas/validation/KeywordValidator.java | 10 ----- .../schemas/validation/ContainsValidator.hbs | 36 ---------------- .../schemas/validation/JsonSchema.hbs | 41 +++++++++++++++++-- .../schemas/validation/KeywordValidator.hbs | 10 ----- 6 files changed, 76 insertions(+), 98 deletions(-) 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 b4d91682ea4..68fddbb2570 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 @@ -34,40 +34,4 @@ public ContainsValidator(Class contains) { } return pathToSchemas; } - - public List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - if (!(arg instanceof List)) { - return new ArrayList<>(); - } - @Nullable List containsPathToSchemas = new ArrayList<>(); - int i = 0; - for(Object itemValue: (List) arg) { - PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); - itemPathToItem.add(i); - ValidationMetadata itemValidationMetadata = new ValidationMetadata( - itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() - ); - JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); - if (itemValidationMetadata.validationRanEarlier(containsSchema)) { - // todo add_deeper_validated_schemas - containsPathToSchemas.add(thesePathToSchemas); - i += 1; - continue; - } - - try { - PathToSchemasMap otherPathToSchemas = JsonSchema.validate( - containsSchema, itemValue, itemValidationMetadata); - containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) {} - } - return containsPathToSchemas; - } } \ 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/JsonSchema.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java index 42aedfa66fb..3ca8b4b1f61 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 @@ -306,6 +306,42 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { public abstract @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException; public abstract @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException; + private List getContainsPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof List listArg) || contains == null) { + return new ArrayList<>(); + } + JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); + @Nullable List containsPathToSchemas = new ArrayList<>(); + int i = 0; + for(Object itemValue: listArg) { + PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); + List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + itemPathToItem.add(i); + ValidationMetadata itemValidationMetadata = new ValidationMetadata( + itemPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + if (itemValidationMetadata.validationRanEarlier(containsSchema)) { + // todo add_deeper_validated_schemas + containsPathToSchemas.add(thesePathToSchemas); + i += 1; + continue; + } + + try { + PathToSchemasMap otherPathToSchemas = JsonSchema.validate( + containsSchema, itemValue, itemValidationMetadata); + containsPathToSchemas.add(otherPathToSchemas); + } catch (ValidationException ignored) {} + } + return containsPathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -315,9 +351,8 @@ public static PathToSchemasMap validate( PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; @Nullable List containsPathToSchemas = null; - KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); - if (containsValidator != null) { - containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("contains")) { + containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); 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 a00d38ad61b..70b664ead8f 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 @@ -3,21 +3,11 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.List; - public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data ) throws ValidationException; - default List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new ArrayList<>(); - } - default PathToSchemasMap getPatternPropertiesPathToSchemas( @Nullable Object arg, ValidationMetadata validationMetadata 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 48e9c19f948..546220b317f 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 @@ -34,40 +34,4 @@ public class ContainsValidator implements KeywordValidator { } return pathToSchemas; } - - public List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - if (!(arg instanceof List)) { - return new ArrayList<>(); - } - @Nullable List containsPathToSchemas = new ArrayList<>(); - int i = 0; - for(Object itemValue: (List) arg) { - PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); - itemPathToItem.add(i); - ValidationMetadata itemValidationMetadata = new ValidationMetadata( - itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() - ); - JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); - if (itemValidationMetadata.validationRanEarlier(containsSchema)) { - // todo add_deeper_validated_schemas - containsPathToSchemas.add(thesePathToSchemas); - i += 1; - continue; - } - - try { - PathToSchemasMap otherPathToSchemas = JsonSchema.validate( - containsSchema, itemValue, itemValidationMetadata); - containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) {} - } - return containsPathToSchemas; - } } \ No newline at end of file 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 fe309005d00..b23e5741789 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 @@ -306,6 +306,42 @@ public abstract class JsonSchema { public abstract @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException; public abstract @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException; + private List getContainsPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof List listArg) || contains == null) { + return new ArrayList<>(); + } + JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); + @Nullable List containsPathToSchemas = new ArrayList<>(); + int i = 0; + for(Object itemValue: listArg) { + PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); + List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + itemPathToItem.add(i); + ValidationMetadata itemValidationMetadata = new ValidationMetadata( + itemPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + if (itemValidationMetadata.validationRanEarlier(containsSchema)) { + // todo add_deeper_validated_schemas + containsPathToSchemas.add(thesePathToSchemas); + i += 1; + continue; + } + + try { + PathToSchemasMap otherPathToSchemas = JsonSchema.validate( + containsSchema, itemValue, itemValidationMetadata); + containsPathToSchemas.add(otherPathToSchemas); + } catch (ValidationException ignored) {} + } + return containsPathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -315,9 +351,8 @@ public abstract class JsonSchema { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; @Nullable List containsPathToSchemas = null; - KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); - if (containsValidator != null) { - containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("contains")) { + containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); 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 c6eddd7f55e..e28b76f28ed 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 @@ -3,21 +3,11 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.List; - public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data ) throws ValidationException; - default List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new ArrayList<>(); - } - default PathToSchemasMap getPatternPropertiesPathToSchemas( @Nullable Object arg, ValidationMetadata validationMetadata From cf1460fa30459b094b812c0875056f6629f39d99 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:43:31 -0800 Subject: [PATCH 11/21] Extracts getPatternPropertiesPathToSchemas --- .../client/schemas/validation/JsonSchema.java | 40 +++++++++++++++++-- .../schemas/validation/KeywordValidator.java | 7 ---- .../PatternPropertiesValidator.java | 38 ------------------ .../schemas/validation/JsonSchema.hbs | 40 +++++++++++++++++-- .../schemas/validation/KeywordValidator.hbs | 7 ---- .../validation/PatternPropertiesValidator.hbs | 38 ------------------ 6 files changed, 74 insertions(+), 96 deletions(-) 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 3ca8b4b1f61..4aecbb17c9f 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 @@ -342,6 +342,41 @@ private List getContainsPathToSchemas( return containsPathToSchemas; } + private PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg) || patternProperties == null) { + 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; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -355,9 +390,8 @@ public static PathToSchemasMap validate( containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; - KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); - if (patternPropertiesValidator != null) { - patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("patternProperties")) { + patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; KeywordValidator ifValidator = thisKeywordToValidator.get("if"); 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 70b664ead8f..cc17811e2e2 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 @@ -8,13 +8,6 @@ public interface KeywordValidator { ValidationData data ) throws ValidationException; - default PathToSchemasMap getPatternPropertiesPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new PathToSchemasMap(); - } - default PathToSchemasMap getIfPathToSchemas( @Nullable Object arg, ValidationMetadata validationMetadata 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 index 564d7a22b6d..671854446d7 100644 --- 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 @@ -1,10 +1,7 @@ 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; @@ -24,40 +21,5 @@ public PatternPropertiesValidator(Map> patt } return data.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/JsonSchema.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/JsonSchema.hbs index b23e5741789..9f6e65c0590 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 @@ -342,6 +342,41 @@ public abstract class JsonSchema { return containsPathToSchemas; } + private PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg) || patternProperties == null) { + 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; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -355,9 +390,8 @@ public abstract class JsonSchema { containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; - KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); - if (patternPropertiesValidator != null) { - patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("patternProperties")) { + patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; KeywordValidator ifValidator = thisKeywordToValidator.get("if"); 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 e28b76f28ed..822efd573f8 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 @@ -8,13 +8,6 @@ public interface KeywordValidator { ValidationData data ) throws ValidationException; - default PathToSchemasMap getPatternPropertiesPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new PathToSchemasMap(); - } - default PathToSchemasMap getIfPathToSchemas( @Nullable Object arg, ValidationMetadata validationMetadata 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 index 1d3845f70d0..d54586468eb 100644 --- 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 @@ -1,10 +1,7 @@ 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; @@ -24,39 +21,4 @@ public class PatternPropertiesValidator implements KeywordValidator { } return data.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; - } } From 12161e605592cf21167d4c6938a9b98f1cadbc22 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 15:49:41 -0800 Subject: [PATCH 12/21] Extracts getIfPathToSchemas --- .../schemas/validation/IfValidator.java | 14 ------------- .../client/schemas/validation/JsonSchema.java | 21 ++++++++++++++++--- .../schemas/validation/KeywordValidator.java | 7 ------- .../schemas/validation/IfValidator.hbs | 14 ------------- .../schemas/validation/JsonSchema.hbs | 21 ++++++++++++++++--- .../schemas/validation/KeywordValidator.hbs | 7 ------- 6 files changed, 36 insertions(+), 48 deletions(-) diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java index 4e6f31a4eec..a7339670090 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java @@ -1,7 +1,6 @@ package org.openapijsonschematools.client.schemas.validation; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; public class IfValidator implements KeywordValidator { @@ -28,17 +27,4 @@ public IfValidator(Class ifSchema) { */ return null; } - - public PathToSchemasMap getIfPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); - PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - try { - var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); - pathToSchemas.update(otherPathToSchemas); - } catch (ValidationException | InvalidTypeException ignored) {} - return pathToSchemas; - } } 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 4aecbb17c9f..e28665c5ad4 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 @@ -377,6 +377,22 @@ private PathToSchemasMap getPatternPropertiesPathToSchemas( return pathToSchemas; } + private PathToSchemasMap getIfPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (ifSchema == null) { + return new PathToSchemasMap(); + } + JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + try { + var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); + pathToSchemas.update(otherPathToSchemas); + } catch (ValidationException | InvalidTypeException ignored) {} + return pathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -394,9 +410,8 @@ public static PathToSchemasMap validate( patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; - KeywordValidator ifValidator = thisKeywordToValidator.get("if"); - if (ifValidator != null) { - ifPathToSchemas = ifValidator.getIfPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("if")) { + ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata); } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); 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 cc17811e2e2..50c6c3c5bef 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 @@ -7,11 +7,4 @@ public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data ) throws ValidationException; - - default PathToSchemasMap getIfPathToSchemas( - @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/IfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs index de730ac07d9..4671be053a3 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs @@ -1,7 +1,6 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; -import {{{packageName}}}.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; public class IfValidator implements KeywordValidator { @@ -28,17 +27,4 @@ public class IfValidator implements KeywordValidator { */ return null; } - - public PathToSchemasMap getIfPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); - PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - try { - var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); - pathToSchemas.update(otherPathToSchemas); - } catch (ValidationException | InvalidTypeException ignored) {} - return pathToSchemas; - } } 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 9f6e65c0590..41e5d765a3d 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 @@ -377,6 +377,22 @@ public abstract class JsonSchema { return pathToSchemas; } + private PathToSchemasMap getIfPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (ifSchema == null) { + return new PathToSchemasMap(); + } + JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + try { + var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); + pathToSchemas.update(otherPathToSchemas); + } catch (ValidationException | InvalidTypeException ignored) {} + return pathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -394,9 +410,8 @@ public abstract class JsonSchema { patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; - KeywordValidator ifValidator = thisKeywordToValidator.get("if"); - if (ifValidator != null) { - ifPathToSchemas = ifValidator.getIfPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("if")) { + ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata); } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); 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 822efd573f8..1e1cf8ac717 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 @@ -7,11 +7,4 @@ public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data ) throws ValidationException; - - default PathToSchemasMap getIfPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new PathToSchemasMap(); - } } \ No newline at end of file From 1139b323cee7b27c135ada7734b334d06d2c5710 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 16:15:28 -0800 Subject: [PATCH 13/21] Updates 5 validators --- .../AdditionalPropertiesValidator.java | 10 +++----- .../schemas/validation/AllOfValidator.java | 12 +++------ .../schemas/validation/AnyOfValidator.java | 10 +++----- .../schemas/validation/ConstValidator.java | 11 +++----- .../schemas/validation/ContainsValidator.java | 7 ------ .../client/schemas/validation/JsonSchema.java | 25 ++++--------------- .../AdditionalPropertiesValidator.hbs | 10 +++----- .../schemas/validation/AllOfValidator.hbs | 12 +++------ .../schemas/validation/AnyOfValidator.hbs | 10 +++----- .../schemas/validation/ConstValidator.hbs | 11 +++----- .../schemas/validation/ContainsValidator.hbs | 7 ------ .../schemas/validation/JsonSchema.hbs | 25 ++++--------------- 12 files changed, 42 insertions(+), 108 deletions(-) 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 6d67cfb4cb2..5ed9e709f15 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 @@ -8,12 +8,6 @@ import java.util.Set; public class AdditionalPropertiesValidator implements KeywordValidator { - public final Class additionalProperties; - - public AdditionalPropertiesValidator(Class additionalProperties) { - this.additionalProperties = additionalProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -21,6 +15,10 @@ public AdditionalPropertiesValidator(Class additionalPrope if (!(data.arg() instanceof Map mapArg)) { return null; } + var additionalProperties = data.schema().additionalProperties; + if (additionalProperties == null) { + return null; + } Set presentAdditionalProperties = new LinkedHashSet<>(); for (Object key: mapArg.keySet()) { if (key instanceof String) { 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 64401d545c6..583017ea6b5 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 @@ -1,19 +1,15 @@ package org.openapijsonschematools.client.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class AllOfValidator implements KeywordValidator { - public final List> allOf; - - public AllOfValidator(List> allOf) { - this.allOf = allOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var allOf = data.schema().allOf; + if (allOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); 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 d5bb6af9356..062fa2eecdc 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 @@ -7,16 +7,14 @@ import java.util.List; public class AnyOfValidator implements KeywordValidator { - public final List> anyOf; - - public AnyOfValidator(List> anyOf) { - this.anyOf = anyOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var anyOf = data.schema().anyOf; + if (anyOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { 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 87cb96cfd29..cb9bd79f1a8 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 @@ -4,20 +4,17 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Objects; public class ConstValidator extends BigDecimalValidator implements KeywordValidator { - public final @Nullable Object constValue; - - public ConstValidator(@Nullable Object constValue) { - this.constValue = constValue; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var constValue = data.schema().constValue; + if (constValue == null) { + return null; + } if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { 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 68fddbb2570..fbfd1c9c700 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 @@ -3,16 +3,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.exceptions.ValidationException; -import java.util.ArrayList; import java.util.List; public class ContainsValidator implements KeywordValidator { - public final Class contains; - - public ContainsValidator(Class contains) { - this.contains = contains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data 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 e28665c5ad4..3e085763613 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 @@ -173,24 +173,15 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { - keywordToValidator.put( - "additionalProperties", - new AdditionalPropertiesValidator(this.additionalProperties) - ); + keywordToValidator.put("additionalProperties", new AdditionalPropertiesValidator()); } this.allOf = jsonSchemaInfo.allOf; if (this.allOf != null) { - keywordToValidator.put( - "allOf", - new AllOfValidator(this.allOf) - ); + keywordToValidator.put("allOf", new AllOfValidator()); } this.anyOf = jsonSchemaInfo.anyOf; if (this.anyOf != null) { - keywordToValidator.put( - "anyOf", - new AnyOfValidator(this.anyOf) - ); + keywordToValidator.put("anyOf", new AnyOfValidator()); } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { @@ -232,17 +223,11 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { this.constValue = jsonSchemaInfo.constValue; this.constValueSet = jsonSchemaInfo.constValueSet; if (this.constValueSet) { - keywordToValidator.put( - "const", - new ConstValidator(this.constValue) - ); + keywordToValidator.put("const", new ConstValidator()); } this.contains = jsonSchemaInfo.contains; if (this.contains != null) { - keywordToValidator.put( - "contains", - new ContainsValidator(this.contains) - ); + keywordToValidator.put("contains", new ContainsValidator()); } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { 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 bce96a68e13..5daef5c697b 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 @@ -8,12 +8,6 @@ import java.util.Map; import java.util.Set; public class AdditionalPropertiesValidator implements KeywordValidator { - public final Class additionalProperties; - - public AdditionalPropertiesValidator(Class additionalProperties) { - this.additionalProperties = additionalProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -21,6 +15,10 @@ public class AdditionalPropertiesValidator implements KeywordValidator { if (!(data.arg() instanceof Map mapArg)) { return null; } + var additionalProperties = data.schema().additionalProperties; + if (additionalProperties == null) { + return null; + } Set presentAdditionalProperties = new LinkedHashSet<>(); for (Object key: mapArg.keySet()) { if (key instanceof String) { 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 c92800d52e3..6ae68f5c87c 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 @@ -1,19 +1,15 @@ package {{{packageName}}}.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class AllOfValidator implements KeywordValidator { - public final List> allOf; - - public AllOfValidator(List> allOf) { - this.allOf = allOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var allOf = data.schema().allOf; + if (allOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); 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 7e472fdf0b3..bfd75e7433b 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 @@ -7,16 +7,14 @@ import java.util.ArrayList; import java.util.List; public class AnyOfValidator implements KeywordValidator { - public final List> anyOf; - - public AnyOfValidator(List> anyOf) { - this.anyOf = anyOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var anyOf = data.schema().anyOf; + if (anyOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { 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 27839a64053..6f875394f77 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 @@ -4,20 +4,17 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Objects; public class ConstValidator extends BigDecimalValidator implements KeywordValidator { - public final @Nullable Object constValue; - - public ConstValidator(@Nullable Object constValue) { - this.constValue = constValue; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var constValue = data.schema().constValue; + if (constValue == null) { + return null; + } if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { 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 546220b317f..727dd1b9e5f 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 @@ -3,16 +3,9 @@ package {{{packageName}}}.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.exceptions.ValidationException; -import java.util.ArrayList; import java.util.List; public class ContainsValidator implements KeywordValidator { - public final Class contains; - - public ContainsValidator(Class contains) { - this.contains = contains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data 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 41e5d765a3d..2c748e47841 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 @@ -173,24 +173,15 @@ public abstract class JsonSchema { } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { - keywordToValidator.put( - "additionalProperties", - new AdditionalPropertiesValidator(this.additionalProperties) - ); + keywordToValidator.put("additionalProperties", new AdditionalPropertiesValidator()); } this.allOf = jsonSchemaInfo.allOf; if (this.allOf != null) { - keywordToValidator.put( - "allOf", - new AllOfValidator(this.allOf) - ); + keywordToValidator.put("allOf", new AllOfValidator()); } this.anyOf = jsonSchemaInfo.anyOf; if (this.anyOf != null) { - keywordToValidator.put( - "anyOf", - new AnyOfValidator(this.anyOf) - ); + keywordToValidator.put("anyOf", new AnyOfValidator()); } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { @@ -232,17 +223,11 @@ public abstract class JsonSchema { this.constValue = jsonSchemaInfo.constValue; this.constValueSet = jsonSchemaInfo.constValueSet; if (this.constValueSet) { - keywordToValidator.put( - "const", - new ConstValidator(this.constValue) - ); + keywordToValidator.put("const", new ConstValidator()); } this.contains = jsonSchemaInfo.contains; if (this.contains != null) { - keywordToValidator.put( - "contains", - new ContainsValidator(this.contains) - ); + keywordToValidator.put("contains", new ContainsValidator()); } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { From a3fbe281a760c717fc798bbb913162009758d576 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 16:24:11 -0800 Subject: [PATCH 14/21] Fixes AdditionalPropertiesValidatorTest --- .../AdditionalPropertiesValidator.java | 5 +++-- .../AdditionalPropertiesValidatorTest.java | 22 ++++++------------- .../AdditionalPropertiesValidator.hbs | 5 +++-- .../AdditionalPropertiesValidatorTest.hbs | 22 ++++++------------- 4 files changed, 20 insertions(+), 34 deletions(-) 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 5ed9e709f15..2548452a115 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 @@ -25,8 +25,9 @@ public class AdditionalPropertiesValidator implements KeywordValidator { presentAdditionalProperties.add((String) key); } } - if (data.schema().properties != null) { - presentAdditionalProperties.removeAll(data.schema().properties.keySet()); + var properties = data.schema().properties; + if (properties != null) { + presentAdditionalProperties.removeAll(properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { 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 a50cc52749a..f98e0a7d529 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 @@ -26,6 +26,7 @@ private ObjectWithPropsSchema() { .properties(Map.ofEntries( new PropertyEntry("someString", StringJsonSchema.class) )) + .additionalProperties(StringJsonSchema.class) ); } @@ -73,15 +74,12 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", "def"); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( ObjectWithPropsSchema.getInstance(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -107,15 +105,12 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( MapJsonSchema.getInstance(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -134,15 +129,12 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( ObjectWithPropsSchema.getInstance(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } 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 5daef5c697b..4afe7f25942 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 @@ -25,8 +25,9 @@ public class AdditionalPropertiesValidator implements KeywordValidator { presentAdditionalProperties.add((String) key); } } - if (data.schema().properties != null) { - presentAdditionalProperties.removeAll(data.schema().properties.keySet()); + var properties = data.schema().properties; + if (properties != null) { + presentAdditionalProperties.removeAll(properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { 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 54fe845f41d..fa2fcf78638 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 @@ -26,6 +26,7 @@ public class AdditionalPropertiesValidatorTest { .properties(Map.ofEntries( new PropertyEntry("someString", StringJsonSchema.class) )) + .additionalProperties(StringJsonSchema.class) ); } @@ -73,15 +74,12 @@ public class AdditionalPropertiesValidatorTest { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", "def"); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( ObjectWithPropsSchema.getInstance(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -107,15 +105,12 @@ public class AdditionalPropertiesValidatorTest { new PathToSchemasMap(), new LinkedHashSet<>() ); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( MapJsonSchema.getInstance(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -134,15 +129,12 @@ public class AdditionalPropertiesValidatorTest { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( ObjectWithPropsSchema.getInstance(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } From 67fcbaa1537f1b18fdcc33dcadec603b5fb19132 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 19:17:22 -0800 Subject: [PATCH 15/21] Updates ItemsValidatorTest --- .../DependentRequiredValidator.java | 10 +- .../validation/DependentSchemasValidator.java | 10 +- .../schemas/validation/EnumValidator.java | 16 +- .../validation/ExclusiveMaximumValidator.java | 10 +- .../validation/ExclusiveMinimumValidator.java | 10 +- .../schemas/validation/FormatValidator.java | 20 +-- .../schemas/validation/IfValidator.java | 10 +- .../schemas/validation/ItemsValidator.java | 10 +- .../client/schemas/validation/JsonSchema.java | 145 ++++-------------- .../validation/MaxContainsValidator.java | 10 +- .../schemas/validation/MaxItemsValidator.java | 10 +- .../validation/MaxLengthValidator.java | 10 +- .../validation/MaxPropertiesValidator.java | 10 +- .../schemas/validation/MaximumValidator.java | 10 +- .../validation/MinContainsValidator.java | 10 +- .../schemas/validation/MinItemsValidator.java | 10 +- .../validation/MinLengthValidator.java | 10 +- .../validation/MinPropertiesValidator.java | 10 +- .../schemas/validation/MinimumValidator.java | 10 +- .../validation/MultipleOfValidator.java | 10 +- .../schemas/validation/NotValidator.java | 10 +- .../schemas/validation/OneOfValidator.java | 10 +- .../PatternPropertiesValidator.java | 11 +- .../schemas/validation/PatternValidator.java | 12 +- .../validation/PrefixItemsValidator.java | 10 +- .../validation/PropertiesValidator.java | 10 +- .../validation/PropertyNamesValidator.java | 10 +- .../schemas/validation/RequiredValidator.java | 10 +- .../schemas/validation/TypeValidator.java | 11 +- .../validation/UniqueItemsValidator.java | 10 +- .../validation/ItemsValidatorTest.java | 55 ++++--- .../validation/DependentRequiredValidator.hbs | 10 +- .../validation/DependentSchemasValidator.hbs | 10 +- .../schemas/validation/EnumValidator.hbs | 16 +- .../validation/ExclusiveMaximumValidator.hbs | 10 +- .../validation/ExclusiveMinimumValidator.hbs | 10 +- .../schemas/validation/FormatValidator.hbs | 20 +-- .../schemas/validation/IfValidator.hbs | 10 +- .../schemas/validation/ItemsValidator.hbs | 10 +- .../schemas/validation/JsonSchema.hbs | 145 ++++-------------- .../validation/MaxContainsValidator.hbs | 10 +- .../schemas/validation/MaxItemsValidator.hbs | 10 +- .../schemas/validation/MaxLengthValidator.hbs | 10 +- .../validation/MaxPropertiesValidator.hbs | 10 +- .../schemas/validation/MaximumValidator.hbs | 10 +- .../validation/MinContainsValidator.hbs | 10 +- .../schemas/validation/MinItemsValidator.hbs | 10 +- .../schemas/validation/MinLengthValidator.hbs | 10 +- .../validation/MinPropertiesValidator.hbs | 10 +- .../schemas/validation/MinimumValidator.hbs | 10 +- .../validation/MultipleOfValidator.hbs | 10 +- .../schemas/validation/NotValidator.hbs | 11 +- .../schemas/validation/OneOfValidator.hbs | 10 +- .../validation/PatternPropertiesValidator.hbs | 11 +- .../schemas/validation/PatternValidator.hbs | 14 +- .../validation/PrefixItemsValidator.hbs | 10 +- .../validation/PropertiesValidator.hbs | 11 +- .../validation/PropertyNamesValidator.hbs | 10 +- .../schemas/validation/RequiredValidator.hbs | 10 +- .../schemas/validation/TypeValidator.hbs | 11 +- .../validation/UniqueItemsValidator.hbs | 10 +- .../schemas/validation/ItemsValidatorTest.hbs | 56 ++++--- 62 files changed, 381 insertions(+), 644 deletions(-) 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 7b332ebed34..77b21ca801d 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 @@ -8,12 +8,6 @@ import java.util.Set; public class DependentRequiredValidator implements KeywordValidator { - public final Map> dependentRequired; - - public DependentRequiredValidator(Map> dependentRequired) { - this.dependentRequired = dependentRequired; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -21,6 +15,10 @@ public DependentRequiredValidator(Map> dependentRequired) { if (!(data.arg() instanceof Map mapArg)) { return null; } + var dependentRequired = data.schema().dependentRequired; + if (dependentRequired == null) { + return null; + } for (Map.Entry> entry: dependentRequired.entrySet()) { if (!mapArg.containsKey(entry.getKey())) { continue; 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 7de61b41124..3470e4a3cae 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 @@ -7,12 +7,6 @@ import java.util.Set; public class DependentSchemasValidator implements KeywordValidator { - public final Map> dependentSchemas; - - public DependentSchemasValidator(Map> dependentSchemas) { - this.dependentSchemas = dependentSchemas; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -20,6 +14,10 @@ public DependentSchemasValidator(Map> depend if (!(data.arg() instanceof Map mapArg)) { return null; } + var dependentSchemas = data.schema().dependentSchemas; + if (dependentSchemas == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); Set presentProperties = new LinkedHashSet<>(); for (Object key: mapArg.keySet()) { 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 cb819afe711..8af756619bd 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 @@ -7,14 +7,8 @@ import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { - public final Set<@Nullable Object> enumValues; - - public EnumValidator(Set<@Nullable Object> enumValues) { - this.enumValues = enumValues; - } - @SuppressWarnings("nullness") - private boolean enumContainsArg(@Nullable Object arg){ + private static boolean enumContainsArg(Set<@Nullable Object> enumValues, @Nullable Object arg){ return enumValues.contains(arg); } @@ -22,12 +16,16 @@ private boolean enumContainsArg(@Nullable Object arg){ public @Nullable PathToSchemasMap validate( ValidationData data ) { + var enumValues = data.schema().enumValues; + if (enumValues == null) { + return null; + } if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); - if (enumContainsArg(castArg)) { + if (enumContainsArg(enumValues, castArg)) { return null; } for (Object enumValue: enumValues) { @@ -36,7 +34,7 @@ private boolean enumContainsArg(@Nullable Object arg){ } } } else { - if (enumContainsArg(data.arg())) { + if (enumContainsArg(enumValues, data.arg())) { return null; } } 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 e5e0b95d89b..7d05ff65546 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class ExclusiveMaximumValidator implements KeywordValidator { - public final Number exclusiveMaximum; - - public ExclusiveMaximumValidator(Number exclusiveMaximum) { - this.exclusiveMaximum = exclusiveMaximum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var exclusiveMaximum = data.schema().exclusiveMaximum; + if (exclusiveMaximum == null) { + return null; + } if (!(data.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 2af236387e1..73eb1e547c3 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class ExclusiveMinimumValidator implements KeywordValidator { - public final Number exclusiveMinimum; - - public ExclusiveMinimumValidator(Number exclusiveMinimum) { - this.exclusiveMinimum = exclusiveMinimum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var exclusiveMinimum = data.schema().exclusiveMinimum; + if (exclusiveMinimum == null) { + return null; + } if (!(data.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 5994754f5e4..c1ca45e44f3 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 @@ -9,12 +9,6 @@ import java.util.UUID; public class FormatValidator implements KeywordValidator { - public final String format; - - public FormatValidator(String format) { - this.format = format; - } - private final static BigInteger int32InclusiveMinimum = BigInteger.valueOf(-2147483648L); private final static BigInteger int32InclusiveMaximum = BigInteger.valueOf(2147483647L); private final static BigInteger int64InclusiveMinimum = BigInteger.valueOf(-9223372036854775808L); @@ -24,7 +18,7 @@ public FormatValidator(String format) { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private static void validateNumericFormat(Number arg, ValidationMetadata validationMetadata, String format) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; @@ -91,7 +85,7 @@ private void validateNumericFormat(Number arg, ValidationMetadata validationMeta } } - private void validateStringFormat(String arg, ValidationMetadata validationMetadata) { + private static void validateStringFormat(String arg, ValidationMetadata validationMetadata, String format) { switch (format) { case "uuid" -> { try { @@ -140,16 +134,22 @@ private void validateStringFormat(String arg, ValidationMetadata validationMetad public @Nullable PathToSchemasMap validate( ValidationData data ) { + var format = data.schema().format; + if (format == null) { + return null; + } if (data.arg() instanceof Number numberArg) { validateNumericFormat( numberArg, - data.validationMetadata() + data.validationMetadata(), + format ); return null; } else if (data.arg() instanceof String stringArg) { validateStringFormat( stringArg, - data.validationMetadata() + data.validationMetadata(), + format ); return null; } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java index a7339670090..b145ab8007a 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class IfValidator implements KeywordValidator { - public final Class ifSchema; - - public IfValidator(Class ifSchema) { - this.ifSchema = ifSchema; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var ifSchema = data.schema().ifSchema; + if (ifSchema == null) { + return null; + } if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } 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 7b5a83df805..5bd194d47a9 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 @@ -6,16 +6,14 @@ import java.util.List; public class ItemsValidator implements KeywordValidator { - public final Class items; - - public ItemsValidator(Class items) { - this.items = items; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var items = data.schema().items; + if (items == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 3e085763613..d5a8e540471 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 @@ -61,115 +61,67 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { LinkedHashMap keywordToValidator = new LinkedHashMap<>(); this.type = jsonSchemaInfo.type; if (this.type != null) { - keywordToValidator.put( - "type", - new TypeValidator(this.type) - ); + keywordToValidator.put("type", new TypeValidator()); } this.format = jsonSchemaInfo.format; if (this.format != null) { - keywordToValidator.put( - "format", - new FormatValidator(this.format) - ); + keywordToValidator.put("format", new FormatValidator()); } this.items = jsonSchemaInfo.items; if (this.items != null) { - keywordToValidator.put( - "items", - new ItemsValidator(this.items) - ); + keywordToValidator.put("items", new ItemsValidator()); } this.properties = jsonSchemaInfo.properties; if (this.properties != null) { - keywordToValidator.put( - "properties", - new PropertiesValidator(this.properties) - ); + keywordToValidator.put("properties", new PropertiesValidator()); } this.required = jsonSchemaInfo.required; if (this.required != null) { - keywordToValidator.put( - "required", - new RequiredValidator(this.required) - ); + keywordToValidator.put("required", new RequiredValidator()); } this.exclusiveMaximum = jsonSchemaInfo.exclusiveMaximum; if (this.exclusiveMaximum != null) { - keywordToValidator.put( - "exclusiveMaximum", - new ExclusiveMaximumValidator(this.exclusiveMaximum) - ); + keywordToValidator.put("exclusiveMaximum", new ExclusiveMaximumValidator()); } this.exclusiveMinimum = jsonSchemaInfo.exclusiveMinimum; if (this.exclusiveMinimum != null) { - keywordToValidator.put( - "exclusiveMinimum", - new ExclusiveMinimumValidator(this.exclusiveMinimum) - ); + keywordToValidator.put("exclusiveMinimum", new ExclusiveMinimumValidator()); } this.maxItems = jsonSchemaInfo.maxItems; if (this.maxItems != null) { - keywordToValidator.put( - "maxItems", - new MaxItemsValidator(this.maxItems) - ); + keywordToValidator.put("maxItems", new MaxItemsValidator()); } this.minItems = jsonSchemaInfo.minItems; if (this.minItems != null) { - keywordToValidator.put( - "minItems", - new MinItemsValidator(this.minItems) - ); + keywordToValidator.put("minItems", new MinItemsValidator()); } this.maxLength = jsonSchemaInfo.maxLength; if (this.maxLength != null) { - keywordToValidator.put( - "maxLength", - new MaxLengthValidator(this.maxLength) - ); + keywordToValidator.put("maxLength", new MaxLengthValidator()); } this.minLength = jsonSchemaInfo.minLength; if (this.minLength != null) { - keywordToValidator.put( - "minLength", - new MinLengthValidator(this.minLength) - ); + keywordToValidator.put("minLength", new MinLengthValidator()); } this.maxProperties = jsonSchemaInfo.maxProperties; if (this.maxProperties != null) { - keywordToValidator.put( - "maxProperties", - new MaxPropertiesValidator(this.maxProperties) - ); + keywordToValidator.put("maxProperties", new MaxPropertiesValidator()); } this.minProperties = jsonSchemaInfo.minProperties; if (this.minProperties != null) { - keywordToValidator.put( - "minProperties", - new MinPropertiesValidator(this.minProperties) - ); + keywordToValidator.put("minProperties", new MinPropertiesValidator()); } this.maximum = jsonSchemaInfo.maximum; if (this.maximum != null) { - keywordToValidator.put( - "maximum", - new MaximumValidator(this.maximum) - ); + keywordToValidator.put("maximum", new MaximumValidator()); } this.minimum = jsonSchemaInfo.minimum; if (this.minimum != null) { - keywordToValidator.put( - "minimum", - new MinimumValidator(this.minimum) - ); + keywordToValidator.put("minimum", new MinimumValidator()); } this.multipleOf = jsonSchemaInfo.multipleOf; if (this.multipleOf != null) { - keywordToValidator.put( - "multipleOf", - new MultipleOfValidator(this.multipleOf) - ); + keywordToValidator.put("multipleOf", new MultipleOfValidator()); } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { @@ -185,38 +137,23 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { - keywordToValidator.put( - "oneOf", - new OneOfValidator(this.oneOf) - ); + keywordToValidator.put("oneOf", new OneOfValidator()); } this.not = jsonSchemaInfo.not; if (this.not != null) { - keywordToValidator.put( - "not", - new NotValidator(this.not) - ); + keywordToValidator.put("not", new NotValidator()); } this.uniqueItems = jsonSchemaInfo.uniqueItems; if (this.uniqueItems != null) { - keywordToValidator.put( - "uniqueItems", - new UniqueItemsValidator(this.uniqueItems) - ); + keywordToValidator.put("uniqueItems", new UniqueItemsValidator()); } this.enumValues = jsonSchemaInfo.enumValues; if (this.enumValues != null) { - keywordToValidator.put( - "enum", - new EnumValidator(this.enumValues) - ); + keywordToValidator.put("enum", new EnumValidator()); } this.pattern = jsonSchemaInfo.pattern; if (this.pattern != null) { - keywordToValidator.put( - "pattern", - new PatternValidator(this.pattern) - ); + keywordToValidator.put("pattern", new PatternValidator()); } this.defaultValue = jsonSchemaInfo.defaultValue; this.defaultValueSet = jsonSchemaInfo.defaultValueSet; @@ -231,59 +168,35 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { - keywordToValidator.put( - "maxContains", - new MaxContainsValidator(this.maxContains) - ); + keywordToValidator.put("maxContains", new MaxContainsValidator()); } this.minContains = jsonSchemaInfo.minContains; if (this.minContains != null) { - keywordToValidator.put( - "minContains", - new MinContainsValidator(this.minContains) - ); + keywordToValidator.put("minContains", new MinContainsValidator()); } this.propertyNames = jsonSchemaInfo.propertyNames; if (this.propertyNames != null) { - keywordToValidator.put( - "propertyNames", - new PropertyNamesValidator(this.propertyNames) - ); + keywordToValidator.put("propertyNames", new PropertyNamesValidator()); } this.dependentRequired = jsonSchemaInfo.dependentRequired; if (this.dependentRequired != null) { - keywordToValidator.put( - "dependentRequired", - new DependentRequiredValidator(this.dependentRequired) - ); + keywordToValidator.put("dependentRequired", new DependentRequiredValidator()); } this.dependentSchemas = jsonSchemaInfo.dependentSchemas; if (this.dependentSchemas != null) { - keywordToValidator.put( - "dependentSchemas", - new DependentSchemasValidator(this.dependentSchemas) - ); + keywordToValidator.put("dependentSchemas", new DependentSchemasValidator()); } this.patternProperties = jsonSchemaInfo.patternProperties; if (this.patternProperties != null) { - keywordToValidator.put( - "patternProperties", - new PatternPropertiesValidator(this.patternProperties) - ); + keywordToValidator.put("patternProperties", new PatternPropertiesValidator()); } this.prefixItems = jsonSchemaInfo.prefixItems; if (this.prefixItems != null) { - keywordToValidator.put( - "prefixItems", - new PrefixItemsValidator(this.prefixItems) - ); + keywordToValidator.put("prefixItems", new PrefixItemsValidator()); } this.ifSchema = jsonSchemaInfo.ifSchema; if (this.ifSchema != null) { - keywordToValidator.put( - "if", - new IfValidator(this.ifSchema) - ); + keywordToValidator.put("if", new IfValidator()); } this.keywordToValidator = keywordToValidator; } 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 37363f2f927..9e9b3b92c18 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 @@ -6,16 +6,14 @@ import java.util.List; public class MaxContainsValidator implements KeywordValidator { - public final int maxContains; - - public MaxContainsValidator(int maxContains) { - this.maxContains = maxContains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxContains = data.schema().maxContains; + if (maxContains == null) { + return null; + } if (!(data.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 a3f593b2cce..98ed5cb4ff4 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 @@ -6,16 +6,14 @@ import java.util.List; public class MaxItemsValidator implements KeywordValidator { - public final int maxItems; - - public MaxItemsValidator(int maxItems) { - this.maxItems = maxItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxItems = data.schema().maxItems; + if (maxItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 8d701b41144..08d91666c5d 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class MaxLengthValidator extends LengthValidator implements KeywordValidator { - public final int maxLength; - - public MaxLengthValidator(int maxLength) { - this.maxLength = maxLength; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxLength = data.schema().maxLength; + if (maxLength == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { 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 95689ae6fff..d117f1688e2 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 @@ -6,16 +6,14 @@ import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { - public final int maxProperties; - - public MaxPropertiesValidator(int maxProperties) { - this.maxProperties = maxProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxProperties = data.schema().maxProperties; + if (maxProperties == null) { + return null; + } if (!(data.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/MaximumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MaximumValidator.java index 3ce6051fc5b..5ea3eb68ea3 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class MaximumValidator implements KeywordValidator { - public final Number maximum; - - public MaximumValidator(Number maximum) { - this.maximum = maximum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maximum = data.schema().maximum; + if (maximum == null) { + return null; + } if (!(data.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 7bd04c76ff4..1827e95cc83 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 @@ -6,16 +6,14 @@ import java.util.List; public class MinContainsValidator implements KeywordValidator { - public final int minContains; - - public MinContainsValidator(int minContains) { - this.minContains = minContains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minContains = data.schema().minContains; + if (minContains == null) { + return null; + } if (!(data.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 0c3234c2500..d1933ca7750 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 @@ -6,16 +6,14 @@ import java.util.List; public class MinItemsValidator implements KeywordValidator { - public final int minItems; - - public MinItemsValidator(int minItems) { - this.minItems = minItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minItems = data.schema().minItems; + if (minItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 ec9e946396b..03070acc1dc 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class MinLengthValidator extends LengthValidator implements KeywordValidator { - public final int minLength; - - public MinLengthValidator(int minLength) { - this.minLength = minLength; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minLength = data.schema().minLength; + if (minLength == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { 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 6ffc9536944..c0b99e7fb7d 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 @@ -6,16 +6,14 @@ import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { - public final int minProperties; - - public MinPropertiesValidator(int minProperties) { - this.minProperties = minProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minProperties = data.schema().minProperties; + if (minProperties == null) { + return null; + } if (!(data.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/MinimumValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinimumValidator.java index 61900a2362e..3b539120e42 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class MinimumValidator implements KeywordValidator { - public final Number minimum; - - public MinimumValidator(Number minimum) { - this.minimum = minimum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minimum = data.schema().minimum; + if (minimum == null) { + return null; + } if (!(data.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 b3479e23e5a..611994e3034 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 @@ -6,16 +6,14 @@ import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { - public final BigDecimal multipleOf; - - public MultipleOfValidator(BigDecimal multipleOf) { - this.multipleOf = multipleOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var multipleOf = data.schema().multipleOf; + if (multipleOf == null) { + return null; + } if (!(data.arg() instanceof Number numberArg)) { 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 a510430b655..aa61be1b624 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 @@ -4,16 +4,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; public class NotValidator implements KeywordValidator { - public final Class not; - - public NotValidator(Class not) { - this.not = not; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var not = data.schema().not; + if (not == null) { + return null; + } PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); 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 0cd88e1a7fa..f84f7796a8c 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 @@ -7,16 +7,14 @@ import java.util.List; public class OneOfValidator implements KeywordValidator { - public final List> oneOf; - - public OneOfValidator(List> oneOf) { - this.oneOf = oneOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var oneOf = data.schema().oneOf; + if (oneOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { 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 index 671854446d7..3840d324c2a 100644 --- 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 @@ -3,19 +3,16 @@ import org.checkerframework.checker.nullness.qual.Nullable; 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( ValidationData data ) { + var patternProperties = data.schema().patternProperties; + if (patternProperties == null) { + return null; + } if (!(data.arg() instanceof Map)) { return null; } 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 57d1f5eaecb..68cb15e77e0 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 @@ -3,19 +3,15 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.regex.Pattern; - public class PatternValidator implements KeywordValidator { - public final Pattern pattern; - - public PatternValidator(Pattern pattern) { - this.pattern = pattern; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var pattern = data.schema().pattern; + if (pattern == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { return null; } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java index 2210e30a3c6..00e5b17607b 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java @@ -6,16 +6,14 @@ import java.util.List; public class PrefixItemsValidator implements KeywordValidator { - public final List> prefixItems; - - public PrefixItemsValidator(List> prefixItems) { - this.prefixItems = prefixItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var prefixItems = data.schema().prefixItems; + if (prefixItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 1d60593961d..87a7e2227dc 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 @@ -9,16 +9,14 @@ import java.util.Set; public class PropertiesValidator implements KeywordValidator { - public final Map> properties; - - public PropertiesValidator(Map> properties) { - this.properties = properties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var properties = data.schema().properties; + if (properties == null) { + return null; + } if (!(data.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 b7cc3fcf27e..55ea80b0382 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 @@ -7,16 +7,14 @@ import java.util.Map; public class PropertyNamesValidator implements KeywordValidator { - public final Class propertyNames; - - public PropertyNamesValidator(Class propertyNames) { - this.propertyNames = propertyNames; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var propertyNames = data.schema().propertyNames; + if (propertyNames == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { return null; } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/RequiredValidator.java index 9212dbd3de4..f2e1a8ecde8 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 @@ -9,16 +9,14 @@ import java.util.Set; public class RequiredValidator implements KeywordValidator { - public final Set required; - - public RequiredValidator(Set required) { - this.required = required; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var required = data.schema().required; + if (required == null) { + return null; + } if (!(data.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/TypeValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java index ee530cce481..bb4133a770e 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 @@ -5,19 +5,16 @@ import java.util.List; import java.util.Map; -import java.util.Set; public class TypeValidator implements KeywordValidator { - public final Set> type; - - public TypeValidator(Set> type) { - this.type = type; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var type = data.schema().type; + if (type == null) { + return null; + } Class argClass; var arg = data.arg(); 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 91f8efc5851..a42a7d60b60 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 @@ -8,16 +8,14 @@ import java.util.Set; public class UniqueItemsValidator implements KeywordValidator { - public final boolean uniqueItems; - - public UniqueItemsValidator(boolean uniqueItems) { - this.uniqueItems = uniqueItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var uniqueItems = data.schema().uniqueItems; + if (uniqueItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { return null; } 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 c36766792f4..f662d087755 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 @@ -5,7 +5,7 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.ListJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.StringJsonSchema; import org.openapijsonschematools.client.exceptions.ValidationException; @@ -13,6 +13,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class ItemsValidatorTest { @SuppressWarnings("nullness") @@ -20,6 +21,31 @@ private void assertNull(@Nullable Object object) { Assert.assertNull(object); } + public static class ArrayWithItemsSchema extends JsonSchema { + public ArrayWithItemsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(List.class)) + .items(StringJsonSchema.class) + ); + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + 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"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + 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"); + } + } + @Test public void testCorrectItemsSucceeds() { List pathToItem = List.of("args[0]"); @@ -32,15 +58,12 @@ public void testCorrectItemsSucceeds() { List mutableList = new ArrayList<>(); mutableList.add("a"); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -66,15 +89,12 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -92,15 +112,12 @@ public void testIncorrectItemFails() { List mutableList = new ArrayList<>(); mutableList.add(1); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } 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 e88a04afd32..c304af27833 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 @@ -8,12 +8,6 @@ import java.util.Map; import java.util.Set; public class DependentRequiredValidator implements KeywordValidator { - public final Map> dependentRequired; - - public DependentRequiredValidator(Map> dependentRequired) { - this.dependentRequired = dependentRequired; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -21,6 +15,10 @@ public class DependentRequiredValidator implements KeywordValidator { if (!(data.arg() instanceof Map mapArg)) { return null; } + var dependentRequired = data.schema().dependentRequired; + if (dependentRequired == null) { + return null; + } for (Map.Entry> entry: dependentRequired.entrySet()) { if (!mapArg.containsKey(entry.getKey())) { continue; 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 f57acf3873c..79715b86929 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 @@ -7,12 +7,6 @@ import java.util.Map; import java.util.Set; public class DependentSchemasValidator implements KeywordValidator { - public final Map> dependentSchemas; - - public DependentSchemasValidator(Map> dependentSchemas) { - this.dependentSchemas = dependentSchemas; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data @@ -20,6 +14,10 @@ public class DependentSchemasValidator implements KeywordValidator { if (!(data.arg() instanceof Map mapArg)) { return null; } + var dependentSchemas = data.schema().dependentSchemas; + if (dependentSchemas == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); Set presentProperties = new LinkedHashSet<>(); for (Object key: mapArg.keySet()) { 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 6889e660e60..f3cc251e9c7 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 @@ -7,14 +7,8 @@ import java.math.BigDecimal; import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { - public final Set<@Nullable Object> enumValues; - - public EnumValidator(Set<@Nullable Object> enumValues) { - this.enumValues = enumValues; - } - @SuppressWarnings("nullness") - private boolean enumContainsArg(@Nullable Object arg){ + private static boolean enumContainsArg(Set<@Nullable Object> enumValues, @Nullable Object arg){ return enumValues.contains(arg); } @@ -22,12 +16,16 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat public @Nullable PathToSchemasMap validate( ValidationData data ) { + var enumValues = data.schema().enumValues; + if (enumValues == null) { + return null; + } if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); - if (enumContainsArg(castArg)) { + if (enumContainsArg(enumValues, castArg)) { return null; } for (Object enumValue: enumValues) { @@ -36,7 +34,7 @@ public class EnumValidator extends BigDecimalValidator implements KeywordValidat } } } else { - if (enumContainsArg(data.arg())) { + if (enumContainsArg(enumValues, data.arg())) { return null; } } 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 033abf6fd45..56b8965aedc 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class ExclusiveMaximumValidator implements KeywordValidator { - public final Number exclusiveMaximum; - - public ExclusiveMaximumValidator(Number exclusiveMaximum) { - this.exclusiveMaximum = exclusiveMaximum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var exclusiveMaximum = data.schema().exclusiveMaximum; + if (exclusiveMaximum == null) { + return null; + } if (!(data.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 4e4e096760a..aad41595215 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class ExclusiveMinimumValidator implements KeywordValidator { - public final Number exclusiveMinimum; - - public ExclusiveMinimumValidator(Number exclusiveMinimum) { - this.exclusiveMinimum = exclusiveMinimum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var exclusiveMinimum = data.schema().exclusiveMinimum; + if (exclusiveMinimum == null) { + return null; + } if (!(data.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 f5a7062396c..859da3127df 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 @@ -9,12 +9,6 @@ import java.time.format.DateTimeParseException; import java.util.UUID; public class FormatValidator implements KeywordValidator { - public final String format; - - public FormatValidator(String format) { - this.format = format; - } - private final static BigInteger int32InclusiveMinimum = BigInteger.valueOf(-2147483648L); private final static BigInteger int32InclusiveMaximum = BigInteger.valueOf(2147483647L); private final static BigInteger int64InclusiveMinimum = BigInteger.valueOf(-9223372036854775808L); @@ -24,7 +18,7 @@ public class FormatValidator implements KeywordValidator { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private static void validateNumericFormat(Number arg, ValidationMetadata validationMetadata, String format) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; @@ -91,7 +85,7 @@ public class FormatValidator implements KeywordValidator { } } - private void validateStringFormat(String arg, ValidationMetadata validationMetadata) { + private static void validateStringFormat(String arg, ValidationMetadata validationMetadata, String format) { switch (format) { case "uuid" -> { try { @@ -140,16 +134,22 @@ public class FormatValidator implements KeywordValidator { public @Nullable PathToSchemasMap validate( ValidationData data ) { + var format = data.schema().format; + if (format == null) { + return null; + } if (data.arg() instanceof Number numberArg) { validateNumericFormat( numberArg, - data.validationMetadata() + data.validationMetadata(), + format ); return null; } else if (data.arg() instanceof String stringArg) { validateStringFormat( stringArg, - data.validationMetadata() + data.validationMetadata(), + format ); return null; } diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs index 4671be053a3..f96f1770d7d 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/IfValidator.hbs @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class IfValidator implements KeywordValidator { - public final Class ifSchema; - - public IfValidator(Class ifSchema) { - this.ifSchema = ifSchema; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var ifSchema = data.schema().ifSchema; + if (ifSchema == null) { + return null; + } if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } 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 de02d6cfe03..fe4ca51f048 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 @@ -6,16 +6,14 @@ import java.util.ArrayList; import java.util.List; public class ItemsValidator implements KeywordValidator { - public final Class items; - - public ItemsValidator(Class items) { - this.items = items; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var items = data.schema().items; + if (items == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 2c748e47841..2cc030eb958 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 @@ -61,115 +61,67 @@ public abstract class JsonSchema { LinkedHashMap keywordToValidator = new LinkedHashMap<>(); this.type = jsonSchemaInfo.type; if (this.type != null) { - keywordToValidator.put( - "type", - new TypeValidator(this.type) - ); + keywordToValidator.put("type", new TypeValidator()); } this.format = jsonSchemaInfo.format; if (this.format != null) { - keywordToValidator.put( - "format", - new FormatValidator(this.format) - ); + keywordToValidator.put("format", new FormatValidator()); } this.items = jsonSchemaInfo.items; if (this.items != null) { - keywordToValidator.put( - "items", - new ItemsValidator(this.items) - ); + keywordToValidator.put("items", new ItemsValidator()); } this.properties = jsonSchemaInfo.properties; if (this.properties != null) { - keywordToValidator.put( - "properties", - new PropertiesValidator(this.properties) - ); + keywordToValidator.put("properties", new PropertiesValidator()); } this.required = jsonSchemaInfo.required; if (this.required != null) { - keywordToValidator.put( - "required", - new RequiredValidator(this.required) - ); + keywordToValidator.put("required", new RequiredValidator()); } this.exclusiveMaximum = jsonSchemaInfo.exclusiveMaximum; if (this.exclusiveMaximum != null) { - keywordToValidator.put( - "exclusiveMaximum", - new ExclusiveMaximumValidator(this.exclusiveMaximum) - ); + keywordToValidator.put("exclusiveMaximum", new ExclusiveMaximumValidator()); } this.exclusiveMinimum = jsonSchemaInfo.exclusiveMinimum; if (this.exclusiveMinimum != null) { - keywordToValidator.put( - "exclusiveMinimum", - new ExclusiveMinimumValidator(this.exclusiveMinimum) - ); + keywordToValidator.put("exclusiveMinimum", new ExclusiveMinimumValidator()); } this.maxItems = jsonSchemaInfo.maxItems; if (this.maxItems != null) { - keywordToValidator.put( - "maxItems", - new MaxItemsValidator(this.maxItems) - ); + keywordToValidator.put("maxItems", new MaxItemsValidator()); } this.minItems = jsonSchemaInfo.minItems; if (this.minItems != null) { - keywordToValidator.put( - "minItems", - new MinItemsValidator(this.minItems) - ); + keywordToValidator.put("minItems", new MinItemsValidator()); } this.maxLength = jsonSchemaInfo.maxLength; if (this.maxLength != null) { - keywordToValidator.put( - "maxLength", - new MaxLengthValidator(this.maxLength) - ); + keywordToValidator.put("maxLength", new MaxLengthValidator()); } this.minLength = jsonSchemaInfo.minLength; if (this.minLength != null) { - keywordToValidator.put( - "minLength", - new MinLengthValidator(this.minLength) - ); + keywordToValidator.put("minLength", new MinLengthValidator()); } this.maxProperties = jsonSchemaInfo.maxProperties; if (this.maxProperties != null) { - keywordToValidator.put( - "maxProperties", - new MaxPropertiesValidator(this.maxProperties) - ); + keywordToValidator.put("maxProperties", new MaxPropertiesValidator()); } this.minProperties = jsonSchemaInfo.minProperties; if (this.minProperties != null) { - keywordToValidator.put( - "minProperties", - new MinPropertiesValidator(this.minProperties) - ); + keywordToValidator.put("minProperties", new MinPropertiesValidator()); } this.maximum = jsonSchemaInfo.maximum; if (this.maximum != null) { - keywordToValidator.put( - "maximum", - new MaximumValidator(this.maximum) - ); + keywordToValidator.put("maximum", new MaximumValidator()); } this.minimum = jsonSchemaInfo.minimum; if (this.minimum != null) { - keywordToValidator.put( - "minimum", - new MinimumValidator(this.minimum) - ); + keywordToValidator.put("minimum", new MinimumValidator()); } this.multipleOf = jsonSchemaInfo.multipleOf; if (this.multipleOf != null) { - keywordToValidator.put( - "multipleOf", - new MultipleOfValidator(this.multipleOf) - ); + keywordToValidator.put("multipleOf", new MultipleOfValidator()); } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { @@ -185,38 +137,23 @@ public abstract class JsonSchema { } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { - keywordToValidator.put( - "oneOf", - new OneOfValidator(this.oneOf) - ); + keywordToValidator.put("oneOf", new OneOfValidator()); } this.not = jsonSchemaInfo.not; if (this.not != null) { - keywordToValidator.put( - "not", - new NotValidator(this.not) - ); + keywordToValidator.put("not", new NotValidator()); } this.uniqueItems = jsonSchemaInfo.uniqueItems; if (this.uniqueItems != null) { - keywordToValidator.put( - "uniqueItems", - new UniqueItemsValidator(this.uniqueItems) - ); + keywordToValidator.put("uniqueItems", new UniqueItemsValidator()); } this.enumValues = jsonSchemaInfo.enumValues; if (this.enumValues != null) { - keywordToValidator.put( - "enum", - new EnumValidator(this.enumValues) - ); + keywordToValidator.put("enum", new EnumValidator()); } this.pattern = jsonSchemaInfo.pattern; if (this.pattern != null) { - keywordToValidator.put( - "pattern", - new PatternValidator(this.pattern) - ); + keywordToValidator.put("pattern", new PatternValidator()); } this.defaultValue = jsonSchemaInfo.defaultValue; this.defaultValueSet = jsonSchemaInfo.defaultValueSet; @@ -231,59 +168,35 @@ public abstract class JsonSchema { } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { - keywordToValidator.put( - "maxContains", - new MaxContainsValidator(this.maxContains) - ); + keywordToValidator.put("maxContains", new MaxContainsValidator()); } this.minContains = jsonSchemaInfo.minContains; if (this.minContains != null) { - keywordToValidator.put( - "minContains", - new MinContainsValidator(this.minContains) - ); + keywordToValidator.put("minContains", new MinContainsValidator()); } this.propertyNames = jsonSchemaInfo.propertyNames; if (this.propertyNames != null) { - keywordToValidator.put( - "propertyNames", - new PropertyNamesValidator(this.propertyNames) - ); + keywordToValidator.put("propertyNames", new PropertyNamesValidator()); } this.dependentRequired = jsonSchemaInfo.dependentRequired; if (this.dependentRequired != null) { - keywordToValidator.put( - "dependentRequired", - new DependentRequiredValidator(this.dependentRequired) - ); + keywordToValidator.put("dependentRequired", new DependentRequiredValidator()); } this.dependentSchemas = jsonSchemaInfo.dependentSchemas; if (this.dependentSchemas != null) { - keywordToValidator.put( - "dependentSchemas", - new DependentSchemasValidator(this.dependentSchemas) - ); + keywordToValidator.put("dependentSchemas", new DependentSchemasValidator()); } this.patternProperties = jsonSchemaInfo.patternProperties; if (this.patternProperties != null) { - keywordToValidator.put( - "patternProperties", - new PatternPropertiesValidator(this.patternProperties) - ); + keywordToValidator.put("patternProperties", new PatternPropertiesValidator()); } this.prefixItems = jsonSchemaInfo.prefixItems; if (this.prefixItems != null) { - keywordToValidator.put( - "prefixItems", - new PrefixItemsValidator(this.prefixItems) - ); + keywordToValidator.put("prefixItems", new PrefixItemsValidator()); } this.ifSchema = jsonSchemaInfo.ifSchema; if (this.ifSchema != null) { - keywordToValidator.put( - "if", - new IfValidator(this.ifSchema) - ); + keywordToValidator.put("if", new IfValidator()); } this.keywordToValidator = keywordToValidator; } 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 4363c7d6d0e..f2ba459cec9 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 @@ -6,16 +6,14 @@ import {{{packageName}}}.exceptions.ValidationException; import java.util.List; public class MaxContainsValidator implements KeywordValidator { - public final int maxContains; - - public MaxContainsValidator(int maxContains) { - this.maxContains = maxContains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxContains = data.schema().maxContains; + if (maxContains == null) { + return null; + } if (!(data.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 373cec4d8d3..f557904e3c4 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 @@ -6,16 +6,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; public class MaxItemsValidator implements KeywordValidator { - public final int maxItems; - - public MaxItemsValidator(int maxItems) { - this.maxItems = maxItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxItems = data.schema().maxItems; + if (maxItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 0cb83eb7e25..ab2fb133e14 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class MaxLengthValidator extends LengthValidator implements KeywordValidator { - public final int maxLength; - - public MaxLengthValidator(int maxLength) { - this.maxLength = maxLength; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxLength = data.schema().maxLength; + if (maxLength == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { 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 e84572cc0d3..79087edd170 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 @@ -6,16 +6,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { - public final int maxProperties; - - public MaxPropertiesValidator(int maxProperties) { - this.maxProperties = maxProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maxProperties = data.schema().maxProperties; + if (maxProperties == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { 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 8d7745df053..809692b04c3 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class MaximumValidator implements KeywordValidator { - public final Number maximum; - - public MaximumValidator(Number maximum) { - this.maximum = maximum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var maximum = data.schema().maximum; + if (maximum == null) { + return null; + } if (!(data.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 0f662efa9b6..7ab9c6d7c82 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 @@ -6,16 +6,14 @@ import {{{packageName}}}.exceptions.ValidationException; import java.util.List; public class MinContainsValidator implements KeywordValidator { - public final int minContains; - - public MinContainsValidator(int minContains) { - this.minContains = minContains; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minContains = data.schema().minContains; + if (minContains == null) { + return null; + } if (!(data.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 0ebe7ed649b..d65ca58eb65 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 @@ -6,16 +6,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; public class MinItemsValidator implements KeywordValidator { - public final int minItems; - - public MinItemsValidator(int minItems) { - this.minItems = minItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minItems = data.schema().minItems; + if (minItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 b1604b29fa8..24badcaa03c 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class MinLengthValidator extends LengthValidator implements KeywordValidator { - public final int minLength; - - public MinLengthValidator(int minLength) { - this.minLength = minLength; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minLength = data.schema().minLength; + if (minLength == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { 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 6a2c391d553..30d0790416a 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 @@ -6,16 +6,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { - public final int minProperties; - - public MinPropertiesValidator(int minProperties) { - this.minProperties = minProperties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minProperties = data.schema().minProperties; + if (minProperties == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { 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 3c4e715e5c1..b096b0de71f 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class MinimumValidator implements KeywordValidator { - public final Number minimum; - - public MinimumValidator(Number minimum) { - this.minimum = minimum; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var minimum = data.schema().minimum; + if (minimum == null) { + return null; + } if (!(data.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 6858250347b..3151dfda95b 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 @@ -6,16 +6,14 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { - public final BigDecimal multipleOf; - - public MultipleOfValidator(BigDecimal multipleOf) { - this.multipleOf = multipleOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var multipleOf = data.schema().multipleOf; + if (multipleOf == null) { + return null; + } if (!(data.arg() instanceof Number numberArg)) { 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 74caa05b1cc..665d13f253f 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 @@ -4,16 +4,14 @@ import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; public class NotValidator implements KeywordValidator { - public final Class not; - - public NotValidator(Class not) { - this.not = not; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var not = data.schema().not; + if (not == null) { + return null; + } PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); @@ -30,4 +28,3 @@ public class NotValidator implements KeywordValidator { return null; } } - 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 02d0f42837f..2ce2f630251 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 @@ -7,16 +7,14 @@ import java.util.ArrayList; import java.util.List; public class OneOfValidator implements KeywordValidator { - public final List> oneOf; - - public OneOfValidator(List> oneOf) { - this.oneOf = oneOf; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var oneOf = data.schema().oneOf; + if (oneOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { 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 index d54586468eb..a3d8ffa424c 100644 --- 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 @@ -3,19 +3,16 @@ package {{{packageName}}}.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; 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( ValidationData data ) { + var patternProperties = data.schema().patternProperties; + if (patternProperties == null) { + return null; + } if (!(data.arg() instanceof Map)) { return null; } 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 ce9e1f12d5f..e020d585618 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 @@ -3,19 +3,15 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.regex.Pattern; - public class PatternValidator implements KeywordValidator { - public final Pattern pattern; - - public PatternValidator(Pattern pattern) { - this.pattern = pattern; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var pattern = data.schema().pattern; + if (pattern == null) { + return null; + } if (!(data.arg() instanceof String stringArg)) { return null; } @@ -24,4 +20,4 @@ public class PatternValidator implements KeywordValidator { } return null; } -} +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs index 1b93003d4c9..a13b4211a6e 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/PrefixItemsValidator.hbs @@ -6,16 +6,14 @@ import java.util.ArrayList; import java.util.List; public class PrefixItemsValidator implements KeywordValidator { - public final List> prefixItems; - - public PrefixItemsValidator(List> prefixItems) { - this.prefixItems = prefixItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var prefixItems = data.schema().prefixItems; + if (prefixItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { 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 a6dafcc609e..d2dc11f8ec1 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 @@ -9,16 +9,14 @@ import java.util.Map; import java.util.Set; public class PropertiesValidator implements KeywordValidator { - public final Map> properties; - - public PropertiesValidator(Map> properties) { - this.properties = properties; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var properties = data.schema().properties; + if (properties == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { return null; } @@ -55,4 +53,3 @@ public class PropertiesValidator implements KeywordValidator { return pathToSchemas; } } - 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 3511fcbaea1..4777695d0f6 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 @@ -7,16 +7,14 @@ import java.util.List; import java.util.Map; public class PropertyNamesValidator implements KeywordValidator { - public final Class propertyNames; - - public PropertyNamesValidator(Class propertyNames) { - this.propertyNames = propertyNames; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var propertyNames = data.schema().propertyNames; + if (propertyNames == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { return null; } diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/RequiredValidator.hbs index 60c7db38172..eb6854827f9 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 @@ -9,16 +9,14 @@ import java.util.Map; import java.util.Set; public class RequiredValidator implements KeywordValidator { - public final Set required; - - public RequiredValidator(Set required) { - this.required = required; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var required = data.schema().required; + if (required == null) { + return null; + } if (!(data.arg() instanceof Map mapArg)) { 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 a35ae28ff9f..0fab57d0561 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 @@ -5,19 +5,16 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; import java.util.Map; -import java.util.Set; public class TypeValidator implements KeywordValidator { - public final Set> type; - - public TypeValidator(Set> type) { - this.type = type; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var type = data.schema().type; + if (type == null) { + return null; + } Class argClass; var arg = data.arg(); 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 21f5575ca2f..fca9e17c2e5 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 @@ -8,16 +8,14 @@ import java.util.List; import java.util.Set; public class UniqueItemsValidator implements KeywordValidator { - public final boolean uniqueItems; - - public UniqueItemsValidator(boolean uniqueItems) { - this.uniqueItems = uniqueItems; - } - @Override public @Nullable PathToSchemasMap validate( ValidationData data ) { + var uniqueItems = data.schema().uniqueItems; + if (uniqueItems == null) { + return null; + } if (!(data.arg() instanceof List listArg)) { return null; } 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 4cb6b5c225a..a1f9b5b73e9 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 @@ -5,7 +5,6 @@ import org.junit.Assert; import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; -import {{{packageName}}}.schemas.ListJsonSchema; import {{{packageName}}}.schemas.StringJsonSchema; import {{{packageName}}}.exceptions.ValidationException; @@ -13,6 +12,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class ItemsValidatorTest { @SuppressWarnings("nullness") @@ -20,6 +20,31 @@ public class ItemsValidatorTest { Assert.assertNull(object); } + public static class ArrayWithItemsSchema extends JsonSchema { + public ArrayWithItemsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(List.class)) + .items(StringJsonSchema.class) + ); + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + 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"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + 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"); + } + } + @Test public void testCorrectItemsSucceeds() { List pathToItem = List.of("args[0]"); @@ -32,15 +57,12 @@ public class ItemsValidatorTest { List mutableList = new ArrayList<>(); mutableList.add("a"); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -66,15 +88,12 @@ public class ItemsValidatorTest { new PathToSchemasMap(), new LinkedHashSet<>() ); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -92,16 +111,13 @@ public class ItemsValidatorTest { List mutableList = new ArrayList<>(); mutableList.add(1); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - ListJsonSchema.getInstance(), + new ArrayWithItemsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } -} +} \ No newline at end of file From db846068aba6b73e088d5a51e044040b0bc12daf Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 19:26:43 -0800 Subject: [PATCH 16/21] Updates RequiredValidatorTest --- .../validation/RequiredValidatorTest.java | 66 +++++++++++-------- .../validation/RequiredValidatorTest.hbs | 65 ++++++++++-------- 2 files changed, 73 insertions(+), 58 deletions(-) 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 31824b61755..d2264b9a967 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 @@ -5,16 +5,42 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.MapJsonSchema; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class RequiredValidatorTest { + public static class ObjectWithRequiredSchema extends JsonSchema { + private ObjectWithRequiredSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .required(Set.of("someString")) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -22,9 +48,6 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -35,15 +58,12 @@ public void testCorrectPropertySucceeds() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -51,9 +71,6 @@ public void testCorrectPropertySucceeds() { @Test public void testNotApplicableTypeReturnsNull() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -61,15 +78,12 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -77,9 +91,6 @@ public void testNotApplicableTypeReturnsNull() { @Test public void testIncorrectPropertyFails() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -90,15 +101,12 @@ public void testIncorrectPropertyFails() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("aDifferentProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } 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 b4fe364a174..cfe39403b02 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 @@ -6,15 +6,40 @@ import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.exceptions.ValidationException; -import {{{packageName}}}.schemas.MapJsonSchema; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class RequiredValidatorTest { + public static class ObjectWithRequiredSchema extends JsonSchema { + private ObjectWithRequiredSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .required(Set.of("someString")) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -22,9 +47,6 @@ public class RequiredValidatorTest { @Test public void testCorrectPropertySucceeds() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -35,15 +57,12 @@ public class RequiredValidatorTest { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -51,9 +70,6 @@ public class RequiredValidatorTest { @Test public void testNotApplicableTypeReturnsNull() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -61,15 +77,12 @@ public class RequiredValidatorTest { new PathToSchemasMap(), new LinkedHashSet<>() ); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -77,9 +90,6 @@ public class RequiredValidatorTest { @Test public void testIncorrectPropertyFails() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -90,15 +100,12 @@ public class RequiredValidatorTest { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("aDifferentProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithRequiredSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } From 3f4f8065ca15da391b7a2ef4f265d0bdb3d88de9 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 19:28:56 -0800 Subject: [PATCH 17/21] Updates TypeValidatorTest --- .../schemas/validation/TypeValidatorTest.java | 18 ++++-------------- .../schemas/validation/TypeValidatorTest.hbs | 18 ++++-------------- 2 files changed, 8 insertions(+), 28 deletions(-) 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 9b4d61cc5dc..78a48b6374f 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 @@ -19,9 +19,7 @@ private void assertNull(@Nullable Object object) { @Test public void testValidateSucceeds() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -32,10 +30,7 @@ public void testValidateSucceeds() { new ValidationData( StringJsonSchema.getInstance(), "hi", - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemasMap); @@ -43,9 +38,7 @@ public void testValidateSucceeds() { @Test public void testValidateFailsIntIsNotString() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -56,10 +49,7 @@ public void testValidateFailsIntIsNotString() { new ValidationData( StringJsonSchema.getInstance(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) )); } 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 c1336ec8c6b..5cb5fcde8f7 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 @@ -19,9 +19,7 @@ public class TypeValidatorTest { @Test public void testValidateSucceeds() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -32,10 +30,7 @@ public class TypeValidatorTest { new ValidationData( StringJsonSchema.getInstance(), "hi", - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemasMap); @@ -43,9 +38,7 @@ public class TypeValidatorTest { @Test public void testValidateFailsIntIsNotString() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -56,10 +49,7 @@ public class TypeValidatorTest { new ValidationData( StringJsonSchema.getInstance(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) )); } From aeb30441a8844251df9b977123ac83bfcf15001f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 19:34:04 -0800 Subject: [PATCH 18/21] Updates PropertiesValidatorTest --- .../validation/PropertiesValidatorTest.java | 67 +++++++++++-------- .../validation/PropertiesValidatorTest.hbs | 67 +++++++++++-------- 2 files changed, 78 insertions(+), 56 deletions(-) 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 ef29a09fc0b..9431d06708f 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 @@ -5,7 +5,7 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.MapJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.StringJsonSchema; import org.openapijsonschematools.client.exceptions.ValidationException; @@ -14,8 +14,37 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class PropertiesValidatorTest { + public static class ObjectWithPropsSchema extends JsonSchema { + private ObjectWithPropsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someString", StringJsonSchema.class) + )) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -23,10 +52,7 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -39,12 +65,9 @@ public void testCorrectPropertySucceeds() { FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -62,10 +85,7 @@ public void testCorrectPropertySucceeds() { @Test public void testNotApplicableTypeReturnsNull() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -75,12 +95,9 @@ public void testNotApplicableTypeReturnsNull() { ); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -88,10 +105,7 @@ public void testNotApplicableTypeReturnsNull() { @Test public void testIncorrectPropertyValueFails() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -104,12 +118,9 @@ public void testIncorrectPropertyValueFails() { FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } 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 9491a1f70bd..96bb3482923 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 @@ -5,7 +5,7 @@ import org.junit.Assert; import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; -import {{{packageName}}}.schemas.MapJsonSchema; +import {{{packageName}}}.exceptions.InvalidTypeException; import {{{packageName}}}.schemas.StringJsonSchema; import {{{packageName}}}.exceptions.ValidationException; @@ -14,8 +14,37 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class PropertiesValidatorTest { + public static class ObjectWithPropsSchema extends JsonSchema { + private ObjectWithPropsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someString", StringJsonSchema.class) + )) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -23,10 +52,7 @@ public class PropertiesValidatorTest { @Test public void testCorrectPropertySucceeds() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -39,12 +65,9 @@ public class PropertiesValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) ); if (pathToSchemas == null) { @@ -62,10 +85,7 @@ public class PropertiesValidatorTest { @Test public void testNotApplicableTypeReturnsNull() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -75,12 +95,9 @@ public class PropertiesValidatorTest { ); PathToSchemasMap pathToSchemas = validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), 1, - validationMetadata, - null, - null, - null + validationMetadata ) ); assertNull(pathToSchemas); @@ -88,10 +105,7 @@ public class PropertiesValidatorTest { @Test public void testIncorrectPropertyValueFails() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -104,12 +118,9 @@ public class PropertiesValidatorTest { FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - MapJsonSchema.getInstance(), + new ObjectWithPropsSchema(), arg, - validationMetadata, - null, - null, - null + validationMetadata ) )); } From 6f0a209b3d86e859cef088ea1d936f58f18fbe9c Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 20:12:34 -0800 Subject: [PATCH 19/21] Adds final modifers to schema data --- .../java/.openapi-generator/FILES | 1 + .../schemas/validation/ConstValidator.java | 6 +- .../validation/DependentSchemasValidator.java | 1 - .../client/schemas/validation/JsonSchema.java | 6 +- .../schemas/validation/MaximumValidator.java | 2 +- .../validation/MinLengthValidator.java | 2 +- .../validation/MultipleOfValidator.java | 2 +- .../PatternPropertiesValidator.java | 1 - .../schemas/validation/PatternValidator.java | 2 +- .../validation/PropertiesValidator.java | 1 - .../schemas/validation/ValidationData.java | 4 +- .../validation/FormatValidatorTest.java | 114 +++++++++--------- .../validation/ItemsValidatorTest.java | 12 +- .../schemas/validation/ConstValidator.hbs | 4 +- .../schemas/validation/JsonSchema.hbs | 6 +- .../schemas/validation/ValidationData.hbs | 2 + .../validation/FormatValidatorTest.hbs | 114 +++++++++--------- .../schemas/validation/ItemsValidatorTest.hbs | 9 +- .../validation/RequiredValidatorTest.hbs | 1 + 19 files changed, 152 insertions(+), 138 deletions(-) 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 bf90fe85e5e..55e58d75011 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 @@ -359,6 +359,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMe src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java +src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java src/main/java/org/openapijsonschematools/client/servers/Server0.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java 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 cb9bd79f1a8..6409a23e5ca 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 @@ -11,10 +11,10 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida public @Nullable PathToSchemasMap validate( ValidationData data ) { - var constValue = data.schema().constValue; - if (constValue == null) { + if (!data.schema().constValueSet) { return null; } + var constValue = data.schema().constValue; if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { @@ -30,4 +30,4 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida } throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue); } -} +} \ 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/DependentSchemasValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentSchemasValidator.java index 3470e4a3cae..940157d3b48 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 @@ -38,4 +38,3 @@ public class DependentSchemasValidator implements KeywordValidator { return pathToSchemas; } } - 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 d5a8e540471..db33a080218 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 @@ -50,10 +50,10 @@ public abstract class JsonSchema { public final @Nullable Integer maxContains; public final @Nullable Integer minContains; public final @Nullable Class propertyNames; - public @Nullable Map> dependentRequired; + public final @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; - public @Nullable Map> patternProperties; - public @Nullable List> prefixItems; + public final @Nullable Map> patternProperties; + public final @Nullable List> prefixItems; public final @Nullable Class ifSchema; private final LinkedHashMap keywordToValidator; 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 5ea3eb68ea3..702f09686dc 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 @@ -42,4 +42,4 @@ public class MaximumValidator implements KeywordValidator { } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinLengthValidator.java index 03070acc1dc..1defdc891e3 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 @@ -21,4 +21,4 @@ public class MinLengthValidator extends LengthValidator implements KeywordValida } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MultipleOfValidator.java index 611994e3034..eebc07a0f10 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 @@ -24,4 +24,4 @@ public class MultipleOfValidator extends BigDecimalValidator implements KeywordV } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java index 3840d324c2a..9e951e23ed2 100644 --- 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 @@ -19,4 +19,3 @@ public class PatternPropertiesValidator implements KeywordValidator { return data.patternPropertiesPathToSchemas(); } } - 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 68cb15e77e0..eceeb19e311 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 @@ -20,4 +20,4 @@ public class PatternValidator implements KeywordValidator { } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java index 87a7e2227dc..17bccdd666a 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 @@ -53,4 +53,3 @@ public class PropertiesValidator implements KeywordValidator { return pathToSchemas; } } - diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java index 84f8350ebec..55cb65fe9ef 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java @@ -10,8 +10,8 @@ public record ValidationData( ValidationMetadata validationMetadata, @Nullable List containsPathToSchemas, @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas) { - + @Nullable PathToSchemasMap ifPathToSchemas +) { public ValidationData( JsonSchema schema, @Nullable Object arg, 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 8e59bfdb380..db31df87dd9 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 @@ -6,8 +6,14 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.NumberJsonSchema; -import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.Int32JsonSchema; +import org.openapijsonschematools.client.schemas.Int64JsonSchema; +import org.openapijsonschematools.client.schemas.FloatJsonSchema; +import org.openapijsonschematools.client.schemas.DoubleJsonSchema; +import org.openapijsonschematools.client.schemas.DecimalJsonSchema; +import org.openapijsonschematools.client.schemas.DateJsonSchema; +import org.openapijsonschematools.client.schemas.DateTimeJsonSchema; import java.math.BigDecimal; import java.math.BigInteger; @@ -29,10 +35,10 @@ private void assertNull(@Nullable Object object) { @Test public void testIntFormatSucceedsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 1.0f, validationMetadata ) @@ -42,10 +48,10 @@ public void testIntFormatSucceedsWithFloat() { @Test public void testIntFormatFailsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 3.14f, validationMetadata ) @@ -54,10 +60,10 @@ public void testIntFormatFailsWithFloat() { @Test public void testIntFormatSucceedsWithInt() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 1, validationMetadata ) @@ -67,10 +73,10 @@ public void testIntFormatSucceedsWithInt() { @Test public void testInt32UnderMinFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), -2147483649L, validationMetadata ) @@ -79,10 +85,10 @@ public void testInt32UnderMinFails() { @Test public void testInt32InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), -2147483648, validationMetadata ) @@ -92,10 +98,10 @@ public void testInt32InclusiveMinSucceeds() { @Test public void testInt32InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), 2147483647, validationMetadata ) @@ -105,10 +111,10 @@ public void testInt32InclusiveMaxSucceeds() { @Test public void testInt32OverMaxFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), 2147483648L, validationMetadata ) @@ -117,11 +123,11 @@ public void testInt32OverMaxFails() { @Test public void testInt64UnderMinFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata ) @@ -130,10 +136,10 @@ public void testInt64UnderMinFails() { @Test public void testInt64InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), -9223372036854775808L, validationMetadata ) @@ -143,10 +149,10 @@ public void testInt64InclusiveMinSucceeds() { @Test public void testInt64InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), 9223372036854775807L, validationMetadata ) @@ -156,11 +162,11 @@ public void testInt64InclusiveMaxSucceeds() { @Test public void testInt64OverMaxFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata ) @@ -169,10 +175,10 @@ public void testInt64OverMaxFails() { @Test public void testFloatUnderMinFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata ) @@ -181,10 +187,10 @@ public void testFloatUnderMinFails() { @Test public void testFloatInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata ) @@ -194,10 +200,10 @@ public void testFloatInclusiveMinSucceeds() { @Test public void testFloatInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata ) @@ -207,10 +213,10 @@ public void testFloatInclusiveMaxSucceeds() { @Test public void testFloatOverMaxFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata ) @@ -219,10 +225,10 @@ public void testFloatOverMaxFails() { @Test public void testDoubleUnderMinFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata ) @@ -231,10 +237,10 @@ public void testDoubleUnderMinFails() { @Test public void testDoubleInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata ) @@ -244,10 +250,10 @@ public void testDoubleInclusiveMinSucceeds() { @Test public void testDoubleInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata ) @@ -257,10 +263,10 @@ public void testDoubleInclusiveMaxSucceeds() { @Test public void testDoubleOverMaxFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata ) @@ -269,10 +275,10 @@ public void testDoubleOverMaxFails() { @Test public void testInvalidNumberStringFails() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "abc", validationMetadata ) @@ -281,10 +287,10 @@ public void testInvalidNumberStringFails() { @Test public void testValidFloatNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "3.14", validationMetadata ) @@ -294,10 +300,10 @@ public void testValidFloatNumberStringSucceeds() { @Test public void testValidIntNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "1", validationMetadata ) @@ -307,10 +313,10 @@ public void testValidIntNumberStringSucceeds() { @Test public void testInvalidDateStringFails() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateJsonSchema.getInstance(), "abc", validationMetadata ) @@ -319,10 +325,10 @@ public void testInvalidDateStringFails() { @Test public void testValidDateStringSucceeds() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateJsonSchema.getInstance(), "2017-01-20", validationMetadata ) @@ -332,10 +338,10 @@ public void testValidDateStringSucceeds() { @Test public void testInvalidDateTimeStringFails() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateTimeJsonSchema.getInstance(), "abc", validationMetadata ) @@ -344,10 +350,10 @@ public void testInvalidDateTimeStringFails() { @Test public void testValidDateTimeStringSucceeds() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateTimeJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata ) 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 f662d087755..b16a91e3919 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 @@ -5,8 +5,8 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.ArrayList; @@ -31,16 +31,16 @@ public ArrayWithItemsSchema() { @Override public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { - if (arg instanceof List) { - return getNewInstance((List) arg, pathToItem, pathToSchemas); + if (arg instanceof List listArg) { + return getNewInstance(listArg, pathToItem, pathToSchemas); } throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); } @Override public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { - if (arg instanceof List) { - return validate((List) arg, configuration); + if (arg instanceof List listArg) { + return validate(listArg, configuration); } throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); } @@ -121,4 +121,4 @@ public void testIncorrectItemFails() { ) )); } -} +} \ No newline at end of file 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 6f875394f77..bd74714857c 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 @@ -11,10 +11,10 @@ public class ConstValidator extends BigDecimalValidator implements KeywordValida public @Nullable PathToSchemasMap validate( ValidationData data ) { - var constValue = data.schema().constValue; - if (constValue == null) { + if (!data.schema().constValueSet) { return null; } + var constValue = data.schema().constValue; if (data.arg() instanceof Number numberArg) { BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { 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 2cc030eb958..8dee0c40f0b 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 @@ -50,10 +50,10 @@ public abstract class JsonSchema { public final @Nullable Integer maxContains; public final @Nullable Integer minContains; public final @Nullable Class propertyNames; - public @Nullable Map> dependentRequired; + public final @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; - public @Nullable Map> patternProperties; - public @Nullable List> prefixItems; + public final @Nullable Map> patternProperties; + public final @Nullable List> prefixItems; public final @Nullable Class ifSchema; private final LinkedHashMap keywordToValidator; diff --git a/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs index a0b084ff935..55cb65fe9ef 100644 --- a/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs +++ b/src/main/resources/java/src/main/java/packagename/schemas/validation/ValidationData.hbs @@ -2,6 +2,8 @@ package org.openapijsonschematools.client.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; +import java.util.List; + public record ValidationData( JsonSchema schema, @Nullable Object arg, 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 fbe31f1b61b..9b91cf32a07 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 @@ -6,8 +6,14 @@ import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.exceptions.ValidationException; -import {{{packageName}}}.schemas.NumberJsonSchema; -import {{{packageName}}}.schemas.StringJsonSchema; +import {{{packageName}}}.schemas.IntJsonSchema; +import {{{packageName}}}.schemas.Int32JsonSchema; +import {{{packageName}}}.schemas.Int64JsonSchema; +import {{{packageName}}}.schemas.FloatJsonSchema; +import {{{packageName}}}.schemas.DoubleJsonSchema; +import {{{packageName}}}.schemas.DecimalJsonSchema; +import {{{packageName}}}.schemas.DateJsonSchema; +import {{{packageName}}}.schemas.DateTimeJsonSchema; import java.math.BigDecimal; import java.math.BigInteger; @@ -29,10 +35,10 @@ public class FormatValidatorTest { @Test public void testIntFormatSucceedsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 1.0f, validationMetadata ) @@ -42,10 +48,10 @@ public class FormatValidatorTest { @Test public void testIntFormatFailsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 3.14f, validationMetadata ) @@ -54,10 +60,10 @@ public class FormatValidatorTest { @Test public void testIntFormatSucceedsWithInt() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + IntJsonSchema.getInstance(), 1, validationMetadata ) @@ -67,10 +73,10 @@ public class FormatValidatorTest { @Test public void testInt32UnderMinFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), -2147483649L, validationMetadata ) @@ -79,10 +85,10 @@ public class FormatValidatorTest { @Test public void testInt32InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), -2147483648, validationMetadata ) @@ -92,10 +98,10 @@ public class FormatValidatorTest { @Test public void testInt32InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), 2147483647, validationMetadata ) @@ -105,10 +111,10 @@ public class FormatValidatorTest { @Test public void testInt32OverMaxFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int32JsonSchema.getInstance(), 2147483648L, validationMetadata ) @@ -117,11 +123,11 @@ public class FormatValidatorTest { @Test public void testInt64UnderMinFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), new BigInteger("-9223372036854775809"), validationMetadata ) @@ -130,10 +136,10 @@ public class FormatValidatorTest { @Test public void testInt64InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), -9223372036854775808L, validationMetadata ) @@ -143,10 +149,10 @@ public class FormatValidatorTest { @Test public void testInt64InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), 9223372036854775807L, validationMetadata ) @@ -156,11 +162,11 @@ public class FormatValidatorTest { @Test public void testInt64OverMaxFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + Int64JsonSchema.getInstance(), new BigInteger("9223372036854775808"), validationMetadata ) @@ -169,10 +175,10 @@ public class FormatValidatorTest { @Test public void testFloatUnderMinFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), -3.402823466385289e+38d, validationMetadata ) @@ -181,10 +187,10 @@ public class FormatValidatorTest { @Test public void testFloatInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), -3.4028234663852886e+38f, validationMetadata ) @@ -194,10 +200,10 @@ public class FormatValidatorTest { @Test public void testFloatInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), 3.4028234663852886e+38f, validationMetadata ) @@ -207,10 +213,10 @@ public class FormatValidatorTest { @Test public void testFloatOverMaxFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + FloatJsonSchema.getInstance(), 3.402823466385289e+38d, validationMetadata ) @@ -219,10 +225,10 @@ public class FormatValidatorTest { @Test public void testDoubleUnderMinFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), new BigDecimal("-1.7976931348623157082e+308"), validationMetadata ) @@ -231,10 +237,10 @@ public class FormatValidatorTest { @Test public void testDoubleInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), -1.7976931348623157E+308d, validationMetadata ) @@ -244,10 +250,10 @@ public class FormatValidatorTest { @Test public void testDoubleInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), 1.7976931348623157E+308d, validationMetadata ) @@ -257,10 +263,10 @@ public class FormatValidatorTest { @Test public void testDoubleOverMaxFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DoubleJsonSchema.getInstance(), new BigDecimal("1.7976931348623157082e+308"), validationMetadata ) @@ -269,10 +275,10 @@ public class FormatValidatorTest { @Test public void testInvalidNumberStringFails() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "abc", validationMetadata ) @@ -281,10 +287,10 @@ public class FormatValidatorTest { @Test public void testValidFloatNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "3.14", validationMetadata ) @@ -294,10 +300,10 @@ public class FormatValidatorTest { @Test public void testValidIntNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - NumberJsonSchema.getInstance(), + DecimalJsonSchema.getInstance(), "1", validationMetadata ) @@ -307,10 +313,10 @@ public class FormatValidatorTest { @Test public void testInvalidDateStringFails() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateJsonSchema.getInstance(), "abc", validationMetadata ) @@ -319,10 +325,10 @@ public class FormatValidatorTest { @Test public void testValidDateStringSucceeds() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateJsonSchema.getInstance(), "2017-01-20", validationMetadata ) @@ -332,10 +338,10 @@ public class FormatValidatorTest { @Test public void testInvalidDateTimeStringFails() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateTimeJsonSchema.getInstance(), "abc", validationMetadata ) @@ -344,10 +350,10 @@ public class FormatValidatorTest { @Test public void testValidDateTimeStringSucceeds() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( new ValidationData( - StringJsonSchema.getInstance(), + DateTimeJsonSchema.getInstance(), "2017-07-21T17:32:28Z", validationMetadata ) 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 a1f9b5b73e9..9fd1924fee1 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 @@ -6,6 +6,7 @@ import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.schemas.StringJsonSchema; +import {{{packageName}}}.exceptions.InvalidTypeException; import {{{packageName}}}.exceptions.ValidationException; import java.util.ArrayList; @@ -30,16 +31,16 @@ public class ItemsValidatorTest { @Override public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { - if (arg instanceof List) { - return getNewInstance((List) arg, pathToItem, pathToSchemas); + if (arg instanceof List listArg) { + return getNewInstance(listArg, pathToItem, pathToSchemas); } throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); } @Override public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { - if (arg instanceof List) { - return validate((List) arg, configuration); + if (arg instanceof List listArg) { + return validate(listArg, configuration); } throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); } 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 cfe39403b02..d18574778b4 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 @@ -5,6 +5,7 @@ import org.junit.Assert; import org.junit.Test; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.exceptions.InvalidTypeException; import {{{packageName}}}.exceptions.ValidationException; import java.util.LinkedHashMap; From ccf815561cdd68d6210f988657ed52ff781f1916 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 20:45:33 -0800 Subject: [PATCH 20/21] Adds functionalinterface annotation --- .../client/schemas/validation/KeywordValidator.java | 1 + .../java/packagename/schemas/validation/KeywordValidator.hbs | 1 + 2 files changed, 2 insertions(+) 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 50c6c3c5bef..8a2bd782505 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 @@ -3,6 +3,7 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; +@FunctionalInterface public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data 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 1e1cf8ac717..b95cc5d5fc2 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 @@ -3,6 +3,7 @@ package {{{packageName}}}.schemas.validation; import {{{packageName}}}.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; +@FunctionalInterface public interface KeywordValidator { @Nullable PathToSchemasMap validate( ValidationData data From e95a4ba4683e0ab3d627d6a17edea76ee8707586 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 19 Jan 2024 20:57:33 -0800 Subject: [PATCH 21/21] Samples regen --- .../java/.openapi-generator/FILES | 1 + .../AdditionalPropertiesValidator.java | 34 +- .../schemas/validation/AllOfValidator.java | 23 +- .../schemas/validation/AnyOfValidator.java | 23 +- .../schemas/validation/ConstValidator.java | 28 +- .../schemas/validation/ContainsValidator.java | 59 +-- .../DependentRequiredValidator.java | 26 +- .../validation/DependentSchemasValidator.java | 24 +- .../schemas/validation/EnumValidator.java | 30 +- .../validation/ExclusiveMaximumValidator.java | 39 +- .../validation/ExclusiveMinimumValidator.java | 39 +- .../schemas/validation/FormatValidator.java | 122 +++--- .../schemas/validation/IfValidator.java | 40 +- .../schemas/validation/ItemsValidator.java | 29 +- .../client/schemas/validation/JsonSchema.java | 284 +++++++------- .../schemas/validation/KeywordValidator.java | 32 +- .../validation/MaxContainsValidator.java | 24 +- .../schemas/validation/MaxItemsValidator.java | 23 +- .../validation/MaxLengthValidator.java | 25 +- .../validation/MaxPropertiesValidator.java | 24 +- .../schemas/validation/MaximumValidator.java | 41 +-- .../validation/MinContainsValidator.java | 27 +- .../schemas/validation/MinItemsValidator.java | 23 +- .../validation/MinLengthValidator.java | 27 +- .../validation/MinPropertiesValidator.java | 24 +- .../schemas/validation/MinimumValidator.java | 39 +- .../validation/MultipleOfValidator.java | 26 +- .../schemas/validation/NotValidator.java | 28 +- .../schemas/validation/OneOfValidator.java | 25 +- .../PatternPropertiesValidator.java | 59 +-- .../schemas/validation/PatternValidator.java | 28 +- .../validation/PrefixItemsValidator.java | 27 +- .../validation/PropertiesValidator.java | 30 +- .../validation/PropertyNamesValidator.java | 29 +- .../schemas/validation/RequiredValidator.java | 23 +- .../schemas/validation/TypeValidator.java | 19 +- .../validation/UniqueItemsValidator.java | 21 +- .../schemas/validation/ValidationData.java | 22 ++ .../AdditionalPropertiesValidatorTest.java | 40 +- .../validation/FormatValidatorTest.java | 348 +++++++++--------- .../validation/ItemsValidatorTest.java | 69 ++-- .../validation/PropertiesValidatorTest.java | 79 ++-- .../validation/RequiredValidatorTest.java | 78 ++-- .../schemas/validation/TypeValidatorTest.java | 30 +- .../petstore/java/.openapi-generator/FILES | 1 + .../AdditionalPropertiesValidator.java | 34 +- .../schemas/validation/AllOfValidator.java | 23 +- .../schemas/validation/AnyOfValidator.java | 23 +- .../schemas/validation/ConstValidator.java | 28 +- .../schemas/validation/ContainsValidator.java | 59 +-- .../DependentRequiredValidator.java | 26 +- .../validation/DependentSchemasValidator.java | 24 +- .../schemas/validation/EnumValidator.java | 30 +- .../validation/ExclusiveMaximumValidator.java | 39 +- .../validation/ExclusiveMinimumValidator.java | 39 +- .../schemas/validation/FormatValidator.java | 122 +++--- .../schemas/validation/IfValidator.java | 40 +- .../schemas/validation/ItemsValidator.java | 29 +- .../client/schemas/validation/JsonSchema.java | 284 +++++++------- .../schemas/validation/KeywordValidator.java | 32 +- .../validation/MaxContainsValidator.java | 24 +- .../schemas/validation/MaxItemsValidator.java | 23 +- .../validation/MaxLengthValidator.java | 25 +- .../validation/MaxPropertiesValidator.java | 24 +- .../schemas/validation/MaximumValidator.java | 41 +-- .../validation/MinContainsValidator.java | 27 +- .../schemas/validation/MinItemsValidator.java | 23 +- .../validation/MinLengthValidator.java | 27 +- .../validation/MinPropertiesValidator.java | 24 +- .../schemas/validation/MinimumValidator.java | 39 +- .../validation/MultipleOfValidator.java | 26 +- .../schemas/validation/NotValidator.java | 28 +- .../schemas/validation/OneOfValidator.java | 25 +- .../PatternPropertiesValidator.java | 59 +-- .../schemas/validation/PatternValidator.java | 28 +- .../validation/PrefixItemsValidator.java | 27 +- .../validation/PropertiesValidator.java | 30 +- .../validation/PropertyNamesValidator.java | 29 +- .../schemas/validation/RequiredValidator.java | 23 +- .../schemas/validation/TypeValidator.java | 19 +- .../validation/UniqueItemsValidator.java | 21 +- .../schemas/validation/ValidationData.java | 22 ++ .../AdditionalPropertiesValidatorTest.java | 40 +- .../validation/FormatValidatorTest.java | 348 +++++++++--------- .../validation/ItemsValidatorTest.java | 69 ++-- .../validation/PropertiesValidatorTest.java | 79 ++-- .../validation/RequiredValidatorTest.java | 78 ++-- .../schemas/validation/TypeValidatorTest.java | 30 +- 88 files changed, 1714 insertions(+), 2468 deletions(-) create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java 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 71a63653d18..97d6064455a 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 @@ -271,6 +271,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMe src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java +src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java src/main/java/org/openapijsonschematools/client/servers/Server0.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java index fd6fa6a4d29..2548452a115 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 @@ -8,22 +8,15 @@ import java.util.Set; public class AdditionalPropertiesValidator implements KeywordValidator { - public final Class additionalProperties; - - public AdditionalPropertiesValidator(Class additionalProperties) { - this.additionalProperties = additionalProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var additionalProperties = data.schema().additionalProperties; + if (additionalProperties == null) { return null; } Set presentAdditionalProperties = new LinkedHashSet<>(); @@ -32,22 +25,23 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.add((String) key); } } - if (schema.properties != null) { - presentAdditionalProperties.removeAll(schema.properties.keySet()); + var properties = data.schema().properties; + if (properties != null) { + presentAdditionalProperties.removeAll(properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(addPropName); - if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + if (data.patternPropertiesPathToSchemas() != null && data.patternPropertiesPathToSchemas().containsKey(propPathToItem)) { continue; } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema addPropsSchema = JsonSchemaFactory.getInstance(additionalProperties); if (propValidationMetadata.validationRanEarlier(addPropsSchema)) { 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 313e2d97446..583017ea6b5 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 @@ -1,32 +1,21 @@ package org.openapijsonschematools.client.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class AllOfValidator implements KeywordValidator { - public final List> allOf; - - public AllOfValidator(List> allOf) { - this.allOf = allOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var allOf = data.schema().allOf; + if (allOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, data.arg(), data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } - - } 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 a4754dda464..062fa2eecdc 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 @@ -7,25 +7,18 @@ import java.util.List; public class AnyOfValidator implements KeywordValidator { - public final List> anyOf; - - public AnyOfValidator(List> anyOf) { - this.anyOf = anyOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var anyOf = data.schema().anyOf; + if (anyOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { - if (anyOfClass == schema.getClass()) { + if (anyOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke _validate on it because that is recursive @@ -35,7 +28,7 @@ public AnyOfValidator(List> anyOf) { } try { JsonSchema anyOfSchema = JsonSchemaFactory.getInstance(anyOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, data.arg(), data.validationMetadata()); validatedAnyOfClasses.add(anyOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,7 +36,7 @@ public AnyOfValidator(List> anyOf) { } } if (validatedAnyOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the anyOf schemas matched the input data." ); } 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 f797c68ab2e..6409a23e5ca 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 @@ -4,27 +4,19 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Objects; public class ConstValidator extends BigDecimalValidator implements KeywordValidator { - public final @Nullable Object constValue; - - public ConstValidator(@Nullable Object constValue) { - this.constValue = constValue; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (!data.schema().constValueSet) { + return null; + } + var constValue = data.schema().constValue; + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { return null; } @@ -32,10 +24,10 @@ public ConstValidator(@Nullable Object constValue) { return null; } } else { - if (Objects.equals(arg, constValue)) { + if (Objects.equals(data.arg(), constValue)) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not equal to const "+constValue); + throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue); } -} +} \ 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/ContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java index deaa878d5af..fbfd1c9c700 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 @@ -3,32 +3,21 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.exceptions.ValidationException; -import java.util.ArrayList; import java.util.List; public class ContainsValidator implements KeywordValidator { - public final Class contains; - - public ContainsValidator(Class contains) { - this.contains = contains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } + var containsPathToSchemas = data.containsPathToSchemas(); if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { throw new ValidationException( - "Validation failed for contains keyword in class="+schema.getClass() - + " at pathToItem="+validationMetadata.pathToItem()+". No " + "Validation failed for contains keyword in class="+data.schema().getClass() + + " at pathToItem="+data.validationMetadata().pathToItem()+". No " + "items validated to the contains schema." ); } @@ -38,42 +27,4 @@ public ContainsValidator(Class contains) { } return pathToSchemas; } - - public List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - if (!(arg instanceof List)) { - return new ArrayList<>(); - } - @Nullable List containsPathToSchemas = new ArrayList<>(); - int i = 0; - for(Object itemValue: (List) arg) { - PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); - itemPathToItem.add(i); - ValidationMetadata itemValidationMetadata = new ValidationMetadata( - itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() - ); - JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); - if (itemValidationMetadata.validationRanEarlier(containsSchema)) { - // todo add_deeper_validated_schemas - containsPathToSchemas.add(thesePathToSchemas); - i += 1; - continue; - } - - try { - PathToSchemasMap otherPathToSchemas = JsonSchema.validate( - containsSchema, itemValue, itemValidationMetadata); - containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) { - ; - } - } - return containsPathToSchemas; - } } \ 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/DependentRequiredValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/DependentRequiredValidator.java index a5e92887928..77b21ca801d 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 @@ -4,35 +4,27 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; public class DependentRequiredValidator implements KeywordValidator { - public final Map> dependentRequired; - - public DependentRequiredValidator(Map> dependentRequired) { - this.dependentRequired = dependentRequired; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var dependentRequired = data.schema().dependentRequired; + if (dependentRequired == null) { return null; } for (Map.Entry> entry: dependentRequired.entrySet()) { - if (!((Map) arg).containsKey(entry.getKey())) { + if (!mapArg.containsKey(entry.getKey())) { continue; } Set missingKeys = new HashSet<>(entry.getValue()); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { missingKeys.remove(key); } @@ -42,7 +34,7 @@ public DependentRequiredValidator(Map> dependentRequired) { } throw new ValidationException( "Validation failed for dependentRequired because these_keys="+missingKeys+" are "+ - "missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass() + "missing at pathToItem="+data.validationMetadata().pathToItem()+" in class "+data.schema().getClass() ); } 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 0ffa3b351ca..940157d3b48 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 @@ -2,29 +2,20 @@ import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; public class DependentSchemasValidator implements KeywordValidator { - public final Map> dependentSchemas; - - public DependentSchemasValidator(Map> dependentSchemas) { - this.dependentSchemas = dependentSchemas; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var dependentSchemas = data.schema().dependentSchemas; + if (dependentSchemas == null) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -41,10 +32,9 @@ public DependentSchemasValidator(Map> depend } Class dependentSchemaClass = entry.getValue(); JsonSchema dependentSchema = JsonSchemaFactory.getInstance(dependentSchemaClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, mapArg, data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } } - 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 6cc9459e1a8..8af756619bd 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 @@ -4,36 +4,28 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { - public final Set<@Nullable Object> enumValues; - - public EnumValidator(Set<@Nullable Object> enumValues) { - this.enumValues = enumValues; - } - @SuppressWarnings("nullness") - private boolean enumContainsArg(@Nullable Object arg){ + private static boolean enumContainsArg(Set<@Nullable Object> enumValues, @Nullable Object arg){ return enumValues.contains(arg); } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var enumValues = data.schema().enumValues; + if (enumValues == null) { + return null; + } if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); - if (enumContainsArg(castArg)) { + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); + if (enumContainsArg(enumValues, castArg)) { return null; } for (Object enumValue: enumValues) { @@ -42,10 +34,10 @@ private boolean enumContainsArg(@Nullable Object arg){ } } } else { - if (enumContainsArg(arg)) { + if (enumContainsArg(enumValues, data.arg())) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not one of the allowed enum "+enumValues); + throw new ValidationException("Invalid value "+data.arg()+" was not one of the allowed enum "+enumValues); } } 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 432d5b0f4de..7d05ff65546 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMaximumValidator implements KeywordValidator { - public final Number exclusiveMaximum; - - public ExclusiveMaximumValidator(Number exclusiveMaximum) { - this.exclusiveMaximum = exclusiveMaximum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var exclusiveMaximum = data.schema().exclusiveMaximum; + if (exclusiveMaximum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMaximum.intValue()) > -1) { + String msg = "Value " + data.arg() + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMaximum.intValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMaximum.longValue()) > -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMaximum.longValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMaximum.floatValue()) > -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMaximum.floatValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMaximum.doubleValue()) > -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMaximum.doubleValue()) > -1) { throw new ValidationException(msg); } 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 d60c96f8325..73eb1e547c3 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMinimumValidator implements KeywordValidator { - public final Number exclusiveMinimum; - - public ExclusiveMinimumValidator(Number exclusiveMinimum) { - this.exclusiveMinimum = exclusiveMinimum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var exclusiveMinimum = data.schema().exclusiveMinimum; + if (exclusiveMinimum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMinimum.intValue()) < 1) { + String msg = "Value " + data.arg() + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMinimum.intValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMinimum.longValue()) < 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMinimum.longValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMinimum.floatValue()) < 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMinimum.floatValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMinimum.doubleValue()) < 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMinimum.doubleValue()) < 1) { throw new ValidationException(msg); } 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 d782f2ce4a2..c1ca45e44f3 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 @@ -6,16 +6,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.format.DateTimeParseException; -import java.util.List; import java.util.UUID; public class FormatValidator implements KeywordValidator { - public final String format; - - public FormatValidator(String format) { - this.format = format; - } - private final static BigInteger int32InclusiveMinimum = BigInteger.valueOf(-2147483648L); private final static BigInteger int32InclusiveMaximum = BigInteger.valueOf(2147483647L); private final static BigInteger int64InclusiveMinimum = BigInteger.valueOf(-9223372036854775808L); @@ -25,12 +18,12 @@ public FormatValidator(String format) { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private Void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private static void validateNumericFormat(Number arg, ValidationMetadata validationMetadata, String format) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; if (arg instanceof Float || arg instanceof Double) { - Double doubleArg; + double doubleArg; if (arg instanceof Float) { doubleArg = arg.doubleValue(); } else { @@ -60,20 +53,17 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value " + arg + " for format int32 at " + validationMetadata.pathToItem() ); } - return null; } else if (format.equals("int64")) { if (intArg.compareTo(int64InclusiveMinimum) < 0 || intArg.compareTo(int64InclusiveMaximum) > 0) { throw new ValidationException( "Invalid value " + arg + " for format int64 at " + validationMetadata.pathToItem() ); } - return null; } - return null; } else if (format.equals("float") || format.equals("double")) { BigDecimal decimalArg; if (arg instanceof Float) { - decimalArg = new BigDecimal((Float) arg); + decimalArg = BigDecimal.valueOf(arg.doubleValue()); } else if (arg instanceof Double) { decimalArg = BigDecimal.valueOf((Double) arg); } else { @@ -85,83 +75,81 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value "+arg+" for format float at "+validationMetadata.pathToItem() ); } - return null; - } else if (format.equals("double")) { + } else { if (decimalArg.compareTo(doubleInclusiveMinimum) < 0 || decimalArg.compareTo(doubleInclusiveMaximum) > 0 ){ throw new ValidationException( "Invalid value "+arg+" for format double at "+validationMetadata.pathToItem() ); } - return null; } } - return null; } - private Void validateStringFormat(String arg, ValidationMetadata validationMetadata) { - if (format.equals("uuid")) { - try { - UUID.fromString(arg); - } catch (IllegalArgumentException e) { - throw new ValidationException( - "Value cannot be converted to a UUID. Invalid value "+ - arg+" for format uuid at "+validationMetadata.pathToItem() - ); + private static void validateStringFormat(String arg, ValidationMetadata validationMetadata, String format) { + switch (format) { + case "uuid" -> { + try { + UUID.fromString(arg); + } catch (IllegalArgumentException e) { + throw new ValidationException( + "Value cannot be converted to a UUID. Invalid value " + + arg + " for format uuid at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("number")) { - try { - new BigDecimal(arg); - } catch (NumberFormatException e) { - throw new ValidationException( - "Value cannot be converted to a decimal. Invalid value "+ - arg+" for format number at "+validationMetadata.pathToItem() - ); + case "number" -> { + try { + new BigDecimal(arg); + } catch (NumberFormatException e) { + throw new ValidationException( + "Value cannot be converted to a decimal. Invalid value " + + arg + " for format number at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date")) { - try { - new CustomIsoparser().parseIsodate(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 date format. "+ - "Invalid value "+arg+" for format date at "+validationMetadata.pathToItem() - ); + case "date" -> { + try { + new CustomIsoparser().parseIsodate(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 date format. " + + "Invalid value " + arg + " for format date at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date-time")) { - try { - new CustomIsoparser().parseIsodatetime(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 datetime format. "+ - "Invalid value "+arg+" for format datetime at "+validationMetadata.pathToItem() - ); + case "date-time" -> { + try { + new CustomIsoparser().parseIsodatetime(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 datetime format. " + + "Invalid value " + arg + " for format datetime at " + validationMetadata.pathToItem() + ); + } } - return null; } - return null; } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { + var format = data.schema().format; + if (format == null) { + return null; + } + if (data.arg() instanceof Number numberArg) { validateNumericFormat( - (Number) arg, - validationMetadata + numberArg, + data.validationMetadata(), + format ); return null; - } else if (arg instanceof String) { + } else if (data.arg() instanceof String stringArg) { validateStringFormat( - (String) arg, - validationMetadata + stringArg, + data.validationMetadata(), + format ); return null; } diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java index e1634bd1b00..b145ab8007a 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java @@ -1,33 +1,18 @@ package org.openapijsonschematools.client.schemas.validation; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class IfValidator implements KeywordValidator { - public final Class ifSchema; - - public IfValidator(Class ifSchema) { - this.ifSchema = ifSchema; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (ifPathToSchemas == null) { + var ifSchema = data.schema().ifSchema; + if (ifSchema == null) { + return null; + } + if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } /* @@ -40,17 +25,4 @@ public IfValidator(Class ifSchema) { */ return null; } - - public PathToSchemasMap getIfPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); - PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - try { - var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); - pathToSchemas.update(otherPathToSchemas); - } catch (ValidationException | InvalidTypeException ignored) {} - return pathToSchemas; - } } 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 5d146ab250c..5bd194d47a9 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 @@ -6,38 +6,31 @@ import java.util.List; public class ItemsValidator implements KeywordValidator { - public final Class items; - - public ItemsValidator(Class items) { - this.items = items; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + var items = data.schema().items; + if (items == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - int minIndex = schema.prefixItems != null ? schema.prefixItems.size() : 0; + int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0; JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items); for(int i = minIndex; i < listArg.size(); i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); if (itemValidationMetadata.validationRanEarlier(itemsSchema)) { // todo add_deeper_validated_schemas 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 551c586665c..db33a080218 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 @@ -50,10 +50,10 @@ public abstract class JsonSchema { public final @Nullable Integer maxContains; public final @Nullable Integer minContains; public final @Nullable Class propertyNames; - public @Nullable Map> dependentRequired; + public final @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; - public @Nullable Map> patternProperties; - public @Nullable List> prefixItems; + public final @Nullable Map> patternProperties; + public final @Nullable List> prefixItems; public final @Nullable Class ifSchema; private final LinkedHashMap keywordToValidator; @@ -61,244 +61,142 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { LinkedHashMap keywordToValidator = new LinkedHashMap<>(); this.type = jsonSchemaInfo.type; if (this.type != null) { - keywordToValidator.put( - "type", - new TypeValidator(this.type) - ); + keywordToValidator.put("type", new TypeValidator()); } this.format = jsonSchemaInfo.format; if (this.format != null) { - keywordToValidator.put( - "format", - new FormatValidator(this.format) - ); + keywordToValidator.put("format", new FormatValidator()); } this.items = jsonSchemaInfo.items; if (this.items != null) { - keywordToValidator.put( - "items", - new ItemsValidator(this.items) - ); + keywordToValidator.put("items", new ItemsValidator()); } this.properties = jsonSchemaInfo.properties; if (this.properties != null) { - keywordToValidator.put( - "properties", - new PropertiesValidator(this.properties) - ); + keywordToValidator.put("properties", new PropertiesValidator()); } this.required = jsonSchemaInfo.required; if (this.required != null) { - keywordToValidator.put( - "required", - new RequiredValidator(this.required) - ); + keywordToValidator.put("required", new RequiredValidator()); } this.exclusiveMaximum = jsonSchemaInfo.exclusiveMaximum; if (this.exclusiveMaximum != null) { - keywordToValidator.put( - "exclusiveMaximum", - new ExclusiveMaximumValidator(this.exclusiveMaximum) - ); + keywordToValidator.put("exclusiveMaximum", new ExclusiveMaximumValidator()); } this.exclusiveMinimum = jsonSchemaInfo.exclusiveMinimum; if (this.exclusiveMinimum != null) { - keywordToValidator.put( - "exclusiveMinimum", - new ExclusiveMinimumValidator(this.exclusiveMinimum) - ); + keywordToValidator.put("exclusiveMinimum", new ExclusiveMinimumValidator()); } this.maxItems = jsonSchemaInfo.maxItems; if (this.maxItems != null) { - keywordToValidator.put( - "maxItems", - new MaxItemsValidator(this.maxItems) - ); + keywordToValidator.put("maxItems", new MaxItemsValidator()); } this.minItems = jsonSchemaInfo.minItems; if (this.minItems != null) { - keywordToValidator.put( - "minItems", - new MinItemsValidator(this.minItems) - ); + keywordToValidator.put("minItems", new MinItemsValidator()); } this.maxLength = jsonSchemaInfo.maxLength; if (this.maxLength != null) { - keywordToValidator.put( - "maxLength", - new MaxLengthValidator(this.maxLength) - ); + keywordToValidator.put("maxLength", new MaxLengthValidator()); } this.minLength = jsonSchemaInfo.minLength; if (this.minLength != null) { - keywordToValidator.put( - "minLength", - new MinLengthValidator(this.minLength) - ); + keywordToValidator.put("minLength", new MinLengthValidator()); } this.maxProperties = jsonSchemaInfo.maxProperties; if (this.maxProperties != null) { - keywordToValidator.put( - "maxProperties", - new MaxPropertiesValidator(this.maxProperties) - ); + keywordToValidator.put("maxProperties", new MaxPropertiesValidator()); } this.minProperties = jsonSchemaInfo.minProperties; if (this.minProperties != null) { - keywordToValidator.put( - "minProperties", - new MinPropertiesValidator(this.minProperties) - ); + keywordToValidator.put("minProperties", new MinPropertiesValidator()); } this.maximum = jsonSchemaInfo.maximum; if (this.maximum != null) { - keywordToValidator.put( - "maximum", - new MaximumValidator(this.maximum) - ); + keywordToValidator.put("maximum", new MaximumValidator()); } this.minimum = jsonSchemaInfo.minimum; if (this.minimum != null) { - keywordToValidator.put( - "minimum", - new MinimumValidator(this.minimum) - ); + keywordToValidator.put("minimum", new MinimumValidator()); } this.multipleOf = jsonSchemaInfo.multipleOf; if (this.multipleOf != null) { - keywordToValidator.put( - "multipleOf", - new MultipleOfValidator(this.multipleOf) - ); + keywordToValidator.put("multipleOf", new MultipleOfValidator()); } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { - keywordToValidator.put( - "additionalProperties", - new AdditionalPropertiesValidator(this.additionalProperties) - ); + keywordToValidator.put("additionalProperties", new AdditionalPropertiesValidator()); } this.allOf = jsonSchemaInfo.allOf; if (this.allOf != null) { - keywordToValidator.put( - "allOf", - new AllOfValidator(this.allOf) - ); + keywordToValidator.put("allOf", new AllOfValidator()); } this.anyOf = jsonSchemaInfo.anyOf; if (this.anyOf != null) { - keywordToValidator.put( - "anyOf", - new AnyOfValidator(this.anyOf) - ); + keywordToValidator.put("anyOf", new AnyOfValidator()); } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { - keywordToValidator.put( - "oneOf", - new OneOfValidator(this.oneOf) - ); + keywordToValidator.put("oneOf", new OneOfValidator()); } this.not = jsonSchemaInfo.not; if (this.not != null) { - keywordToValidator.put( - "not", - new NotValidator(this.not) - ); + keywordToValidator.put("not", new NotValidator()); } this.uniqueItems = jsonSchemaInfo.uniqueItems; if (this.uniqueItems != null) { - keywordToValidator.put( - "uniqueItems", - new UniqueItemsValidator(this.uniqueItems) - ); + keywordToValidator.put("uniqueItems", new UniqueItemsValidator()); } this.enumValues = jsonSchemaInfo.enumValues; if (this.enumValues != null) { - keywordToValidator.put( - "enum", - new EnumValidator(this.enumValues) - ); + keywordToValidator.put("enum", new EnumValidator()); } this.pattern = jsonSchemaInfo.pattern; if (this.pattern != null) { - keywordToValidator.put( - "pattern", - new PatternValidator(this.pattern) - ); + keywordToValidator.put("pattern", new PatternValidator()); } this.defaultValue = jsonSchemaInfo.defaultValue; this.defaultValueSet = jsonSchemaInfo.defaultValueSet; this.constValue = jsonSchemaInfo.constValue; this.constValueSet = jsonSchemaInfo.constValueSet; if (this.constValueSet) { - keywordToValidator.put( - "const", - new ConstValidator(this.constValue) - ); + keywordToValidator.put("const", new ConstValidator()); } this.contains = jsonSchemaInfo.contains; if (this.contains != null) { - keywordToValidator.put( - "contains", - new ContainsValidator(this.contains) - ); + keywordToValidator.put("contains", new ContainsValidator()); } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { - keywordToValidator.put( - "maxContains", - new MaxContainsValidator(this.maxContains) - ); + keywordToValidator.put("maxContains", new MaxContainsValidator()); } this.minContains = jsonSchemaInfo.minContains; if (this.minContains != null) { - keywordToValidator.put( - "minContains", - new MinContainsValidator(this.minContains) - ); + keywordToValidator.put("minContains", new MinContainsValidator()); } this.propertyNames = jsonSchemaInfo.propertyNames; if (this.propertyNames != null) { - keywordToValidator.put( - "propertyNames", - new PropertyNamesValidator(this.propertyNames) - ); + keywordToValidator.put("propertyNames", new PropertyNamesValidator()); } this.dependentRequired = jsonSchemaInfo.dependentRequired; if (this.dependentRequired != null) { - keywordToValidator.put( - "dependentRequired", - new DependentRequiredValidator(this.dependentRequired) - ); + keywordToValidator.put("dependentRequired", new DependentRequiredValidator()); } this.dependentSchemas = jsonSchemaInfo.dependentSchemas; if (this.dependentSchemas != null) { - keywordToValidator.put( - "dependentSchemas", - new DependentSchemasValidator(this.dependentSchemas) - ); + keywordToValidator.put("dependentSchemas", new DependentSchemasValidator()); } this.patternProperties = jsonSchemaInfo.patternProperties; if (this.patternProperties != null) { - keywordToValidator.put( - "patternProperties", - new PatternPropertiesValidator(this.patternProperties) - ); + keywordToValidator.put("patternProperties", new PatternPropertiesValidator()); } this.prefixItems = jsonSchemaInfo.prefixItems; if (this.prefixItems != null) { - keywordToValidator.put( - "prefixItems", - new PrefixItemsValidator(this.prefixItems) - ); + keywordToValidator.put("prefixItems", new PrefixItemsValidator()); } this.ifSchema = jsonSchemaInfo.ifSchema; if (this.ifSchema != null) { - keywordToValidator.put( - "if", - new IfValidator(this.ifSchema) - ); + keywordToValidator.put("if", new IfValidator()); } this.keywordToValidator = keywordToValidator; } @@ -306,6 +204,93 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { public abstract @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException; public abstract @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException; + private List getContainsPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof List listArg) || contains == null) { + return new ArrayList<>(); + } + JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); + @Nullable List containsPathToSchemas = new ArrayList<>(); + int i = 0; + for(Object itemValue: listArg) { + PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); + List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + itemPathToItem.add(i); + ValidationMetadata itemValidationMetadata = new ValidationMetadata( + itemPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + if (itemValidationMetadata.validationRanEarlier(containsSchema)) { + // todo add_deeper_validated_schemas + containsPathToSchemas.add(thesePathToSchemas); + i += 1; + continue; + } + + try { + PathToSchemasMap otherPathToSchemas = JsonSchema.validate( + containsSchema, itemValue, itemValidationMetadata); + containsPathToSchemas.add(otherPathToSchemas); + } catch (ValidationException ignored) {} + } + return containsPathToSchemas; + } + + private PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg) || patternProperties == null) { + 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; + } + + private PathToSchemasMap getIfPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (ifSchema == null) { + return new PathToSchemasMap(); + } + JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + try { + var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); + pathToSchemas.update(otherPathToSchemas); + } catch (ValidationException | InvalidTypeException ignored) {} + return pathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -315,19 +300,16 @@ public static PathToSchemasMap validate( PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; @Nullable List containsPathToSchemas = null; - KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); - if (containsValidator != null) { - containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("contains")) { + containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; - KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); - if (patternPropertiesValidator != null) { - patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("patternProperties")) { + patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; - KeywordValidator ifValidator = thisKeywordToValidator.get("if"); - if (ifValidator != null) { - ifPathToSchemas = ifValidator.getIfPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("if")) { + ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata); } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); @@ -338,7 +320,7 @@ public static PathToSchemasMap validate( } } KeywordValidator validator = entry.getValue(); - @Nullable PathToSchemasMap otherPathToSchemas = validator.validate( + ValidationData data = new ValidationData( jsonSchema, arg, validationMetadata, @@ -346,6 +328,7 @@ public static PathToSchemasMap validate( patternPropertiesPathToSchemas, ifPathToSchemas ); + @Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data); if (otherPathToSchemas == null) { continue; } @@ -401,10 +384,9 @@ protected List castToAllowedTypes(List arg, List pathToItem, Set argFixed = new LinkedHashMap<>(); for (Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { + if (!(entryKey instanceof String key)) { throw new InvalidTypeException("Invalid non-string key value"); } - String key = (String) entryKey; Object val = entry.getValue(); List newPathToItem = new ArrayList<>(pathToItem); newPathToItem.add(key); 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 41b4b85eb2e..8a2bd782505 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 @@ -3,37 +3,9 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.List; - +@FunctionalInterface public interface KeywordValidator { @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) throws ValidationException; - - default List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new ArrayList<>(); - } - - default PathToSchemasMap getPatternPropertiesPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new PathToSchemasMap(); - } - - default PathToSchemasMap getIfPathToSchemas( - @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 25482139fab..9e9b3b92c18 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 @@ -6,31 +6,25 @@ import java.util.List; public class MaxContainsValidator implements KeywordValidator { - public final int maxContains; - - public MaxContainsValidator(int maxContains) { - this.maxContains = maxContains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var maxContains = data.schema().maxContains; + if (maxContains == null) { + return null; + } + if (!(data.arg() instanceof List)) { return null; } + var containsPathToSchemas = data.containsPathToSchemas(); if (containsPathToSchemas == null) { return null; } if (containsPathToSchemas.size() > maxContains) { throw new ValidationException( - "Validation failed for maxContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema." + "Validation failed for maxContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." ); } 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 bda6fb43ece..98ed5cb4ff4 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 @@ -6,26 +6,19 @@ import java.util.List; public class MaxItemsValidator implements KeywordValidator { - public final int maxItems; - - public MaxItemsValidator(int maxItems) { - this.maxItems = maxItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var maxItems = data.schema().maxItems; + if (maxItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() > maxItems) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxItems of " + maxItems); + if (listArg.size() > maxItems) { + throw new ValidationException("Value " + listArg + " is invalid because has > the maxItems of " + maxItems); } 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 1a78623e0f4..08d91666c5d 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 @@ -3,30 +3,21 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaxLengthValidator extends LengthValidator implements KeywordValidator { - public final int maxLength; - - public MaxLengthValidator(int maxLength) { - this.maxLength = maxLength; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var maxLength = data.schema().maxLength; + if (maxLength == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length > maxLength) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxLength of " + maxLength); + throw new ValidationException("Value " + stringArg + " is invalid because has > the maxLength of " + maxLength); } 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 5928ec588ac..d117f1688e2 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 @@ -3,30 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { - public final int maxProperties; - - public MaxPropertiesValidator(int maxProperties) { - this.maxProperties = maxProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var maxProperties = data.schema().maxProperties; + if (maxProperties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() > maxProperties) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxProperties of " + maxProperties); + if (mapArg.size() > maxProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has > the maxProperties of " + maxProperties); } 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 25faceb4022..702f09686dc 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 @@ -3,52 +3,43 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaximumValidator implements KeywordValidator { - public final Number maximum; - - public MaximumValidator(Number maximum) { - this.maximum = maximum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var maximum = data.schema().maximum; + if (maximum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is > the maximum of " + maximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(maximum.intValue()) == 1) { + String msg = "Value " + data.arg() + " is invalid because it is > the maximum of " + maximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(maximum.intValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(maximum.longValue()) == 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(maximum.longValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(maximum.floatValue()) == 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(maximum.floatValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(maximum.doubleValue()) == 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(maximum.doubleValue()) > 0) { throw new ValidationException(msg); } return null; } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinContainsValidator.java index 2f34127155e..1827e95cc83 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 @@ -6,31 +6,24 @@ import java.util.List; public class MinContainsValidator implements KeywordValidator { - public final int minContains; - - public MinContainsValidator(int minContains) { - this.minContains = minContains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var minContains = data.schema().minContains; + if (minContains == null) { + return null; + } + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() < minContains) { + if (data.containsPathToSchemas().size() < minContains) { throw new ValidationException( - "Validation failed for minContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema." + "Validation failed for minContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too few items validated to the contains schema." ); } 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 7c46cbe8f94..d1933ca7750 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 @@ -6,26 +6,19 @@ import java.util.List; public class MinItemsValidator implements KeywordValidator { - public final int minItems; - - public MinItemsValidator(int minItems) { - this.minItems = minItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var minItems = data.schema().minItems; + if (minItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() < minItems) { - throw new ValidationException("Value " + arg + " is invalid because has < the minItems of " + minItems); + if (listArg.size() < minItems) { + throw new ValidationException("Value " + listArg + " is invalid because has < the minItems of " + minItems); } 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 7c92205a9cf..1defdc891e3 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 @@ -3,31 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinLengthValidator extends LengthValidator implements KeywordValidator { - public final int minLength; - - public MinLengthValidator(int minLength) { - this.minLength = minLength; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var minLength = data.schema().minLength; + if (minLength == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length < minLength) { - throw new ValidationException("Value " + arg + " is invalid because has < the minLength of " + minLength); + throw new ValidationException("Value " + stringArg + " is invalid because has < the minLength of " + minLength); } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/MinPropertiesValidator.java index c52b16000d8..c0b99e7fb7d 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 @@ -3,30 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { - public final int minProperties; - - public MinPropertiesValidator(int minProperties) { - this.minProperties = minProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var minProperties = data.schema().minProperties; + if (minProperties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() < minProperties) { - throw new ValidationException("Value " + arg + " is invalid because has < the minProperties of " + minProperties); + if (mapArg.size() < minProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has < the minProperties of " + minProperties); } 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 dec192d47df..3b539120e42 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinimumValidator implements KeywordValidator { - public final Number minimum; - - public MinimumValidator(Number minimum) { - this.minimum = minimum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var minimum = data.schema().minimum; + if (minimum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is < the minimum of " + minimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(minimum.intValue()) == -1) { + String msg = "Value " + data.arg() + " is invalid because it is < the minimum of " + minimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(minimum.intValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(minimum.longValue()) == -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(minimum.longValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(minimum.floatValue()) == -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(minimum.floatValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(minimum.doubleValue()) == -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(minimum.doubleValue()) < 0) { throw new ValidationException(msg); } 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 15230b54275..eebc07a0f10 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 @@ -3,33 +3,25 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { - public final BigDecimal multipleOf; - - public MultipleOfValidator(BigDecimal multipleOf) { - this.multipleOf = multipleOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var multipleOf = data.schema().multipleOf; + if (multipleOf == null) { + return null; + } + if (!(data.arg() instanceof Number numberArg)) { return null; } - BigDecimal castArg = getBigDecimal((Number) arg); - String msg = "Value " + arg + " is invalid because it is not a multiple of " + multipleOf; + BigDecimal castArg = getBigDecimal(numberArg); + String msg = "Value " + numberArg + " is invalid because it is not a multiple of " + multipleOf; if (castArg.remainder(multipleOf).compareTo(BigDecimal.ZERO) != 0) { throw new ValidationException(msg); } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/NotValidator.java index 507c7f40fbc..aa61be1b624 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 @@ -3,39 +3,25 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class NotValidator implements KeywordValidator { - public final Class not; - - public NotValidator(Class not) { - this.not = not; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var not = data.schema().not; + if (not == null) { + return null; + } PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); - pathToSchemas = JsonSchema.validate(notSchema, arg, validationMetadata); + pathToSchemas = JsonSchema.validate(notSchema, data.arg(), data.validationMetadata()); } catch (ValidationException e) { return null; } if (!pathToSchemas.isEmpty()) { throw new ValidationException( - "Invalid value "+arg+" was passed in to "+schema.getClass()+". "+ + "Invalid value "+data.arg()+" was passed in to "+data.schema().getClass()+". "+ "Value is invalid because it is disallowed by not "+not ); } 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 5bc4bbd297b..f84f7796a8c 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 @@ -7,25 +7,18 @@ import java.util.List; public class OneOfValidator implements KeywordValidator { - public final List> oneOf; - - public OneOfValidator(List> oneOf) { - this.oneOf = oneOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var oneOf = data.schema().oneOf; + if (oneOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { - if (oneOfClass == schema.getClass()) { + if (oneOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke validate on it because that is recursive @@ -35,7 +28,7 @@ public OneOfValidator(List> oneOf) { } try { JsonSchema oneOfSchema = JsonSchemaFactory.getInstance(oneOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, data.arg(), data.validationMetadata()); validatedOneOfClasses.add(oneOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,12 +36,12 @@ public OneOfValidator(List> oneOf) { } } if (validatedOneOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the oneOf schemas matched the input data." ); } if (validatedOneOfClasses.size() > 1) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". Multiple "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". Multiple "+ "oneOf schemas validated the data, but a max of one is allowed." ); } 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 index 6104329139f..9e951e23ed2 100644 --- 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 @@ -1,68 +1,21 @@ 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, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var patternProperties = data.schema().patternProperties; + if (patternProperties == null) { 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); - } + if (!(data.arg() instanceof Map)) { + return null; } - return pathToSchemas; + return data.patternPropertiesPathToSchemas(); } } - 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 37e7a545711..eceeb19e311 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 @@ -3,31 +3,21 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; -import java.util.regex.Pattern; - public class PatternValidator implements KeywordValidator { - public final Pattern pattern; - - public PatternValidator(Pattern pattern) { - this.pattern = pattern; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var pattern = data.schema().pattern; + if (pattern == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - if (!pattern.matcher((String) arg).find()) { - throw new ValidationException("Invalid value "+arg+" did not find a match for pattern "+pattern); + if (!pattern.matcher(stringArg).find()) { + throw new ValidationException("Invalid value "+stringArg+" did not find a match for pattern "+pattern); } return null; } -} +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java index a8b2bda2a21..00e5b17607b 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java @@ -6,22 +6,15 @@ import java.util.List; public class PrefixItemsValidator implements KeywordValidator { - public final List> prefixItems; - - public PrefixItemsValidator(List> prefixItems) { - this.prefixItems = prefixItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + var prefixItems = data.schema().prefixItems; + if (prefixItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { @@ -30,13 +23,13 @@ public PrefixItemsValidator(List> prefixItems) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); int maxIndex = Math.min(listArg.size(), prefixItems.size()); for (int i=0; i < maxIndex; i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema itemsSchema = JsonSchemaFactory.getInstance(prefixItems.get(i)); PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata); 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 9b7d50b28d8..17bccdd666a 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 @@ -9,22 +9,15 @@ import java.util.Set; public class PropertiesValidator implements KeywordValidator { - public final Map> properties; - - public PropertiesValidator(Map> properties) { - this.properties = properties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + var properties = data.schema().properties; + if (properties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -39,14 +32,14 @@ public PropertiesValidator(Map> properties) if (!presentProperties.contains(propName)) { continue; } - @Nullable Object propValue = ((Map) arg).get(propName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + @Nullable Object propValue = mapArg.get(propName); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(propName); ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); Class propClass = entry.getValue(); JsonSchema propSchema = JsonSchemaFactory.getInstance(propClass); @@ -60,4 +53,3 @@ public PropertiesValidator(Map> properties) return pathToSchemas; } } - 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 5154911d484..55ea80b0382 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 @@ -7,34 +7,27 @@ import java.util.Map; public class PropertyNamesValidator implements KeywordValidator { - public final Class propertyNames; - - public PropertyNamesValidator(Class propertyNames) { - this.propertyNames = propertyNames; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var propertyNames = data.schema().propertyNames; + if (propertyNames == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } JsonSchema propertyNamesSchema = JsonSchemaFactory.getInstance(propertyNames); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(key); ValidationMetadata keyValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema.validate(propertyNamesSchema, key, keyValidationMetadata); } 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 f68aef2b87a..f2e1a8ecde8 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 @@ -9,26 +9,19 @@ import java.util.Set; public class RequiredValidator implements KeywordValidator { - public final Set required; - - public RequiredValidator(Set required) { - this.required = required; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var required = data.schema().required; + if (required == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } Set missingRequiredProperties = new HashSet<>(required); - for (Object key: ((Map) arg).keySet()) { + for (Object key: mapArg.keySet()) { if (key instanceof String) { missingRequiredProperties.remove(key); } @@ -40,7 +33,7 @@ public RequiredValidator(Set required) { pluralChar = "s"; } throw new ValidationException( - schema.getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps + data.schema().getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps ); } 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 f1fcd9d5cdd..bb4133a770e 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 @@ -5,25 +5,18 @@ import java.util.List; import java.util.Map; -import java.util.Set; public class TypeValidator implements KeywordValidator { - public final Set> type; - - public TypeValidator(Set> type) { - this.type = type; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var type = data.schema().type; + if (type == null) { + return null; + } Class argClass; + var arg = data.arg(); if (arg == null) { argClass = Void.class; } else if (arg instanceof List) { 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 4cdbbe01060..a42a7d60b60 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 @@ -8,29 +8,22 @@ import java.util.Set; public class UniqueItemsValidator implements KeywordValidator { - public final boolean uniqueItems; - - public UniqueItemsValidator(boolean uniqueItems) { - this.uniqueItems = uniqueItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var uniqueItems = data.schema().uniqueItems; + if (uniqueItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (!uniqueItems) { return null; } Set<@Nullable Object> seenItems = new HashSet<>(); - for (@Nullable Object item: (List) arg) { + for (@Nullable Object item: listArg) { int startingSeenItemsSize = seenItems.size(); seenItems.add(item); if (seenItems.size() == startingSeenItemsSize) { diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java new file mode 100644 index 00000000000..55cb65fe9ef --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java @@ -0,0 +1,22 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; + +public record ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas, + @Nullable PathToSchemasMap ifPathToSchemas +) { + public ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + this(schema, arg, validationMetadata, null, null, null); + } +} \ 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/AdditionalPropertiesValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidatorTest.java index 7e6d7d09535..f98e0a7d529 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 @@ -26,6 +26,7 @@ private ObjectWithPropsSchema() { .properties(Map.ofEntries( new PropertyEntry("someString", StringJsonSchema.class) )) + .additionalProperties(StringJsonSchema.class) ); } @@ -73,14 +74,13 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", "def"); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -105,14 +105,13 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @@ -130,14 +129,13 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata + ) )); } } \ 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 87a6bafc05f..db31df87dd9 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 @@ -6,8 +6,14 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.NumberJsonSchema; -import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.Int32JsonSchema; +import org.openapijsonschematools.client.schemas.Int64JsonSchema; +import org.openapijsonschematools.client.schemas.FloatJsonSchema; +import org.openapijsonschematools.client.schemas.DoubleJsonSchema; +import org.openapijsonschematools.client.schemas.DecimalJsonSchema; +import org.openapijsonschematools.client.schemas.DateJsonSchema; +import org.openapijsonschematools.client.schemas.DateTimeJsonSchema; import java.math.BigDecimal; import java.math.BigInteger; @@ -29,354 +35,328 @@ private void assertNull(@Nullable Object object) { @Test public void testIntFormatSucceedsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.0f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 1.0f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testIntFormatFailsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.14f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 3.14f, + validationMetadata + ) )); } @Test public void testIntFormatSucceedsWithInt() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32UnderMinFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -2147483649L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + -2147483649L, + validationMetadata + ) )); } @Test public void testInt32InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -2147483648, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + -2147483648, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 2147483647, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + 2147483647, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32OverMaxFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 2147483648L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + 2147483648L, + validationMetadata + ) )); } @Test public void testInt64UnderMinFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("-9223372036854775809"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + new BigInteger("-9223372036854775809"), + validationMetadata + ) )); } @Test public void testInt64InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -9223372036854775808L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + -9223372036854775808L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt64InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 9223372036854775807L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + 9223372036854775807L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt64OverMaxFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("9223372036854775808"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + new BigInteger("9223372036854775808"), + validationMetadata + ) )); } @Test public void testFloatUnderMinFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + -3.402823466385289e+38d, + validationMetadata + ) )); } @Test public void testFloatInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + -3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testFloatInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + 3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testFloatOverMaxFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + 3.402823466385289e+38d, + validationMetadata + ) )); } @Test public void testDoubleUnderMinFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("-1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + new BigDecimal("-1.7976931348623157082e+308"), + validationMetadata + ) )); } @Test public void testDoubleInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + -1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testDoubleInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + 1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testDoubleOverMaxFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + new BigDecimal("1.7976931348623157082e+308"), + validationMetadata + ) )); } @Test public void testInvalidNumberStringFails() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidFloatNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "3.14", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "3.14", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testValidIntNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "1", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "1", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInvalidDateStringFails() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidDateStringSucceeds() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-01-20", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateJsonSchema.getInstance(), + "2017-01-20", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInvalidDateTimeStringFails() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateTimeJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidDateTimeStringSucceeds() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-07-21T17:32:28Z", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateTimeJsonSchema.getInstance(), + "2017-07-21T17:32:28Z", + validationMetadata + ) ); 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 f9c539091f3..b16a91e3919 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 @@ -5,14 +5,15 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.ListJsonSchema; import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class ItemsValidatorTest { @SuppressWarnings("nullness") @@ -20,6 +21,31 @@ private void assertNull(@Nullable Object object) { Assert.assertNull(object); } + public static class ArrayWithItemsSchema extends JsonSchema { + public ArrayWithItemsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(List.class)) + .items(StringJsonSchema.class) + ); + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof List listArg) { + return getNewInstance(listArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof List listArg) { + return validate(listArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @Test public void testCorrectItemsSucceeds() { List pathToItem = List.of("args[0]"); @@ -32,14 +58,13 @@ public void testCorrectItemsSucceeds() { List mutableList = new ArrayList<>(); mutableList.add("a"); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -64,14 +89,13 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @@ -88,14 +112,13 @@ public void testIncorrectItemFails() { List mutableList = new ArrayList<>(); mutableList.add(1); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + arg, + validationMetadata + ) )); } -} +} \ 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/PropertiesValidatorTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidatorTest.java index ea58d090f1f..9431d06708f 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 @@ -5,7 +5,7 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.MapJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.StringJsonSchema; import org.openapijsonschematools.client.exceptions.ValidationException; @@ -14,8 +14,37 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class PropertiesValidatorTest { + public static class ObjectWithPropsSchema extends JsonSchema { + private ObjectWithPropsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someString", StringJsonSchema.class) + )) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -23,10 +52,7 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -38,12 +64,11 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -60,10 +85,7 @@ public void testCorrectPropertySucceeds() { @Test public void testNotApplicableTypeReturnsNull() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -72,22 +94,18 @@ public void testNotApplicableTypeReturnsNull() { new LinkedHashSet<>() ); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testIncorrectPropertyValueFails() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -99,12 +117,11 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", 1); FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + arg, + validationMetadata + ) )); } } \ 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 2c26d7c7954..d2264b9a967 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 @@ -5,16 +5,42 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.MapJsonSchema; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class RequiredValidatorTest { + public static class ObjectWithRequiredSchema extends JsonSchema { + private ObjectWithRequiredSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .required(Set.of("someString")) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -22,9 +48,6 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -35,23 +58,19 @@ public void testCorrectPropertySucceeds() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + arg, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testNotApplicableTypeReturnsNull() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -59,23 +78,19 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testIncorrectPropertyFails() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -86,14 +101,13 @@ public void testIncorrectPropertyFails() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("aDifferentProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + arg, + validationMetadata + ) )); } } \ 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 48433e51455..78a48b6374f 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 @@ -19,9 +19,7 @@ private void assertNull(@Nullable Object object) { @Test public void testValidateSucceeds() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -29,21 +27,18 @@ public void testValidateSucceeds() { new LinkedHashSet<>() ); @Nullable PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "hi", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "hi", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testValidateFailsIntIsNotString() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -51,12 +46,11 @@ public void testValidateFailsIntIsNotString() { new LinkedHashSet<>() ); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + 1, + validationMetadata + ) )); } } \ 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 eaed21fc5cf..17d35aacbd5 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -749,6 +749,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMe src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java +src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java src/main/java/org/openapijsonschematools/client/servers/Server0.java src/main/java/org/openapijsonschematools/client/servers/Server1.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/AdditionalPropertiesValidator.java index fd6fa6a4d29..2548452a115 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 @@ -8,22 +8,15 @@ import java.util.Set; public class AdditionalPropertiesValidator implements KeywordValidator { - public final Class additionalProperties; - - public AdditionalPropertiesValidator(Class additionalProperties) { - this.additionalProperties = additionalProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var additionalProperties = data.schema().additionalProperties; + if (additionalProperties == null) { return null; } Set presentAdditionalProperties = new LinkedHashSet<>(); @@ -32,22 +25,23 @@ public AdditionalPropertiesValidator(Class additionalPrope presentAdditionalProperties.add((String) key); } } - if (schema.properties != null) { - presentAdditionalProperties.removeAll(schema.properties.keySet()); + var properties = data.schema().properties; + if (properties != null) { + presentAdditionalProperties.removeAll(properties.keySet()); } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(String addPropName: presentAdditionalProperties) { @Nullable Object propValue = mapArg.get(addPropName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(addPropName); - if (patternPropertiesPathToSchemas != null && patternPropertiesPathToSchemas.containsKey(propPathToItem)) { + if (data.patternPropertiesPathToSchemas() != null && data.patternPropertiesPathToSchemas().containsKey(propPathToItem)) { continue; } ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema addPropsSchema = JsonSchemaFactory.getInstance(additionalProperties); if (propValidationMetadata.validationRanEarlier(addPropsSchema)) { 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 313e2d97446..583017ea6b5 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 @@ -1,32 +1,21 @@ package org.openapijsonschematools.client.schemas.validation; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class AllOfValidator implements KeywordValidator { - public final List> allOf; - - public AllOfValidator(List> allOf) { - this.allOf = allOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var allOf = data.schema().allOf; + if (allOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); for(Class allOfClass: allOf) { JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(allOfSchema, data.arg(), data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } - - } 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 a4754dda464..062fa2eecdc 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 @@ -7,25 +7,18 @@ import java.util.List; public class AnyOfValidator implements KeywordValidator { - public final List> anyOf; - - public AnyOfValidator(List> anyOf) { - this.anyOf = anyOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var anyOf = data.schema().anyOf; + if (anyOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedAnyOfClasses = new ArrayList<>(); for(Class anyOfClass: anyOf) { - if (anyOfClass == schema.getClass()) { + if (anyOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke _validate on it because that is recursive @@ -35,7 +28,7 @@ public AnyOfValidator(List> anyOf) { } try { JsonSchema anyOfSchema = JsonSchemaFactory.getInstance(anyOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(anyOfSchema, data.arg(), data.validationMetadata()); validatedAnyOfClasses.add(anyOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,7 +36,7 @@ public AnyOfValidator(List> anyOf) { } } if (validatedAnyOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the anyOf schemas matched the input data." ); } 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 f797c68ab2e..6409a23e5ca 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 @@ -4,27 +4,19 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Objects; public class ConstValidator extends BigDecimalValidator implements KeywordValidator { - public final @Nullable Object constValue; - - public ConstValidator(@Nullable Object constValue) { - this.constValue = constValue; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); + if (!data.schema().constValueSet) { + return null; + } + var constValue = data.schema().constValue; + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); if (Objects.equals(castArg, constValue)) { return null; } @@ -32,10 +24,10 @@ public ConstValidator(@Nullable Object constValue) { return null; } } else { - if (Objects.equals(arg, constValue)) { + if (Objects.equals(data.arg(), constValue)) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not equal to const "+constValue); + throw new ValidationException("Invalid value "+data.arg()+" was not equal to const "+constValue); } -} +} \ No newline at end of file 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 deaa878d5af..fbfd1c9c700 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 @@ -3,32 +3,21 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.exceptions.ValidationException; -import java.util.ArrayList; import java.util.List; public class ContainsValidator implements KeywordValidator { - public final Class contains; - - public ContainsValidator(Class contains) { - this.contains = contains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + if (!(data.arg() instanceof List)) { return null; } + var containsPathToSchemas = data.containsPathToSchemas(); if (containsPathToSchemas == null || containsPathToSchemas.isEmpty()) { throw new ValidationException( - "Validation failed for contains keyword in class="+schema.getClass() - + " at pathToItem="+validationMetadata.pathToItem()+". No " + "Validation failed for contains keyword in class="+data.schema().getClass() + + " at pathToItem="+data.validationMetadata().pathToItem()+". No " + "items validated to the contains schema." ); } @@ -38,42 +27,4 @@ public ContainsValidator(Class contains) { } return pathToSchemas; } - - public List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - if (!(arg instanceof List)) { - return new ArrayList<>(); - } - @Nullable List containsPathToSchemas = new ArrayList<>(); - int i = 0; - for(Object itemValue: (List) arg) { - PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); - itemPathToItem.add(i); - ValidationMetadata itemValidationMetadata = new ValidationMetadata( - itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() - ); - JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); - if (itemValidationMetadata.validationRanEarlier(containsSchema)) { - // todo add_deeper_validated_schemas - containsPathToSchemas.add(thesePathToSchemas); - i += 1; - continue; - } - - try { - PathToSchemasMap otherPathToSchemas = JsonSchema.validate( - containsSchema, itemValue, itemValidationMetadata); - containsPathToSchemas.add(otherPathToSchemas); - } catch (ValidationException ignored) { - ; - } - } - return containsPathToSchemas; - } } \ No newline at end of file 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 a5e92887928..77b21ca801d 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 @@ -4,35 +4,27 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; public class DependentRequiredValidator implements KeywordValidator { - public final Map> dependentRequired; - - public DependentRequiredValidator(Map> dependentRequired) { - this.dependentRequired = dependentRequired; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var dependentRequired = data.schema().dependentRequired; + if (dependentRequired == null) { return null; } for (Map.Entry> entry: dependentRequired.entrySet()) { - if (!((Map) arg).containsKey(entry.getKey())) { + if (!mapArg.containsKey(entry.getKey())) { continue; } Set missingKeys = new HashSet<>(entry.getValue()); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { missingKeys.remove(key); } @@ -42,7 +34,7 @@ public DependentRequiredValidator(Map> dependentRequired) { } throw new ValidationException( "Validation failed for dependentRequired because these_keys="+missingKeys+" are "+ - "missing at pathToItem="+validationMetadata.pathToItem()+" in class "+schema.getClass() + "missing at pathToItem="+data.validationMetadata().pathToItem()+" in class "+data.schema().getClass() ); } 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 0ffa3b351ca..940157d3b48 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 @@ -2,29 +2,20 @@ import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Set; public class DependentSchemasValidator implements KeywordValidator { - public final Map> dependentSchemas; - - public DependentSchemasValidator(Map> dependentSchemas) { - this.dependentSchemas = dependentSchemas; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + if (!(data.arg() instanceof Map mapArg)) { + return null; + } + var dependentSchemas = data.schema().dependentSchemas; + if (dependentSchemas == null) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -41,10 +32,9 @@ public DependentSchemasValidator(Map> depend } Class dependentSchemaClass = entry.getValue(); JsonSchema dependentSchema = JsonSchemaFactory.getInstance(dependentSchemaClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(dependentSchema, mapArg, data.validationMetadata()); pathToSchemas.update(otherPathToSchemas); } return pathToSchemas; } } - 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 6cc9459e1a8..8af756619bd 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 @@ -4,36 +4,28 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.math.BigDecimal; -import java.util.List; import java.util.Set; public class EnumValidator extends BigDecimalValidator implements KeywordValidator { - public final Set<@Nullable Object> enumValues; - - public EnumValidator(Set<@Nullable Object> enumValues) { - this.enumValues = enumValues; - } - @SuppressWarnings("nullness") - private boolean enumContainsArg(@Nullable Object arg){ + private static boolean enumContainsArg(Set<@Nullable Object> enumValues, @Nullable Object arg){ return enumValues.contains(arg); } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var enumValues = data.schema().enumValues; + if (enumValues == null) { + return null; + } if (enumValues.isEmpty()) { throw new ValidationException("No value can match enum because enum is empty"); } - if (arg instanceof Number) { - BigDecimal castArg = getBigDecimal((Number) arg); - if (enumContainsArg(castArg)) { + if (data.arg() instanceof Number numberArg) { + BigDecimal castArg = getBigDecimal(numberArg); + if (enumContainsArg(enumValues, castArg)) { return null; } for (Object enumValue: enumValues) { @@ -42,10 +34,10 @@ private boolean enumContainsArg(@Nullable Object arg){ } } } else { - if (enumContainsArg(arg)) { + if (enumContainsArg(enumValues, data.arg())) { return null; } } - throw new ValidationException("Invalid value "+arg+" was not one of the allowed enum "+enumValues); + throw new ValidationException("Invalid value "+data.arg()+" was not one of the allowed enum "+enumValues); } } 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 432d5b0f4de..7d05ff65546 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMaximumValidator implements KeywordValidator { - public final Number exclusiveMaximum; - - public ExclusiveMaximumValidator(Number exclusiveMaximum) { - this.exclusiveMaximum = exclusiveMaximum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var exclusiveMaximum = data.schema().exclusiveMaximum; + if (exclusiveMaximum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMaximum.intValue()) > -1) { + String msg = "Value " + data.arg() + " is invalid because it is >= the exclusiveMaximum of " + exclusiveMaximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMaximum.intValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMaximum.longValue()) > -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMaximum.longValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMaximum.floatValue()) > -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMaximum.floatValue()) > -1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMaximum.doubleValue()) > -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMaximum.doubleValue()) > -1) { throw new ValidationException(msg); } 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 d60c96f8325..73eb1e547c3 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class ExclusiveMinimumValidator implements KeywordValidator { - public final Number exclusiveMinimum; - - public ExclusiveMinimumValidator(Number exclusiveMinimum) { - this.exclusiveMinimum = exclusiveMinimum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var exclusiveMinimum = data.schema().exclusiveMinimum; + if (exclusiveMinimum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(exclusiveMinimum.intValue()) < 1) { + String msg = "Value " + data.arg() + " is invalid because it is <= the exclusiveMinimum of " + exclusiveMinimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(exclusiveMinimum.intValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(exclusiveMinimum.longValue()) < 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(exclusiveMinimum.longValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(exclusiveMinimum.floatValue()) < 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(exclusiveMinimum.floatValue()) < 1) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(exclusiveMinimum.doubleValue()) < 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(exclusiveMinimum.doubleValue()) < 1) { throw new ValidationException(msg); } 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 d782f2ce4a2..c1ca45e44f3 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 @@ -6,16 +6,9 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.format.DateTimeParseException; -import java.util.List; import java.util.UUID; public class FormatValidator implements KeywordValidator { - public final String format; - - public FormatValidator(String format) { - this.format = format; - } - private final static BigInteger int32InclusiveMinimum = BigInteger.valueOf(-2147483648L); private final static BigInteger int32InclusiveMaximum = BigInteger.valueOf(2147483647L); private final static BigInteger int64InclusiveMinimum = BigInteger.valueOf(-9223372036854775808L); @@ -25,12 +18,12 @@ public FormatValidator(String format) { private final static BigDecimal doubleInclusiveMinimum = BigDecimal.valueOf(-1.7976931348623157E+308d); private final static BigDecimal doubleInclusiveMaximum = BigDecimal.valueOf(1.7976931348623157E+308d); - private Void validateNumericFormat(Number arg, ValidationMetadata validationMetadata) { + private static void validateNumericFormat(Number arg, ValidationMetadata validationMetadata, String format) { if (format.startsWith("int")) { // there is a json schema test where 1.0 validates as an integer BigInteger intArg; if (arg instanceof Float || arg instanceof Double) { - Double doubleArg; + double doubleArg; if (arg instanceof Float) { doubleArg = arg.doubleValue(); } else { @@ -60,20 +53,17 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value " + arg + " for format int32 at " + validationMetadata.pathToItem() ); } - return null; } else if (format.equals("int64")) { if (intArg.compareTo(int64InclusiveMinimum) < 0 || intArg.compareTo(int64InclusiveMaximum) > 0) { throw new ValidationException( "Invalid value " + arg + " for format int64 at " + validationMetadata.pathToItem() ); } - return null; } - return null; } else if (format.equals("float") || format.equals("double")) { BigDecimal decimalArg; if (arg instanceof Float) { - decimalArg = new BigDecimal((Float) arg); + decimalArg = BigDecimal.valueOf(arg.doubleValue()); } else if (arg instanceof Double) { decimalArg = BigDecimal.valueOf((Double) arg); } else { @@ -85,83 +75,81 @@ private Void validateNumericFormat(Number arg, ValidationMetadata validationMeta "Invalid value "+arg+" for format float at "+validationMetadata.pathToItem() ); } - return null; - } else if (format.equals("double")) { + } else { if (decimalArg.compareTo(doubleInclusiveMinimum) < 0 || decimalArg.compareTo(doubleInclusiveMaximum) > 0 ){ throw new ValidationException( "Invalid value "+arg+" for format double at "+validationMetadata.pathToItem() ); } - return null; } } - return null; } - private Void validateStringFormat(String arg, ValidationMetadata validationMetadata) { - if (format.equals("uuid")) { - try { - UUID.fromString(arg); - } catch (IllegalArgumentException e) { - throw new ValidationException( - "Value cannot be converted to a UUID. Invalid value "+ - arg+" for format uuid at "+validationMetadata.pathToItem() - ); + private static void validateStringFormat(String arg, ValidationMetadata validationMetadata, String format) { + switch (format) { + case "uuid" -> { + try { + UUID.fromString(arg); + } catch (IllegalArgumentException e) { + throw new ValidationException( + "Value cannot be converted to a UUID. Invalid value " + + arg + " for format uuid at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("number")) { - try { - new BigDecimal(arg); - } catch (NumberFormatException e) { - throw new ValidationException( - "Value cannot be converted to a decimal. Invalid value "+ - arg+" for format number at "+validationMetadata.pathToItem() - ); + case "number" -> { + try { + new BigDecimal(arg); + } catch (NumberFormatException e) { + throw new ValidationException( + "Value cannot be converted to a decimal. Invalid value " + + arg + " for format number at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date")) { - try { - new CustomIsoparser().parseIsodate(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 date format. "+ - "Invalid value "+arg+" for format date at "+validationMetadata.pathToItem() - ); + case "date" -> { + try { + new CustomIsoparser().parseIsodate(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 date format. " + + "Invalid value " + arg + " for format date at " + validationMetadata.pathToItem() + ); + } } - return null; - } else if (format.equals("date-time")) { - try { - new CustomIsoparser().parseIsodatetime(arg); - } catch (DateTimeParseException e) { - throw new ValidationException( - "Value does not conform to the required ISO-8601 datetime format. "+ - "Invalid value "+arg+" for format datetime at "+validationMetadata.pathToItem() - ); + case "date-time" -> { + try { + new CustomIsoparser().parseIsodatetime(arg); + } catch (DateTimeParseException e) { + throw new ValidationException( + "Value does not conform to the required ISO-8601 datetime format. " + + "Invalid value " + arg + " for format datetime at " + validationMetadata.pathToItem() + ); + } } - return null; } - return null; } @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (arg instanceof Number) { + var format = data.schema().format; + if (format == null) { + return null; + } + if (data.arg() instanceof Number numberArg) { validateNumericFormat( - (Number) arg, - validationMetadata + numberArg, + data.validationMetadata(), + format ); return null; - } else if (arg instanceof String) { + } else if (data.arg() instanceof String stringArg) { validateStringFormat( - (String) arg, - validationMetadata + stringArg, + data.validationMetadata(), + format ); return null; } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java index e1634bd1b00..b145ab8007a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/IfValidator.java @@ -1,33 +1,18 @@ package org.openapijsonschematools.client.schemas.validation; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class IfValidator implements KeywordValidator { - public final Class ifSchema; - - public IfValidator(Class ifSchema) { - this.ifSchema = ifSchema; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (ifPathToSchemas == null) { + var ifSchema = data.schema().ifSchema; + if (ifSchema == null) { + return null; + } + if (data.ifPathToSchemas() == null) { throw new ValidationException("Invalid type for ifPathToSchemas"); } /* @@ -40,17 +25,4 @@ public IfValidator(Class ifSchema) { */ return null; } - - public PathToSchemasMap getIfPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); - PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - try { - var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); - pathToSchemas.update(otherPathToSchemas); - } catch (ValidationException | InvalidTypeException ignored) {} - return pathToSchemas; - } } 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 5d146ab250c..5bd194d47a9 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 @@ -6,38 +6,31 @@ import java.util.List; public class ItemsValidator implements KeywordValidator { - public final Class items; - - public ItemsValidator(Class items) { - this.items = items; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + var items = data.schema().items; + if (items == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); - int minIndex = schema.prefixItems != null ? schema.prefixItems.size() : 0; + int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0; JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items); for(int i = minIndex; i < listArg.size(); i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); if (itemValidationMetadata.validationRanEarlier(itemsSchema)) { // todo add_deeper_validated_schemas 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 551c586665c..db33a080218 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 @@ -50,10 +50,10 @@ public abstract class JsonSchema { public final @Nullable Integer maxContains; public final @Nullable Integer minContains; public final @Nullable Class propertyNames; - public @Nullable Map> dependentRequired; + public final @Nullable Map> dependentRequired; public final @Nullable Map> dependentSchemas; - public @Nullable Map> patternProperties; - public @Nullable List> prefixItems; + public final @Nullable Map> patternProperties; + public final @Nullable List> prefixItems; public final @Nullable Class ifSchema; private final LinkedHashMap keywordToValidator; @@ -61,244 +61,142 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { LinkedHashMap keywordToValidator = new LinkedHashMap<>(); this.type = jsonSchemaInfo.type; if (this.type != null) { - keywordToValidator.put( - "type", - new TypeValidator(this.type) - ); + keywordToValidator.put("type", new TypeValidator()); } this.format = jsonSchemaInfo.format; if (this.format != null) { - keywordToValidator.put( - "format", - new FormatValidator(this.format) - ); + keywordToValidator.put("format", new FormatValidator()); } this.items = jsonSchemaInfo.items; if (this.items != null) { - keywordToValidator.put( - "items", - new ItemsValidator(this.items) - ); + keywordToValidator.put("items", new ItemsValidator()); } this.properties = jsonSchemaInfo.properties; if (this.properties != null) { - keywordToValidator.put( - "properties", - new PropertiesValidator(this.properties) - ); + keywordToValidator.put("properties", new PropertiesValidator()); } this.required = jsonSchemaInfo.required; if (this.required != null) { - keywordToValidator.put( - "required", - new RequiredValidator(this.required) - ); + keywordToValidator.put("required", new RequiredValidator()); } this.exclusiveMaximum = jsonSchemaInfo.exclusiveMaximum; if (this.exclusiveMaximum != null) { - keywordToValidator.put( - "exclusiveMaximum", - new ExclusiveMaximumValidator(this.exclusiveMaximum) - ); + keywordToValidator.put("exclusiveMaximum", new ExclusiveMaximumValidator()); } this.exclusiveMinimum = jsonSchemaInfo.exclusiveMinimum; if (this.exclusiveMinimum != null) { - keywordToValidator.put( - "exclusiveMinimum", - new ExclusiveMinimumValidator(this.exclusiveMinimum) - ); + keywordToValidator.put("exclusiveMinimum", new ExclusiveMinimumValidator()); } this.maxItems = jsonSchemaInfo.maxItems; if (this.maxItems != null) { - keywordToValidator.put( - "maxItems", - new MaxItemsValidator(this.maxItems) - ); + keywordToValidator.put("maxItems", new MaxItemsValidator()); } this.minItems = jsonSchemaInfo.minItems; if (this.minItems != null) { - keywordToValidator.put( - "minItems", - new MinItemsValidator(this.minItems) - ); + keywordToValidator.put("minItems", new MinItemsValidator()); } this.maxLength = jsonSchemaInfo.maxLength; if (this.maxLength != null) { - keywordToValidator.put( - "maxLength", - new MaxLengthValidator(this.maxLength) - ); + keywordToValidator.put("maxLength", new MaxLengthValidator()); } this.minLength = jsonSchemaInfo.minLength; if (this.minLength != null) { - keywordToValidator.put( - "minLength", - new MinLengthValidator(this.minLength) - ); + keywordToValidator.put("minLength", new MinLengthValidator()); } this.maxProperties = jsonSchemaInfo.maxProperties; if (this.maxProperties != null) { - keywordToValidator.put( - "maxProperties", - new MaxPropertiesValidator(this.maxProperties) - ); + keywordToValidator.put("maxProperties", new MaxPropertiesValidator()); } this.minProperties = jsonSchemaInfo.minProperties; if (this.minProperties != null) { - keywordToValidator.put( - "minProperties", - new MinPropertiesValidator(this.minProperties) - ); + keywordToValidator.put("minProperties", new MinPropertiesValidator()); } this.maximum = jsonSchemaInfo.maximum; if (this.maximum != null) { - keywordToValidator.put( - "maximum", - new MaximumValidator(this.maximum) - ); + keywordToValidator.put("maximum", new MaximumValidator()); } this.minimum = jsonSchemaInfo.minimum; if (this.minimum != null) { - keywordToValidator.put( - "minimum", - new MinimumValidator(this.minimum) - ); + keywordToValidator.put("minimum", new MinimumValidator()); } this.multipleOf = jsonSchemaInfo.multipleOf; if (this.multipleOf != null) { - keywordToValidator.put( - "multipleOf", - new MultipleOfValidator(this.multipleOf) - ); + keywordToValidator.put("multipleOf", new MultipleOfValidator()); } this.additionalProperties = jsonSchemaInfo.additionalProperties; if (this.additionalProperties != null) { - keywordToValidator.put( - "additionalProperties", - new AdditionalPropertiesValidator(this.additionalProperties) - ); + keywordToValidator.put("additionalProperties", new AdditionalPropertiesValidator()); } this.allOf = jsonSchemaInfo.allOf; if (this.allOf != null) { - keywordToValidator.put( - "allOf", - new AllOfValidator(this.allOf) - ); + keywordToValidator.put("allOf", new AllOfValidator()); } this.anyOf = jsonSchemaInfo.anyOf; if (this.anyOf != null) { - keywordToValidator.put( - "anyOf", - new AnyOfValidator(this.anyOf) - ); + keywordToValidator.put("anyOf", new AnyOfValidator()); } this.oneOf = jsonSchemaInfo.oneOf; if (this.oneOf != null) { - keywordToValidator.put( - "oneOf", - new OneOfValidator(this.oneOf) - ); + keywordToValidator.put("oneOf", new OneOfValidator()); } this.not = jsonSchemaInfo.not; if (this.not != null) { - keywordToValidator.put( - "not", - new NotValidator(this.not) - ); + keywordToValidator.put("not", new NotValidator()); } this.uniqueItems = jsonSchemaInfo.uniqueItems; if (this.uniqueItems != null) { - keywordToValidator.put( - "uniqueItems", - new UniqueItemsValidator(this.uniqueItems) - ); + keywordToValidator.put("uniqueItems", new UniqueItemsValidator()); } this.enumValues = jsonSchemaInfo.enumValues; if (this.enumValues != null) { - keywordToValidator.put( - "enum", - new EnumValidator(this.enumValues) - ); + keywordToValidator.put("enum", new EnumValidator()); } this.pattern = jsonSchemaInfo.pattern; if (this.pattern != null) { - keywordToValidator.put( - "pattern", - new PatternValidator(this.pattern) - ); + keywordToValidator.put("pattern", new PatternValidator()); } this.defaultValue = jsonSchemaInfo.defaultValue; this.defaultValueSet = jsonSchemaInfo.defaultValueSet; this.constValue = jsonSchemaInfo.constValue; this.constValueSet = jsonSchemaInfo.constValueSet; if (this.constValueSet) { - keywordToValidator.put( - "const", - new ConstValidator(this.constValue) - ); + keywordToValidator.put("const", new ConstValidator()); } this.contains = jsonSchemaInfo.contains; if (this.contains != null) { - keywordToValidator.put( - "contains", - new ContainsValidator(this.contains) - ); + keywordToValidator.put("contains", new ContainsValidator()); } this.maxContains = jsonSchemaInfo.maxContains; if (this.maxContains != null) { - keywordToValidator.put( - "maxContains", - new MaxContainsValidator(this.maxContains) - ); + keywordToValidator.put("maxContains", new MaxContainsValidator()); } this.minContains = jsonSchemaInfo.minContains; if (this.minContains != null) { - keywordToValidator.put( - "minContains", - new MinContainsValidator(this.minContains) - ); + keywordToValidator.put("minContains", new MinContainsValidator()); } this.propertyNames = jsonSchemaInfo.propertyNames; if (this.propertyNames != null) { - keywordToValidator.put( - "propertyNames", - new PropertyNamesValidator(this.propertyNames) - ); + keywordToValidator.put("propertyNames", new PropertyNamesValidator()); } this.dependentRequired = jsonSchemaInfo.dependentRequired; if (this.dependentRequired != null) { - keywordToValidator.put( - "dependentRequired", - new DependentRequiredValidator(this.dependentRequired) - ); + keywordToValidator.put("dependentRequired", new DependentRequiredValidator()); } this.dependentSchemas = jsonSchemaInfo.dependentSchemas; if (this.dependentSchemas != null) { - keywordToValidator.put( - "dependentSchemas", - new DependentSchemasValidator(this.dependentSchemas) - ); + keywordToValidator.put("dependentSchemas", new DependentSchemasValidator()); } this.patternProperties = jsonSchemaInfo.patternProperties; if (this.patternProperties != null) { - keywordToValidator.put( - "patternProperties", - new PatternPropertiesValidator(this.patternProperties) - ); + keywordToValidator.put("patternProperties", new PatternPropertiesValidator()); } this.prefixItems = jsonSchemaInfo.prefixItems; if (this.prefixItems != null) { - keywordToValidator.put( - "prefixItems", - new PrefixItemsValidator(this.prefixItems) - ); + keywordToValidator.put("prefixItems", new PrefixItemsValidator()); } this.ifSchema = jsonSchemaInfo.ifSchema; if (this.ifSchema != null) { - keywordToValidator.put( - "if", - new IfValidator(this.ifSchema) - ); + keywordToValidator.put("if", new IfValidator()); } this.keywordToValidator = keywordToValidator; } @@ -306,6 +204,93 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) { public abstract @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException; public abstract @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException; + private List getContainsPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof List listArg) || contains == null) { + return new ArrayList<>(); + } + JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains); + @Nullable List containsPathToSchemas = new ArrayList<>(); + int i = 0; + for(Object itemValue: listArg) { + PathToSchemasMap thesePathToSchemas = new PathToSchemasMap(); + List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + itemPathToItem.add(i); + ValidationMetadata itemValidationMetadata = new ValidationMetadata( + itemPathToItem, + validationMetadata.configuration(), + validationMetadata.validatedPathToSchemas(), + validationMetadata.seenClasses() + ); + if (itemValidationMetadata.validationRanEarlier(containsSchema)) { + // todo add_deeper_validated_schemas + containsPathToSchemas.add(thesePathToSchemas); + i += 1; + continue; + } + + try { + PathToSchemasMap otherPathToSchemas = JsonSchema.validate( + containsSchema, itemValue, itemValidationMetadata); + containsPathToSchemas.add(otherPathToSchemas); + } catch (ValidationException ignored) {} + } + return containsPathToSchemas; + } + + private PathToSchemasMap getPatternPropertiesPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (!(arg instanceof Map mapArg) || patternProperties == null) { + 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; + } + + private PathToSchemasMap getIfPathToSchemas( + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + if (ifSchema == null) { + return new PathToSchemasMap(); + } + JsonSchema ifSchemaInstance = JsonSchemaFactory.getInstance(ifSchema); + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + try { + var otherPathToSchemas = JsonSchema.validate(ifSchemaInstance, arg, validationMetadata); + pathToSchemas.update(otherPathToSchemas); + } catch (ValidationException | InvalidTypeException ignored) {} + return pathToSchemas; + } + public static PathToSchemasMap validate( JsonSchema jsonSchema, @Nullable Object arg, @@ -315,19 +300,16 @@ public static PathToSchemasMap validate( PathToSchemasMap pathToSchemas = new PathToSchemasMap(); LinkedHashMap thisKeywordToValidator = jsonSchema.keywordToValidator; @Nullable List containsPathToSchemas = null; - KeywordValidator containsValidator = thisKeywordToValidator.get("contains"); - if (containsValidator != null) { - containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("contains")) { + containsPathToSchemas = jsonSchema.getContainsPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap patternPropertiesPathToSchemas = null; - KeywordValidator patternPropertiesValidator = thisKeywordToValidator.get("patternProperties"); - if (patternPropertiesValidator != null) { - patternPropertiesPathToSchemas = patternPropertiesValidator.getPatternPropertiesPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("patternProperties")) { + patternPropertiesPathToSchemas = jsonSchema.getPatternPropertiesPathToSchemas(arg, validationMetadata); } @Nullable PathToSchemasMap ifPathToSchemas = null; - KeywordValidator ifValidator = thisKeywordToValidator.get("if"); - if (ifValidator != null) { - ifPathToSchemas = ifValidator.getIfPathToSchemas(arg, validationMetadata); + if (thisKeywordToValidator.containsKey("if")) { + ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata); } for (Map.Entry entry: thisKeywordToValidator.entrySet()) { String jsonKeyword = entry.getKey(); @@ -338,7 +320,7 @@ public static PathToSchemasMap validate( } } KeywordValidator validator = entry.getValue(); - @Nullable PathToSchemasMap otherPathToSchemas = validator.validate( + ValidationData data = new ValidationData( jsonSchema, arg, validationMetadata, @@ -346,6 +328,7 @@ public static PathToSchemasMap validate( patternPropertiesPathToSchemas, ifPathToSchemas ); + @Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data); if (otherPathToSchemas == null) { continue; } @@ -401,10 +384,9 @@ protected List castToAllowedTypes(List arg, List pathToItem, Set argFixed = new LinkedHashMap<>(); for (Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { + if (!(entryKey instanceof String key)) { throw new InvalidTypeException("Invalid non-string key value"); } - String key = (String) entryKey; Object val = entry.getValue(); List newPathToItem = new ArrayList<>(pathToItem); newPathToItem.add(key); 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 41b4b85eb2e..8a2bd782505 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 @@ -3,37 +3,9 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.List; - +@FunctionalInterface public interface KeywordValidator { @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) throws ValidationException; - - default List getContainsPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new ArrayList<>(); - } - - default PathToSchemasMap getPatternPropertiesPathToSchemas( - @Nullable Object arg, - ValidationMetadata validationMetadata - ) { - return new PathToSchemasMap(); - } - - default PathToSchemasMap getIfPathToSchemas( - @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 25482139fab..9e9b3b92c18 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 @@ -6,31 +6,25 @@ import java.util.List; public class MaxContainsValidator implements KeywordValidator { - public final int maxContains; - - public MaxContainsValidator(int maxContains) { - this.maxContains = maxContains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var maxContains = data.schema().maxContains; + if (maxContains == null) { + return null; + } + if (!(data.arg() instanceof List)) { return null; } + var containsPathToSchemas = data.containsPathToSchemas(); if (containsPathToSchemas == null) { return null; } if (containsPathToSchemas.size() > maxContains) { throw new ValidationException( - "Validation failed for maxContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too many items validated to the contains schema." + "Validation failed for maxContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too many items validated to the contains schema." ); } 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 bda6fb43ece..98ed5cb4ff4 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 @@ -6,26 +6,19 @@ import java.util.List; public class MaxItemsValidator implements KeywordValidator { - public final int maxItems; - - public MaxItemsValidator(int maxItems) { - this.maxItems = maxItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var maxItems = data.schema().maxItems; + if (maxItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() > maxItems) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxItems of " + maxItems); + if (listArg.size() > maxItems) { + throw new ValidationException("Value " + listArg + " is invalid because has > the maxItems of " + maxItems); } 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 1a78623e0f4..08d91666c5d 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 @@ -3,30 +3,21 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaxLengthValidator extends LengthValidator implements KeywordValidator { - public final int maxLength; - - public MaxLengthValidator(int maxLength) { - this.maxLength = maxLength; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var maxLength = data.schema().maxLength; + if (maxLength == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length > maxLength) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxLength of " + maxLength); + throw new ValidationException("Value " + stringArg + " is invalid because has > the maxLength of " + maxLength); } 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 5928ec588ac..d117f1688e2 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 @@ -3,30 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MaxPropertiesValidator implements KeywordValidator { - public final int maxProperties; - - public MaxPropertiesValidator(int maxProperties) { - this.maxProperties = maxProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var maxProperties = data.schema().maxProperties; + if (maxProperties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() > maxProperties) { - throw new ValidationException("Value " + arg + " is invalid because has > the maxProperties of " + maxProperties); + if (mapArg.size() > maxProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has > the maxProperties of " + maxProperties); } 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 25faceb4022..702f09686dc 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 @@ -3,52 +3,43 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MaximumValidator implements KeywordValidator { - public final Number maximum; - - public MaximumValidator(Number maximum) { - this.maximum = maximum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var maximum = data.schema().maximum; + if (maximum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is > the maximum of " + maximum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(maximum.intValue()) == 1) { + String msg = "Value " + data.arg() + " is invalid because it is > the maximum of " + maximum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(maximum.intValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(maximum.longValue()) == 1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(maximum.longValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(maximum.floatValue()) == 1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(maximum.floatValue()) > 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(maximum.doubleValue()) == 1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(maximum.doubleValue()) > 0) { throw new ValidationException(msg); } return null; } return null; } -} +} \ No newline at end of file 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 2f34127155e..1827e95cc83 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 @@ -6,31 +6,24 @@ import java.util.List; public class MinContainsValidator implements KeywordValidator { - public final int minContains; - - public MinContainsValidator(int minContains) { - this.minContains = minContains; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var minContains = data.schema().minContains; + if (minContains == null) { + return null; + } + if (!(data.arg() instanceof List)) { return null; } - if (containsPathToSchemas == null) { + if (data.containsPathToSchemas() == null) { return null; } - if (containsPathToSchemas.size() < minContains) { + if (data.containsPathToSchemas().size() < minContains) { throw new ValidationException( - "Validation failed for minContains keyword in class="+schema.getClass()+ - " at pathToItem="+validationMetadata.pathToItem()+". Too few items validated to the contains schema." + "Validation failed for minContains keyword in class="+data.schema().getClass()+ + " at pathToItem="+data.validationMetadata().pathToItem()+". Too few items validated to the contains schema." ); } 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 7c46cbe8f94..d1933ca7750 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 @@ -6,26 +6,19 @@ import java.util.List; public class MinItemsValidator implements KeywordValidator { - public final int minItems; - - public MinItemsValidator(int minItems) { - this.minItems = minItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var minItems = data.schema().minItems; + if (minItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } - if (((List) arg).size() < minItems) { - throw new ValidationException("Value " + arg + " is invalid because has < the minItems of " + minItems); + if (listArg.size() < minItems) { + throw new ValidationException("Value " + listArg + " is invalid because has < the minItems of " + minItems); } 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 7c92205a9cf..1defdc891e3 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 @@ -3,31 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinLengthValidator extends LengthValidator implements KeywordValidator { - public final int minLength; - - public MinLengthValidator(int minLength) { - this.minLength = minLength; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var minLength = data.schema().minLength; + if (minLength == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - int length = getLength((String) arg); + int length = getLength(stringArg); if (length < minLength) { - throw new ValidationException("Value " + arg + " is invalid because has < the minLength of " + minLength); + throw new ValidationException("Value " + stringArg + " is invalid because has < the minLength of " + minLength); } return null; } -} +} \ No newline at end of file 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 c52b16000d8..c0b99e7fb7d 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 @@ -3,30 +3,22 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.util.Map; public class MinPropertiesValidator implements KeywordValidator { - public final int minProperties; - - public MinPropertiesValidator(int minProperties) { - this.minProperties = minProperties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var minProperties = data.schema().minProperties; + if (minProperties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } - if (((Map) arg).size() < minProperties) { - throw new ValidationException("Value " + arg + " is invalid because has < the minProperties of " + minProperties); + if (mapArg.size() < minProperties) { + throw new ValidationException("Value " + mapArg + " is invalid because has < the minProperties of " + minProperties); } 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 dec192d47df..3b539120e42 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 @@ -3,48 +3,39 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; - public class MinimumValidator implements KeywordValidator { - public final Number minimum; - - public MinimumValidator(Number minimum) { - this.minimum = minimum; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var minimum = data.schema().minimum; + if (minimum == null) { + return null; + } + if (!(data.arg() instanceof Number)) { return null; } - String msg = "Value " + arg + " is invalid because it is < the minimum of " + minimum; - if (arg instanceof Integer) { - if (((Integer) arg).compareTo(minimum.intValue()) == -1) { + String msg = "Value " + data.arg() + " is invalid because it is < the minimum of " + minimum; + if (data.arg() instanceof Integer intArg) { + if (intArg.compareTo(minimum.intValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Long) { - if (((Long) arg).compareTo(minimum.longValue()) == -1) { + if (data.arg() instanceof Long longArg) { + if (longArg.compareTo(minimum.longValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Float) { - if (((Float) arg).compareTo(minimum.floatValue()) == -1) { + if (data.arg() instanceof Float floatArg) { + if (floatArg.compareTo(minimum.floatValue()) < 0) { throw new ValidationException(msg); } return null; } - if (arg instanceof Double) { - if (((Double) arg).compareTo(minimum.doubleValue()) == -1) { + if (data.arg() instanceof Double doubleArg) { + if (doubleArg.compareTo(minimum.doubleValue()) < 0) { throw new ValidationException(msg); } 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 15230b54275..eebc07a0f10 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 @@ -3,33 +3,25 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; import java.math.BigDecimal; public class MultipleOfValidator extends BigDecimalValidator implements KeywordValidator { - public final BigDecimal multipleOf; - - public MultipleOfValidator(BigDecimal multipleOf) { - this.multipleOf = multipleOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Number)) { + var multipleOf = data.schema().multipleOf; + if (multipleOf == null) { + return null; + } + if (!(data.arg() instanceof Number numberArg)) { return null; } - BigDecimal castArg = getBigDecimal((Number) arg); - String msg = "Value " + arg + " is invalid because it is not a multiple of " + multipleOf; + BigDecimal castArg = getBigDecimal(numberArg); + String msg = "Value " + numberArg + " is invalid because it is not a multiple of " + multipleOf; if (castArg.remainder(multipleOf).compareTo(BigDecimal.ZERO) != 0) { throw new ValidationException(msg); } return null; } -} +} \ No newline at end of file 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 507c7f40fbc..aa61be1b624 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 @@ -3,39 +3,25 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - public class NotValidator implements KeywordValidator { - public final Class not; - - public NotValidator(Class not) { - this.not = not; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var not = data.schema().not; + if (not == null) { + return null; + } PathToSchemasMap pathToSchemas; try { JsonSchema notSchema = JsonSchemaFactory.getInstance(not); - pathToSchemas = JsonSchema.validate(notSchema, arg, validationMetadata); + pathToSchemas = JsonSchema.validate(notSchema, data.arg(), data.validationMetadata()); } catch (ValidationException e) { return null; } if (!pathToSchemas.isEmpty()) { throw new ValidationException( - "Invalid value "+arg+" was passed in to "+schema.getClass()+". "+ + "Invalid value "+data.arg()+" was passed in to "+data.schema().getClass()+". "+ "Value is invalid because it is disallowed by not "+not ); } 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 5bc4bbd297b..f84f7796a8c 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 @@ -7,25 +7,18 @@ import java.util.List; public class OneOfValidator implements KeywordValidator { - public final List> oneOf; - - public OneOfValidator(List> oneOf) { - this.oneOf = oneOf; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var oneOf = data.schema().oneOf; + if (oneOf == null) { + return null; + } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); List> validatedOneOfClasses = new ArrayList<>(); for(Class oneOfClass: oneOf) { - if (oneOfClass == schema.getClass()) { + if (oneOfClass == data.schema().getClass()) { /* optimistically assume that schema will pass validation do not invoke validate on it because that is recursive @@ -35,7 +28,7 @@ public OneOfValidator(List> oneOf) { } try { JsonSchema oneOfSchema = JsonSchemaFactory.getInstance(oneOfClass); - PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, arg, validationMetadata); + PathToSchemasMap otherPathToSchemas = JsonSchema.validate(oneOfSchema, data.arg(), data.validationMetadata()); validatedOneOfClasses.add(oneOfClass); pathToSchemas.update(otherPathToSchemas); } catch (ValidationException e) { @@ -43,12 +36,12 @@ public OneOfValidator(List> oneOf) { } } if (validatedOneOfClasses.isEmpty()) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". None "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". None "+ "of the oneOf schemas matched the input data." ); } if (validatedOneOfClasses.size() > 1) { - throw new ValidationException("Invalid inputs given to generate an instance of "+schema.getClass()+". Multiple "+ + throw new ValidationException("Invalid inputs given to generate an instance of "+data.schema().getClass()+". Multiple "+ "oneOf schemas validated the data, but a max of one is allowed." ); } 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 index 6104329139f..9e951e23ed2 100644 --- 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 @@ -1,68 +1,21 @@ 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, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var patternProperties = data.schema().patternProperties; + if (patternProperties == null) { 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); - } + if (!(data.arg() instanceof Map)) { + return null; } - return pathToSchemas; + return data.patternPropertiesPathToSchemas(); } } - 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 37e7a545711..eceeb19e311 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 @@ -3,31 +3,21 @@ import org.openapijsonschematools.client.exceptions.ValidationException; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.List; -import java.util.regex.Pattern; - public class PatternValidator implements KeywordValidator { - public final Pattern pattern; - - public PatternValidator(Pattern pattern) { - this.pattern = pattern; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof String)) { + var pattern = data.schema().pattern; + if (pattern == null) { + return null; + } + if (!(data.arg() instanceof String stringArg)) { return null; } - if (!pattern.matcher((String) arg).find()) { - throw new ValidationException("Invalid value "+arg+" did not find a match for pattern "+pattern); + if (!pattern.matcher(stringArg).find()) { + throw new ValidationException("Invalid value "+stringArg+" did not find a match for pattern "+pattern); } return null; } -} +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java index a8b2bda2a21..00e5b17607b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java @@ -6,22 +6,15 @@ import java.util.List; public class PrefixItemsValidator implements KeywordValidator { - public final List> prefixItems; - - public PrefixItemsValidator(List> prefixItems) { - this.prefixItems = prefixItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List listArg)) { + var prefixItems = data.schema().prefixItems; + if (prefixItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (listArg.isEmpty()) { @@ -30,13 +23,13 @@ public PrefixItemsValidator(List> prefixItems) { PathToSchemasMap pathToSchemas = new PathToSchemasMap(); int maxIndex = Math.min(listArg.size(), prefixItems.size()); for (int i=0; i < maxIndex; i++) { - List itemPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); itemPathToItem.add(i); ValidationMetadata itemValidationMetadata = new ValidationMetadata( itemPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema itemsSchema = JsonSchemaFactory.getInstance(prefixItems.get(i)); PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata); 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 9b7d50b28d8..17bccdd666a 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 @@ -9,22 +9,15 @@ import java.util.Set; public class PropertiesValidator implements KeywordValidator { - public final Map> properties; - - public PropertiesValidator(Map> properties) { - this.properties = properties; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map mapArg)) { + var properties = data.schema().properties; + if (properties == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } PathToSchemasMap pathToSchemas = new PathToSchemasMap(); @@ -39,14 +32,14 @@ public PropertiesValidator(Map> properties) if (!presentProperties.contains(propName)) { continue; } - @Nullable Object propValue = ((Map) arg).get(propName); - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + @Nullable Object propValue = mapArg.get(propName); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(propName); ValidationMetadata propValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); Class propClass = entry.getValue(); JsonSchema propSchema = JsonSchemaFactory.getInstance(propClass); @@ -60,4 +53,3 @@ public PropertiesValidator(Map> properties) return pathToSchemas; } } - 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 5154911d484..55ea80b0382 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 @@ -7,34 +7,27 @@ import java.util.Map; public class PropertyNamesValidator implements KeywordValidator { - public final Class propertyNames; - - public PropertyNamesValidator(Class propertyNames) { - this.propertyNames = propertyNames; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var propertyNames = data.schema().propertyNames; + if (propertyNames == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } JsonSchema propertyNamesSchema = JsonSchemaFactory.getInstance(propertyNames); - for (Object objKey: ((Map) arg).keySet()) { + for (Object objKey: mapArg.keySet()) { if (objKey instanceof String key) { - List propPathToItem = new ArrayList<>(validationMetadata.pathToItem()); + List propPathToItem = new ArrayList<>(data.validationMetadata().pathToItem()); propPathToItem.add(key); ValidationMetadata keyValidationMetadata = new ValidationMetadata( propPathToItem, - validationMetadata.configuration(), - validationMetadata.validatedPathToSchemas(), - validationMetadata.seenClasses() + data.validationMetadata().configuration(), + data.validationMetadata().validatedPathToSchemas(), + data.validationMetadata().seenClasses() ); JsonSchema.validate(propertyNamesSchema, key, keyValidationMetadata); } 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 f68aef2b87a..f2e1a8ecde8 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 @@ -9,26 +9,19 @@ import java.util.Set; public class RequiredValidator implements KeywordValidator { - public final Set required; - - public RequiredValidator(Set required) { - this.required = required; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof Map)) { + var required = data.schema().required; + if (required == null) { + return null; + } + if (!(data.arg() instanceof Map mapArg)) { return null; } Set missingRequiredProperties = new HashSet<>(required); - for (Object key: ((Map) arg).keySet()) { + for (Object key: mapArg.keySet()) { if (key instanceof String) { missingRequiredProperties.remove(key); } @@ -40,7 +33,7 @@ public RequiredValidator(Set required) { pluralChar = "s"; } throw new ValidationException( - schema.getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps + data.schema().getClass()+" is missing "+missingRequiredProperties.size()+" required argument"+pluralChar+": "+missingReqProps ); } 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 f1fcd9d5cdd..bb4133a770e 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 @@ -5,25 +5,18 @@ import java.util.List; import java.util.Map; -import java.util.Set; public class TypeValidator implements KeywordValidator { - public final Set> type; - - public TypeValidator(Set> type) { - this.type = type; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { + var type = data.schema().type; + if (type == null) { + return null; + } Class argClass; + var arg = data.arg(); if (arg == null) { argClass = Void.class; } else if (arg instanceof List) { 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 4cdbbe01060..a42a7d60b60 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 @@ -8,29 +8,22 @@ import java.util.Set; public class UniqueItemsValidator implements KeywordValidator { - public final boolean uniqueItems; - - public UniqueItemsValidator(boolean uniqueItems) { - this.uniqueItems = uniqueItems; - } - @Override public @Nullable PathToSchemasMap validate( - JsonSchema schema, - @Nullable Object arg, - ValidationMetadata validationMetadata, - @Nullable List containsPathToSchemas, - @Nullable PathToSchemasMap patternPropertiesPathToSchemas, - @Nullable PathToSchemasMap ifPathToSchemas + ValidationData data ) { - if (!(arg instanceof List)) { + var uniqueItems = data.schema().uniqueItems; + if (uniqueItems == null) { + return null; + } + if (!(data.arg() instanceof List listArg)) { return null; } if (!uniqueItems) { return null; } Set<@Nullable Object> seenItems = new HashSet<>(); - for (@Nullable Object item: (List) arg) { + for (@Nullable Object item: listArg) { int startingSeenItemsSize = seenItems.size(); seenItems.add(item); if (seenItems.size() == startingSeenItemsSize) { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java new file mode 100644 index 00000000000..55cb65fe9ef --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java @@ -0,0 +1,22 @@ +package org.openapijsonschematools.client.schemas.validation; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; + +public record ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata, + @Nullable List containsPathToSchemas, + @Nullable PathToSchemasMap patternPropertiesPathToSchemas, + @Nullable PathToSchemasMap ifPathToSchemas +) { + public ValidationData( + JsonSchema schema, + @Nullable Object arg, + ValidationMetadata validationMetadata + ) { + this(schema, arg, validationMetadata, null, null, null); + } +} \ No newline at end of file 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 7e6d7d09535..f98e0a7d529 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 @@ -26,6 +26,7 @@ private ObjectWithPropsSchema() { .properties(Map.ofEntries( new PropertyEntry("someString", StringJsonSchema.class) )) + .additionalProperties(StringJsonSchema.class) ); } @@ -73,14 +74,13 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", "def"); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -105,14 +105,13 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + MapJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @@ -130,14 +129,13 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", "abc"); mutableMap.put("someAddProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(StringJsonSchema.class); + final AdditionalPropertiesValidator validator = new AdditionalPropertiesValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ObjectWithPropsSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + ObjectWithPropsSchema.getInstance(), + arg, + validationMetadata + ) )); } } \ 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 87a6bafc05f..db31df87dd9 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 @@ -6,8 +6,14 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.NumberJsonSchema; -import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.IntJsonSchema; +import org.openapijsonschematools.client.schemas.Int32JsonSchema; +import org.openapijsonschematools.client.schemas.Int64JsonSchema; +import org.openapijsonschematools.client.schemas.FloatJsonSchema; +import org.openapijsonschematools.client.schemas.DoubleJsonSchema; +import org.openapijsonschematools.client.schemas.DecimalJsonSchema; +import org.openapijsonschematools.client.schemas.DateJsonSchema; +import org.openapijsonschematools.client.schemas.DateTimeJsonSchema; import java.math.BigDecimal; import java.math.BigInteger; @@ -29,354 +35,328 @@ private void assertNull(@Nullable Object object) { @Test public void testIntFormatSucceedsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.0f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 1.0f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testIntFormatFailsWithFloat() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.14f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 3.14f, + validationMetadata + ) )); } @Test public void testIntFormatSucceedsWithInt() { - final FormatValidator validator = new FormatValidator("int"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + IntJsonSchema.getInstance(), + 1, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32UnderMinFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -2147483649L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + -2147483649L, + validationMetadata + ) )); } @Test public void testInt32InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -2147483648, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + -2147483648, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 2147483647, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + 2147483647, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt32OverMaxFails() { - final FormatValidator validator = new FormatValidator("int32"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 2147483648L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int32JsonSchema.getInstance(), + 2147483648L, + validationMetadata + ) )); } @Test public void testInt64UnderMinFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("-9223372036854775809"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + new BigInteger("-9223372036854775809"), + validationMetadata + ) )); } @Test public void testInt64InclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -9223372036854775808L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + -9223372036854775808L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt64InclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 9223372036854775807L, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + 9223372036854775807L, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInt64OverMaxFails() { - final FormatValidator validator = new FormatValidator("int64"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigInteger("9223372036854775808"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + Int64JsonSchema.getInstance(), + new BigInteger("9223372036854775808"), + validationMetadata + ) )); } @Test public void testFloatUnderMinFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - -3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + -3.402823466385289e+38d, + validationMetadata + ) )); } @Test public void testFloatInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + -3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testFloatInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 3.4028234663852886e+38f, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + 3.4028234663852886e+38f, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testFloatOverMaxFails() { - final FormatValidator validator = new FormatValidator("float"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - 3.402823466385289e+38d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + FloatJsonSchema.getInstance(), + 3.402823466385289e+38d, + validationMetadata + ) )); } @Test public void testDoubleUnderMinFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("-1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + new BigDecimal("-1.7976931348623157082e+308"), + validationMetadata + ) )); } @Test public void testDoubleInclusiveMinSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - -1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + -1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testDoubleInclusiveMaxSucceeds() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - 1.7976931348623157E+308d, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + 1.7976931348623157E+308d, + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testDoubleOverMaxFails() { - final FormatValidator validator = new FormatValidator("double"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - new BigDecimal("1.7976931348623157082e+308"), - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DoubleJsonSchema.getInstance(), + new BigDecimal("1.7976931348623157082e+308"), + validationMetadata + ) )); } @Test public void testInvalidNumberStringFails() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - NumberJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidFloatNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "3.14", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "3.14", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testValidIntNumberStringSucceeds() { - final FormatValidator validator = new FormatValidator("number"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - NumberJsonSchema.getInstance(), - "1", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DecimalJsonSchema.getInstance(), + "1", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInvalidDateStringFails() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidDateStringSucceeds() { - final FormatValidator validator = new FormatValidator("date"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-01-20", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateJsonSchema.getInstance(), + "2017-01-20", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testInvalidDateTimeStringFails() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - "abc", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateTimeJsonSchema.getInstance(), + "abc", + validationMetadata + ) )); } @Test public void testValidDateTimeStringSucceeds() { - final FormatValidator validator = new FormatValidator("date-time"); + final FormatValidator validator = new FormatValidator(); PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "2017-07-21T17:32:28Z", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + DateTimeJsonSchema.getInstance(), + "2017-07-21T17:32:28Z", + validationMetadata + ) ); 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 f9c539091f3..b16a91e3919 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 @@ -5,14 +5,15 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.ListJsonSchema; import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class ItemsValidatorTest { @SuppressWarnings("nullness") @@ -20,6 +21,31 @@ private void assertNull(@Nullable Object object) { Assert.assertNull(object); } + public static class ArrayWithItemsSchema extends JsonSchema { + public ArrayWithItemsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(List.class)) + .items(StringJsonSchema.class) + ); + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof List listArg) { + return getNewInstance(listArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof List listArg) { + return validate(listArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @Test public void testCorrectItemsSucceeds() { List pathToItem = List.of("args[0]"); @@ -32,14 +58,13 @@ public void testCorrectItemsSucceeds() { List mutableList = new ArrayList<>(); mutableList.add("a"); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value in pathToSchemas for this test case"); @@ -64,14 +89,13 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); PathToSchemasMap pathToSchemas = validator.validate( - ListJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @@ -88,14 +112,13 @@ public void testIncorrectItemFails() { List mutableList = new ArrayList<>(); mutableList.add(1); FrozenList arg = new FrozenList<>(mutableList); - final ItemsValidator validator = new ItemsValidator(StringJsonSchema.class); + final ItemsValidator validator = new ItemsValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - ListJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ArrayWithItemsSchema(), + arg, + validationMetadata + ) )); } -} +} \ No newline at end of file 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 ea58d090f1f..9431d06708f 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 @@ -5,7 +5,7 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.schemas.MapJsonSchema; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.StringJsonSchema; import org.openapijsonschematools.client.exceptions.ValidationException; @@ -14,8 +14,37 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class PropertiesValidatorTest { + public static class ObjectWithPropsSchema extends JsonSchema { + private ObjectWithPropsSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someString", StringJsonSchema.class) + )) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -23,10 +52,7 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -38,12 +64,11 @@ public void testCorrectPropertySucceeds() { mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + arg, + validationMetadata + ) ); if (pathToSchemas == null) { throw new RuntimeException("Invalid null value for pathToSchemas for this test case"); @@ -60,10 +85,7 @@ public void testCorrectPropertySucceeds() { @Test public void testNotApplicableTypeReturnsNull() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -72,22 +94,18 @@ public void testNotApplicableTypeReturnsNull() { new LinkedHashSet<>() ); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testIncorrectPropertyValueFails() { - Map> properties = new LinkedHashMap<>(); - properties.put("someString", StringJsonSchema.class); - - final PropertiesValidator validator = new PropertiesValidator(properties); + final PropertiesValidator validator = new PropertiesValidator(); List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -99,12 +117,11 @@ public void testIncorrectPropertyValueFails() { mutableMap.put("someString", 1); FrozenMap arg = new FrozenMap<>(mutableMap); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithPropsSchema(), + arg, + validationMetadata + ) )); } } \ 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 2c26d7c7954..d2264b9a967 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 @@ -5,16 +5,42 @@ import org.junit.Test; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.MapJsonSchema; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class RequiredValidatorTest { + public static class ObjectWithRequiredSchema extends JsonSchema { + private ObjectWithRequiredSchema() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .required(Set.of("someString")) + ); + + } + + @Override + public Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) { + if (arg instanceof Map mapArg) { + return getNewInstance(mapArg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws InvalidTypeException, ValidationException { + if (arg instanceof Map mapArg) { + return validate(mapArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + @SuppressWarnings("nullness") private void assertNull(@Nullable Object object) { Assert.assertNull(object); @@ -22,9 +48,6 @@ private void assertNull(@Nullable Object object) { @Test public void testCorrectPropertySucceeds() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -35,23 +58,19 @@ public void testCorrectPropertySucceeds() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("someString", "abc"); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + arg, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testNotApplicableTypeReturnsNull() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -59,23 +78,19 @@ public void testNotApplicableTypeReturnsNull() { new PathToSchemasMap(), new LinkedHashSet<>() ); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); PathToSchemasMap pathToSchemas = validator.validate( - MapJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + 1, + validationMetadata + ) ); assertNull(pathToSchemas); } @Test public void testIncorrectPropertyFails() { - Set requiredProperties = new LinkedHashSet<>(); - requiredProperties.add("someString"); - List pathToItem = List.of("args[0]"); ValidationMetadata validationMetadata = new ValidationMetadata( pathToItem, @@ -86,14 +101,13 @@ public void testIncorrectPropertyFails() { LinkedHashMap mutableMap = new LinkedHashMap<>(); mutableMap.put("aDifferentProp", 1); FrozenMap arg = new FrozenMap<>(mutableMap); - final RequiredValidator validator = new RequiredValidator(requiredProperties); + final RequiredValidator validator = new RequiredValidator(); Assert.assertThrows(ValidationException.class, () -> validator.validate( - MapJsonSchema.getInstance(), - arg, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + new ObjectWithRequiredSchema(), + arg, + validationMetadata + ) )); } } \ 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 48433e51455..78a48b6374f 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 @@ -19,9 +19,7 @@ private void assertNull(@Nullable Object object) { @Test public void testValidateSucceeds() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -29,21 +27,18 @@ public void testValidateSucceeds() { new LinkedHashSet<>() ); @Nullable PathToSchemasMap pathToSchemasMap = validator.validate( - StringJsonSchema.getInstance(), - "hi", - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + "hi", + validationMetadata + ) ); assertNull(pathToSchemasMap); } @Test public void testValidateFailsIntIsNotString() { - LinkedHashSet> type = new LinkedHashSet<>(); - type.add(String.class); - final TypeValidator validator = new TypeValidator(type); + final TypeValidator validator = new TypeValidator(); ValidationMetadata validationMetadata = new ValidationMetadata( new ArrayList<>(), new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), @@ -51,12 +46,11 @@ public void testValidateFailsIntIsNotString() { new LinkedHashSet<>() ); Assert.assertThrows(ValidationException.class, () -> validator.validate( - StringJsonSchema.getInstance(), - 1, - validationMetadata, - new ArrayList<>(), - new PathToSchemasMap(), - new PathToSchemasMap() + new ValidationData( + StringJsonSchema.getInstance(), + 1, + validationMetadata + ) )); } } \ No newline at end of file