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

Java, adds unevaluatedItems #373

Merged
merged 2 commits into from
Jan 21, 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 @@ -312,7 +312,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|Required|✓|OAS2,OAS3
|Then|✓|OAS3
|Type|✓|OAS2,OAS3
|UnevaluatedItems||OAS3
|UnevaluatedItems||OAS3
|UnevaluatedProperties|✗|OAS3
|UniqueItems|✓|OAS2,OAS3
|Xml|✗|OAS2,OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringSchemaV
src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ThenValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/UnevaluatedItemsValidator.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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public abstract class JsonSchema {
public final @Nullable Class<? extends JsonSchema> ifSchema;
public final @Nullable Class<? extends JsonSchema> then;
public final @Nullable Class<? extends JsonSchema> elseSchema;
public final @Nullable Class<? extends JsonSchema> unevaluatedItems;
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;

protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
Expand Down Expand Up @@ -208,6 +209,10 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
if (this.elseSchema != null) {
keywordToValidator.put("else", new ElseValidator());
}
this.unevaluatedItems = jsonSchemaInfo.unevaluatedItems;
if (this.unevaluatedItems != null) {
keywordToValidator.put("unevaluatedItems", new UnevaluatedItemsValidator());
}
this.keywordToValidator = keywordToValidator;
}

Expand All @@ -223,8 +228,7 @@ private List<PathToSchemasMap> getContainsPathToSchemas(
}
JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains);
@Nullable List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
int i = 0;
for(Object itemValue: listArg) {
for(int i = 0; i < listArg.size(); i++) {
PathToSchemasMap thesePathToSchemas = new PathToSchemasMap();
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
itemPathToItem.add(i);
Expand All @@ -237,13 +241,12 @@ private List<PathToSchemasMap> getContainsPathToSchemas(
if (itemValidationMetadata.validationRanEarlier(containsSchema)) {
// todo add_deeper_validated_schemas
containsPathToSchemas.add(thesePathToSchemas);
i += 1;
continue;
}

try {
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(
containsSchema, itemValue, itemValidationMetadata);
containsSchema, listArg.get(i), itemValidationMetadata);
containsPathToSchemas.add(otherPathToSchemas);
} catch (ValidationException ignored) {}
}
Expand Down Expand Up @@ -321,6 +324,7 @@ public static PathToSchemasMap validate(
if (thisKeywordToValidator.containsKey("if")) {
ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata);
}
@Nullable PathToSchemasMap knownPathToSchemas = null;
for (Map.Entry<String, KeywordValidator> entry: thisKeywordToValidator.entrySet()) {
String jsonKeyword = entry.getKey();
if (disabledKeywords.contains(jsonKeyword)) {
Expand All @@ -329,14 +333,18 @@ public static PathToSchemasMap validate(
continue;
}
}
if ("unevaluatedItems".equals(jsonKeyword)) {
knownPathToSchemas = pathToSchemas;
}
KeywordValidator validator = entry.getValue();
ValidationData data = new ValidationData(
jsonSchema,
arg,
validationMetadata,
containsPathToSchemas,
patternPropertiesPathToSchemas,
ifPathToSchemas
ifPathToSchemas,
knownPathToSchemas
);
@Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data);
if (otherPathToSchemas == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,4 +197,9 @@ public JsonSchemaInfo elseSchema(Class<? extends JsonSchema> elseSchema) {
this.elseSchema = elseSchema;
return this;
}
public @Nullable Class<? extends JsonSchema> unevaluatedItems = null;
public JsonSchemaInfo unevaluatedItems(Class<? extends JsonSchema> unevaluatedItems) {
this.unevaluatedItems = unevaluatedItems;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.openapijsonschematools.client.schemas.validation;

import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.ArrayList;
import java.util.List;

public class UnevaluatedItemsValidator implements KeywordValidator {
@Override
public @Nullable PathToSchemasMap validate(
ValidationData data
) {
var unevaluatedItems = data.schema().unevaluatedItems;
if (unevaluatedItems == null) {
return null;
}
var knownPathToSchemas = data.knownPathToSchemas();
if (knownPathToSchemas == null) {
return null;
}
if (!(data.arg() instanceof List<?> listArg)) {
return null;
}
if (listArg.isEmpty()) {
return null;
}
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0;
JsonSchema unevaluatedItemsSchema = JsonSchemaFactory.getInstance(unevaluatedItems);
for(int i = minIndex; i < listArg.size(); i++) {
List<Object> itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem());
itemPathToItem.add(i);
if (knownPathToSchemas.containsKey(itemPathToItem)) {
continue;
}
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
itemPathToItem,
data.validationMetadata().configuration(),
data.validationMetadata().validatedPathToSchemas(),
data.validationMetadata().seenClasses()
);
if (itemValidationMetadata.validationRanEarlier(unevaluatedItemsSchema)) {
// todo add_deeper_validated_schemas
continue;
}
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(unevaluatedItemsSchema, listArg.get(i), itemValidationMetadata);
pathToSchemas.update(otherPathToSchemas);
}
return pathToSchemas;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ public record ValidationData(
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
@Nullable PathToSchemasMap ifPathToSchemas
@Nullable PathToSchemasMap ifPathToSchemas,
@Nullable PathToSchemasMap knownPathToSchemas
) {
public ValidationData(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata
) {
this(schema, arg, validationMetadata, null, null, null);
this(schema, arg, validationMetadata, null, null, null, null);
}
}
7 changes: 7 additions & 0 deletions samples/client/3_1_0_unit_test/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@ docs/components/schemas/TimeFormat.md
docs/components/schemas/TypeArrayObjectOrNull.md
docs/components/schemas/TypeArrayOrObject.md
docs/components/schemas/TypeAsArrayWithOneItem.md
docs/components/schemas/UnevaluateditemsAsSchema.md
docs/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.md
docs/components/schemas/UnevaluateditemsWithItems.md
docs/components/schemas/UnevaluateditemsWithNullInstanceElements.md
docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md
docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md
docs/components/schemas/UniqueitemsFalseValidation.md
Expand Down Expand Up @@ -265,7 +268,10 @@ src/main/java/org/openapijsonschematools/client/components/schemas/TimeFormat.ja
src/main/java/org/openapijsonschematools/client/components/schemas/TypeArrayObjectOrNull.java
src/main/java/org/openapijsonschematools/client/components/schemas/TypeArrayOrObject.java
src/main/java/org/openapijsonschematools/client/components/schemas/TypeAsArrayWithOneItem.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsAsSchema.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsWithItems.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsWithNullInstanceElements.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.java
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsFalseValidation.java
Expand Down Expand Up @@ -373,6 +379,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringSchemaV
src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMethod.java
src/main/java/org/openapijsonschematools/client/schemas/validation/ThenValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/UnevaluatedItemsValidator.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
Expand Down
3 changes: 3 additions & 0 deletions samples/client/3_1_0_unit_test/java/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,10 @@ allowed input and output types.
| [TypeArrayObjectOrNull.TypeArrayObjectOrNull1](docs/components/schemas/TypeArrayObjectOrNull.md#typearrayobjectornull1) | |
| [TypeArrayOrObject.TypeArrayOrObject1](docs/components/schemas/TypeArrayOrObject.md#typearrayorobject1) | |
| [TypeAsArrayWithOneItem.TypeAsArrayWithOneItem1](docs/components/schemas/TypeAsArrayWithOneItem.md#typeasarraywithoneitem1) | |
| [UnevaluateditemsAsSchema.UnevaluateditemsAsSchema1](docs/components/schemas/UnevaluateditemsAsSchema.md#unevaluateditemsasschema1) | |
| [UnevaluateditemsDependsOnMultipleNestedContains.UnevaluateditemsDependsOnMultipleNestedContains1](docs/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.md#unevaluateditemsdependsonmultiplenestedcontains1) | |
| [UnevaluateditemsWithItems.UnevaluateditemsWithItems1](docs/components/schemas/UnevaluateditemsWithItems.md#unevaluateditemswithitems1) | |
| [UnevaluateditemsWithNullInstanceElements.UnevaluateditemsWithNullInstanceElements1](docs/components/schemas/UnevaluateditemsWithNullInstanceElements.md#unevaluateditemswithnullinstanceelements1) | |
| [UnevaluatedpropertiesWithAdjacentAdditionalproperties.UnevaluatedpropertiesWithAdjacentAdditionalproperties1](docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md#unevaluatedpropertieswithadjacentadditionalproperties1) | |
| [UnevaluatedpropertiesWithNullValuedInstanceProperties.UnevaluatedpropertiesWithNullValuedInstanceProperties1](docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md#unevaluatedpropertieswithnullvaluedinstanceproperties1) | |
| [UniqueitemsFalseValidation.UniqueitemsFalseValidation1](docs/components/schemas/UniqueitemsFalseValidation.md#uniqueitemsfalsevalidation1) | |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# UnevaluateditemsAsSchema
org.openapijsonschematools.client.components.schemas.UnevaluateditemsAsSchema.java
public class UnevaluateditemsAsSchema

A class that contains necessary nested
- schema classes (which validate payloads), extends JsonSchema

## Nested Class Summary
| Modifier and Type | Class and Description |
| ----------------- | ---------------------- |
| static class | [UnevaluateditemsAsSchema.UnevaluateditemsAsSchema1](#unevaluateditemsasschema1)<br> schema class |
| static class | [UnevaluateditemsAsSchema.UnevaluatedItems](#unevaluateditems)<br> schema class |

## UnevaluateditemsAsSchema1
public static class UnevaluateditemsAsSchema1<br>
extends JsonSchema

A schema class that validates payloads

### Field Summary
| Modifier and Type | Field and Description |
| ----------------- | ---------------------- |
| Class<? extends JsonSchema> | unevaluatedItems = [UnevaluatedItems.class](#unevaluateditems) |

### Method Summary
| Modifier and Type | Method and Description |
| ----------------- | ---------------------- |
| String | validate(String arg, SchemaConfiguration configuration) |
| Void | validate(Void arg, SchemaConfiguration configuration) |
| int | validate(int arg, SchemaConfiguration configuration) |
| long | validate(long arg, SchemaConfiguration configuration) |
| float | validate(float arg, SchemaConfiguration configuration) |
| double | validate(double arg, SchemaConfiguration configuration) |
| boolean | validate(boolean arg, SchemaConfiguration configuration) |
| FrozenMap<String, @Nullable Object> | validate(Map&lt;?, ?&gt; arg, SchemaConfiguration configuration) |
| FrozenList<@Nullable Object> | validate(List<?> arg, SchemaConfiguration configuration) |
| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) |
## UnevaluatedItems
public static class UnevaluatedItems<br>
extends StringJsonSchema

A schema class that validates payloads

| Methods Inherited from class org.openapijsonschematools.client.schemas.StringJsonSchema |
| ------------------------------------------------------------------ |
| validate |

[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)
Loading