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

Java, adds schema contains #360

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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|AllOf|✓|OAS2,OAS3
|AnyOf|✓|OAS3
|Const|✓|OAS3
|Contains||OAS3
|Contains||OAS3
|Default|✓|OAS2,OAS3
|DependentRequired|✗|OAS3
|DependentSchemas|✗|OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,14 +210,14 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/BooleanEnumVa
src/main/java/org/openapijsonschematools/client/schemas/validation/BooleanSchemaValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/BooleanValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ConstValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ContainsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/CustomIsoparser.java
src/main/java/org/openapijsonschematools/client/schemas/validation/DefaultValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleEnumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/DoubleValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/EnumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMaximumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ExclusiveMinimumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FakeValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FloatEnumValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FloatValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/FormatValidator.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ public AdditionalPropertiesValidator(Class<? extends JsonSchema> additionalPrope
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Map<?, ?> mapArg)) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ public AllOfValidator(List<Class<? extends JsonSchema>> allOf) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
for(Class<? extends JsonSchema> allOfClass: allOf) {
JsonSchema allOfSchema = JsonSchemaFactory.getInstance(allOfClass);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ public AnyOfValidator(List<Class<? extends JsonSchema>> anyOf) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
List<Class<? extends JsonSchema>> validatedAnyOfClasses = new ArrayList<>();
for(Class<? extends JsonSchema> anyOfClass: anyOf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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 {
Expand All @@ -14,7 +15,12 @@ public ConstValidator(@Nullable Object constValue) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (arg instanceof Number) {
BigDecimal castArg = getBigDecimal((Number) arg);
if (Objects.equals(castArg, constValue)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package org.openapijsonschematools.client.schemas.validation;

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<? extends JsonSchema> contains;

public ContainsValidator(Class<? extends JsonSchema> contains) {
this.contains = contains;
}

@Override
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
if (containsPathToSchemas.isEmpty()) {
throw new ValidationException(
"Validation failed for contains keyword in class="+schema.getClass()
+ " at pathToItem="+validationMetadata.pathToItem()+". No "
+ "items validated to the contains schema."
);
}
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
for (PathToSchemasMap otherPathToSchema: containsPathToSchemas) {
pathToSchemas.update(otherPathToSchema);
}
return pathToSchemas;
}

public List<PathToSchemasMap> getContainsPathToSchemas(
@Nullable Object arg,
ValidationMetadata validationMetadata
) {
if (!(arg instanceof List)) {
return new ArrayList<>();
}
List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
int i = 0;
for(Object itemValue: (List<?>) arg) {
PathToSchemasMap thesePathToSchemas = new PathToSchemasMap();
List<Object> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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 {
Expand All @@ -19,7 +20,12 @@ private boolean enumContainsArg(@Nullable Object arg){
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (enumValues.isEmpty()) {
throw new ValidationException("No value can match enum because enum is empty");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -12,7 +13,12 @@ public ExclusiveMaximumValidator(Number exclusiveMaximum) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -12,7 +13,12 @@ public ExclusiveMinimumValidator(Number exclusiveMinimum) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof Number)) {
return null;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
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 {
Expand Down Expand Up @@ -143,7 +144,12 @@ private Void validateStringFormat(String arg, ValidationMetadata validationMetad
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (arg instanceof Number) {
validateNumericFormat(
(Number) arg,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ public ItemsValidator(Class<? extends JsonSchema> items) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public abstract class JsonSchema {
public final boolean defaultValueSet;
public final @Nullable Object constValue;
public final boolean constValueSet;
public final @Nullable Class<? extends JsonSchema> contains;
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;

protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
Expand Down Expand Up @@ -228,6 +229,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
new ConstValidator(this.constValue)
);
}
this.contains = jsonSchemaInfo.contains;
if (this.contains != null) {
keywordToValidator.put(
"contains",
new ContainsValidator(this.contains)
);
}
this.keywordToValidator = keywordToValidator;
}

Expand All @@ -242,6 +250,11 @@ public static PathToSchemasMap validate(
LinkedHashSet<String> disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords();
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
LinkedHashMap<String, KeywordValidator> thisKeywordToValidator = jsonSchema.keywordToValidator;
List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
KeywordValidator containsValidator = thisKeywordToValidator.get("contains");
if (containsValidator != null) {
containsPathToSchemas = containsValidator.getContainsPathToSchemas(arg, validationMetadata);
}
for (Map.Entry<String, KeywordValidator> entry: thisKeywordToValidator.entrySet()) {
String jsonKeyword = entry.getKey();
if (disabledKeywords.contains(jsonKeyword)) {
Expand All @@ -254,7 +267,8 @@ public static PathToSchemasMap validate(
@Nullable PathToSchemasMap otherPathToSchemas = validator.validate(
jsonSchema,
arg,
validationMetadata
validationMetadata,
containsPathToSchemas
);
if (otherPathToSchemas == null) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,9 @@ public JsonSchemaInfo constValue(@Nullable Object constValue) {
this.constValueSet = true;
return this;
}
public @Nullable Class<? extends JsonSchema> contains = null;
public JsonSchemaInfo contains(Class<? extends JsonSchema> contains) {
this.contains = contains;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@
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(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata) throws ValidationException;
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) throws ValidationException;

default List<PathToSchemasMap> getContainsPathToSchemas(
@Nullable Object arg,
ValidationMetadata validationMetadata
) {
return new ArrayList<>();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ public MaxItemsValidator(int maxItems) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof List)) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
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;

Expand All @@ -11,7 +13,12 @@ public MaxLengthValidator(int maxLength) {
}

@Override
public @Nullable PathToSchemasMap validate(JsonSchema schema, @Nullable Object arg, ValidationMetadata validationMetadata) {
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
List<PathToSchemasMap> containsPathToSchemas
) {
if (!(arg instanceof String)) {
return null;
}
Expand Down
Loading