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

Commit 2b6abab

Browse files
authored
Java, adds unevaluatedItems (#373)
* Adds unevaluatedItems handling * Samples regen
1 parent 536a837 commit 2b6abab

File tree

39 files changed

+2517
-39
lines changed

39 files changed

+2517
-39
lines changed

docs/generators/java.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
312312
|Required|✓|OAS2,OAS3
313313
|Then|✓|OAS3
314314
|Type|✓|OAS2,OAS3
315-
|UnevaluatedItems||OAS3
315+
|UnevaluatedItems||OAS3
316316
|UnevaluatedProperties|✗|OAS3
317317
|UniqueItems|✓|OAS2,OAS3
318318
|Xml|✗|OAS2,OAS3

samples/client/3_0_3_unit_test/java/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringSchemaV
271271
src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMethod.java
272272
src/main/java/org/openapijsonschematools/client/schemas/validation/ThenValidator.java
273273
src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java
274+
src/main/java/org/openapijsonschematools/client/schemas/validation/UnevaluatedItemsValidator.java
274275
src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java
275276
src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java
276277
src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchema.java

+13-5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public abstract class JsonSchema {
5757
public final @Nullable Class<? extends JsonSchema> ifSchema;
5858
public final @Nullable Class<? extends JsonSchema> then;
5959
public final @Nullable Class<? extends JsonSchema> elseSchema;
60+
public final @Nullable Class<? extends JsonSchema> unevaluatedItems;
6061
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;
6162

6263
protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
@@ -208,6 +209,10 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
208209
if (this.elseSchema != null) {
209210
keywordToValidator.put("else", new ElseValidator());
210211
}
212+
this.unevaluatedItems = jsonSchemaInfo.unevaluatedItems;
213+
if (this.unevaluatedItems != null) {
214+
keywordToValidator.put("unevaluatedItems", new UnevaluatedItemsValidator());
215+
}
211216
this.keywordToValidator = keywordToValidator;
212217
}
213218

@@ -223,8 +228,7 @@ private List<PathToSchemasMap> getContainsPathToSchemas(
223228
}
224229
JsonSchema containsSchema = JsonSchemaFactory.getInstance(contains);
225230
@Nullable List<PathToSchemasMap> containsPathToSchemas = new ArrayList<>();
226-
int i = 0;
227-
for(Object itemValue: listArg) {
231+
for(int i = 0; i < listArg.size(); i++) {
228232
PathToSchemasMap thesePathToSchemas = new PathToSchemasMap();
229233
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
230234
itemPathToItem.add(i);
@@ -237,13 +241,12 @@ private List<PathToSchemasMap> getContainsPathToSchemas(
237241
if (itemValidationMetadata.validationRanEarlier(containsSchema)) {
238242
// todo add_deeper_validated_schemas
239243
containsPathToSchemas.add(thesePathToSchemas);
240-
i += 1;
241244
continue;
242245
}
243246

244247
try {
245248
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(
246-
containsSchema, itemValue, itemValidationMetadata);
249+
containsSchema, listArg.get(i), itemValidationMetadata);
247250
containsPathToSchemas.add(otherPathToSchemas);
248251
} catch (ValidationException ignored) {}
249252
}
@@ -321,6 +324,7 @@ public static PathToSchemasMap validate(
321324
if (thisKeywordToValidator.containsKey("if")) {
322325
ifPathToSchemas = jsonSchema.getIfPathToSchemas(arg, validationMetadata);
323326
}
327+
@Nullable PathToSchemasMap knownPathToSchemas = null;
324328
for (Map.Entry<String, KeywordValidator> entry: thisKeywordToValidator.entrySet()) {
325329
String jsonKeyword = entry.getKey();
326330
if (disabledKeywords.contains(jsonKeyword)) {
@@ -329,14 +333,18 @@ public static PathToSchemasMap validate(
329333
continue;
330334
}
331335
}
336+
if ("unevaluatedItems".equals(jsonKeyword)) {
337+
knownPathToSchemas = pathToSchemas;
338+
}
332339
KeywordValidator validator = entry.getValue();
333340
ValidationData data = new ValidationData(
334341
jsonSchema,
335342
arg,
336343
validationMetadata,
337344
containsPathToSchemas,
338345
patternPropertiesPathToSchemas,
339-
ifPathToSchemas
346+
ifPathToSchemas,
347+
knownPathToSchemas
340348
);
341349
@Nullable PathToSchemasMap otherPathToSchemas = validator.validate(data);
342350
if (otherPathToSchemas == null) {

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/JsonSchemaInfo.java

+5
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,9 @@ public JsonSchemaInfo elseSchema(Class<? extends JsonSchema> elseSchema) {
197197
this.elseSchema = elseSchema;
198198
return this;
199199
}
200+
public @Nullable Class<? extends JsonSchema> unevaluatedItems = null;
201+
public JsonSchemaInfo unevaluatedItems(Class<? extends JsonSchema> unevaluatedItems) {
202+
this.unevaluatedItems = unevaluatedItems;
203+
return this;
204+
}
200205
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.openapijsonschematools.client.schemas.validation;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class UnevaluatedItemsValidator implements KeywordValidator {
9+
@Override
10+
public @Nullable PathToSchemasMap validate(
11+
ValidationData data
12+
) {
13+
var unevaluatedItems = data.schema().unevaluatedItems;
14+
if (unevaluatedItems == null) {
15+
return null;
16+
}
17+
var knownPathToSchemas = data.knownPathToSchemas();
18+
if (knownPathToSchemas == null) {
19+
return null;
20+
}
21+
if (!(data.arg() instanceof List<?> listArg)) {
22+
return null;
23+
}
24+
if (listArg.isEmpty()) {
25+
return null;
26+
}
27+
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
28+
int minIndex = data.schema().prefixItems != null ? data.schema().prefixItems.size() : 0;
29+
JsonSchema unevaluatedItemsSchema = JsonSchemaFactory.getInstance(unevaluatedItems);
30+
for(int i = minIndex; i < listArg.size(); i++) {
31+
List<Object> itemPathToItem = new ArrayList<>(data.validationMetadata().pathToItem());
32+
itemPathToItem.add(i);
33+
if (knownPathToSchemas.containsKey(itemPathToItem)) {
34+
continue;
35+
}
36+
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
37+
itemPathToItem,
38+
data.validationMetadata().configuration(),
39+
data.validationMetadata().validatedPathToSchemas(),
40+
data.validationMetadata().seenClasses()
41+
);
42+
if (itemValidationMetadata.validationRanEarlier(unevaluatedItemsSchema)) {
43+
// todo add_deeper_validated_schemas
44+
continue;
45+
}
46+
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(unevaluatedItemsSchema, listArg.get(i), itemValidationMetadata);
47+
pathToSchemas.update(otherPathToSchemas);
48+
}
49+
return pathToSchemas;
50+
}
51+
}

samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ public record ValidationData(
1010
ValidationMetadata validationMetadata,
1111
@Nullable List<PathToSchemasMap> containsPathToSchemas,
1212
@Nullable PathToSchemasMap patternPropertiesPathToSchemas,
13-
@Nullable PathToSchemasMap ifPathToSchemas
13+
@Nullable PathToSchemasMap ifPathToSchemas,
14+
@Nullable PathToSchemasMap knownPathToSchemas
1415
) {
1516
public ValidationData(
1617
JsonSchema schema,
1718
@Nullable Object arg,
1819
ValidationMetadata validationMetadata
1920
) {
20-
this(schema, arg, validationMetadata, null, null, null);
21+
this(schema, arg, validationMetadata, null, null, null, null);
2122
}
2223
}

samples/client/3_1_0_unit_test/java/.openapi-generator/FILES

+7
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ docs/components/schemas/TimeFormat.md
125125
docs/components/schemas/TypeArrayObjectOrNull.md
126126
docs/components/schemas/TypeArrayOrObject.md
127127
docs/components/schemas/TypeAsArrayWithOneItem.md
128+
docs/components/schemas/UnevaluateditemsAsSchema.md
129+
docs/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.md
128130
docs/components/schemas/UnevaluateditemsWithItems.md
131+
docs/components/schemas/UnevaluateditemsWithNullInstanceElements.md
129132
docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md
130133
docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md
131134
docs/components/schemas/UniqueitemsFalseValidation.md
@@ -265,7 +268,10 @@ src/main/java/org/openapijsonschematools/client/components/schemas/TimeFormat.ja
265268
src/main/java/org/openapijsonschematools/client/components/schemas/TypeArrayObjectOrNull.java
266269
src/main/java/org/openapijsonschematools/client/components/schemas/TypeArrayOrObject.java
267270
src/main/java/org/openapijsonschematools/client/components/schemas/TypeAsArrayWithOneItem.java
271+
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsAsSchema.java
272+
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.java
268273
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsWithItems.java
274+
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluateditemsWithNullInstanceElements.java
269275
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.java
270276
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.java
271277
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsFalseValidation.java
@@ -373,6 +379,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/StringSchemaV
373379
src/main/java/org/openapijsonschematools/client/schemas/validation/StringValueMethod.java
374380
src/main/java/org/openapijsonschematools/client/schemas/validation/ThenValidator.java
375381
src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator.java
382+
src/main/java/org/openapijsonschematools/client/schemas/validation/UnevaluatedItemsValidator.java
376383
src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java
377384
src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java
378385
src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java

samples/client/3_1_0_unit_test/java/README.md

+3
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,10 @@ allowed input and output types.
283283
| [TypeArrayObjectOrNull.TypeArrayObjectOrNull1](docs/components/schemas/TypeArrayObjectOrNull.md#typearrayobjectornull1) | |
284284
| [TypeArrayOrObject.TypeArrayOrObject1](docs/components/schemas/TypeArrayOrObject.md#typearrayorobject1) | |
285285
| [TypeAsArrayWithOneItem.TypeAsArrayWithOneItem1](docs/components/schemas/TypeAsArrayWithOneItem.md#typeasarraywithoneitem1) | |
286+
| [UnevaluateditemsAsSchema.UnevaluateditemsAsSchema1](docs/components/schemas/UnevaluateditemsAsSchema.md#unevaluateditemsasschema1) | |
287+
| [UnevaluateditemsDependsOnMultipleNestedContains.UnevaluateditemsDependsOnMultipleNestedContains1](docs/components/schemas/UnevaluateditemsDependsOnMultipleNestedContains.md#unevaluateditemsdependsonmultiplenestedcontains1) | |
286288
| [UnevaluateditemsWithItems.UnevaluateditemsWithItems1](docs/components/schemas/UnevaluateditemsWithItems.md#unevaluateditemswithitems1) | |
289+
| [UnevaluateditemsWithNullInstanceElements.UnevaluateditemsWithNullInstanceElements1](docs/components/schemas/UnevaluateditemsWithNullInstanceElements.md#unevaluateditemswithnullinstanceelements1) | |
287290
| [UnevaluatedpropertiesWithAdjacentAdditionalproperties.UnevaluatedpropertiesWithAdjacentAdditionalproperties1](docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md#unevaluatedpropertieswithadjacentadditionalproperties1) | |
288291
| [UnevaluatedpropertiesWithNullValuedInstanceProperties.UnevaluatedpropertiesWithNullValuedInstanceProperties1](docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md#unevaluatedpropertieswithnullvaluedinstanceproperties1) | |
289292
| [UniqueitemsFalseValidation.UniqueitemsFalseValidation1](docs/components/schemas/UniqueitemsFalseValidation.md#uniqueitemsfalsevalidation1) | |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# UnevaluateditemsAsSchema
2+
org.openapijsonschematools.client.components.schemas.UnevaluateditemsAsSchema.java
3+
public class UnevaluateditemsAsSchema
4+
5+
A class that contains necessary nested
6+
- schema classes (which validate payloads), extends JsonSchema
7+
8+
## Nested Class Summary
9+
| Modifier and Type | Class and Description |
10+
| ----------------- | ---------------------- |
11+
| static class | [UnevaluateditemsAsSchema.UnevaluateditemsAsSchema1](#unevaluateditemsasschema1)<br> schema class |
12+
| static class | [UnevaluateditemsAsSchema.UnevaluatedItems](#unevaluateditems)<br> schema class |
13+
14+
## UnevaluateditemsAsSchema1
15+
public static class UnevaluateditemsAsSchema1<br>
16+
extends JsonSchema
17+
18+
A schema class that validates payloads
19+
20+
### Field Summary
21+
| Modifier and Type | Field and Description |
22+
| ----------------- | ---------------------- |
23+
| Class<? extends JsonSchema> | unevaluatedItems = [UnevaluatedItems.class](#unevaluateditems) |
24+
25+
### Method Summary
26+
| Modifier and Type | Method and Description |
27+
| ----------------- | ---------------------- |
28+
| String | validate(String arg, SchemaConfiguration configuration) |
29+
| Void | validate(Void arg, SchemaConfiguration configuration) |
30+
| int | validate(int arg, SchemaConfiguration configuration) |
31+
| long | validate(long arg, SchemaConfiguration configuration) |
32+
| float | validate(float arg, SchemaConfiguration configuration) |
33+
| double | validate(double arg, SchemaConfiguration configuration) |
34+
| boolean | validate(boolean arg, SchemaConfiguration configuration) |
35+
| FrozenMap<String, @Nullable Object> | validate(Map&lt;?, ?&gt; arg, SchemaConfiguration configuration) |
36+
| FrozenList<@Nullable Object> | validate(List<?> arg, SchemaConfiguration configuration) |
37+
| @Nullable Object | validate(@Nullable Object arg, SchemaConfiguration configuration) |
38+
## UnevaluatedItems
39+
public static class UnevaluatedItems<br>
40+
extends StringJsonSchema
41+
42+
A schema class that validates payloads
43+
44+
| Methods Inherited from class org.openapijsonschematools.client.schemas.StringJsonSchema |
45+
| ------------------------------------------------------------------ |
46+
| validate |
47+
48+
[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md)

0 commit comments

Comments
 (0)