From 91670f094f5584ed67be108e9dc488d3b5efcab6 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 3 Nov 2023 14:08:24 -0700 Subject: [PATCH 1/8] Requires java 17 to use records --- .../petstore/java/.openapi-generator/FILES | 1 + samples/client/petstore/java/README.md | 4 +- samples/client/petstore/java/pom.xml | 3 +- .../JsonSchemaKeywordFlags.java | 44 +++++++++++++++++++ .../generators/JavaClientGenerator.java | 10 +++++ src/main/resources/java/README.hbs | 2 +- src/main/resources/java/pom.hbs | 3 +- .../configurations/JsonSchemaKeywordFlags.hbs | 44 +++++++++++++++++++ 8 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java create mode 100644 src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 1e3d5643ddd..7c6b75308ed 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -1,4 +1,5 @@ README.md pom.xml +src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java diff --git a/samples/client/petstore/java/README.md b/samples/client/petstore/java/README.md index 2c563a97ef8..af688ca2cd9 100644 --- a/samples/client/petstore/java/README.md +++ b/samples/client/petstore/java/README.md @@ -8,12 +8,14 @@ This Java package is automatically generated by the [OpenAPI JSON Schema Generat - API version: 1.0.0 - Package version: +- Build date: 2023-11-03T14:07:31.452320-07:00[America/Los_Angeles] + - Build package: JavaClientGenerator ## Requirements -Python +Java 17 ## Migration Guides - [3.0.0 Migration Guide](migration_3_0_0.md) diff --git a/samples/client/petstore/java/pom.xml b/samples/client/petstore/java/pom.xml index 14ca5ae356b..cbb4c421108 100644 --- a/samples/client/petstore/java/pom.xml +++ b/samples/client/petstore/java/pom.xml @@ -41,8 +41,6 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 true 128m 512m @@ -281,6 +279,7 @@ + 17 UTF-8 1.6.3 1.19.4 diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java new file mode 100644 index 00000000000..596eaa7cab2 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java @@ -0,0 +1,44 @@ +package org.openapijsonschematools.configurations; + +public record JsonSchemaKeywordFlags( + boolean additionalProperties, + boolean allOf, + boolean anyOf, + boolean const_, + boolean contains, + boolean dependentRequired, + boolean dependentSchemas, + boolean discriminator, + boolean else_, + boolean enum_, + boolean exclusiveMaximum, + boolean exclusiveMinimum, + boolean format, + boolean if_, + boolean maximum, + boolean minimum, + boolean items, + boolean maxContains, + boolean maxItems, + boolean maxLength, + boolean maxProperties, + boolean minContains, + boolean minItems, + boolean minLength, + boolean minProperties, + boolean multipleOf, + boolean not, + boolean oneOf, + boolean pattern, + boolean patternProperties, + boolean prefixItems, + boolean properties, + boolean propertyNames, + boolean required, + boolean then, + boolean type, + boolean uniqueItems, + boolean unevaluatedItems, + boolean unevaluatedProperties + ) { +} \ 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 3afe4efd6f8..61136dcd8bf 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -136,6 +136,11 @@ protected Stability getStability() { return Stability.EXPERIMENTAL; } + @Override + public String generatorLanguageVersion() { + return "17"; + } + public JavaClientGenerator() { super(); @@ -265,6 +270,11 @@ public void processOpts() { testPackagePath() + File.separatorChar + "schemas", "CustomIsoparserTest.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs", + packagePath() + File.separatorChar + "configurations", + "JsonSchemaKeywordFlags.java")); + // jsonPathDocTemplateFiles.put( // CodegenConstants.JSON_PATH_LOCATION_TYPE.SCHEMA, // schemaDocs diff --git a/src/main/resources/java/README.hbs b/src/main/resources/java/README.hbs index 0a6670f1ba4..21b533de541 100644 --- a/src/main/resources/java/README.hbs +++ b/src/main/resources/java/README.hbs @@ -17,7 +17,7 @@ For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}) ## Requirements -Python {{generatorLanguageVersion}} +Java {{generatorLanguageVersion}} ## Migration Guides - [3.0.0 Migration Guide](migration_3_0_0.md) diff --git a/src/main/resources/java/pom.hbs b/src/main/resources/java/pom.hbs index e6bf5bed0bc..1e0ba83059c 100644 --- a/src/main/resources/java/pom.hbs +++ b/src/main/resources/java/pom.hbs @@ -47,8 +47,6 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 true 128m 512m @@ -316,6 +314,7 @@ + 17 UTF-8 1.6.3 1.19.4 diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs new file mode 100644 index 00000000000..c2565c25d60 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs @@ -0,0 +1,44 @@ +package {{{packageName}}}.configurations; + +public record JsonSchemaKeywordFlags( + boolean additionalProperties, + boolean allOf, + boolean anyOf, + boolean const_, + boolean contains, + boolean dependentRequired, + boolean dependentSchemas, + boolean discriminator, + boolean else_, + boolean enum_, + boolean exclusiveMaximum, + boolean exclusiveMinimum, + boolean format, + boolean if_, + boolean maximum, + boolean minimum, + boolean items, + boolean maxContains, + boolean maxItems, + boolean maxLength, + boolean maxProperties, + boolean minContains, + boolean minItems, + boolean minLength, + boolean minProperties, + boolean multipleOf, + boolean not, + boolean oneOf, + boolean pattern, + boolean patternProperties, + boolean prefixItems, + boolean properties, + boolean propertyNames, + boolean required, + boolean then, + boolean type, + boolean uniqueItems, + boolean unevaluatedItems, + boolean unevaluatedProperties + ) { +} \ No newline at end of file From aa138014943c258aa7e56d0fca1e8b71945d81ca Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 3 Nov 2023 15:17:04 -0700 Subject: [PATCH 2/8] Adds tests of JsonSchemaKewordFlags --- .../petstore/java/.openapi-generator/FILES | 1 + samples/client/petstore/java/README.md | 3 - .../JsonSchemaKeywordFlags.java | 94 ++++++++++++++++++ .../JsonSchemaKeywordFlagsTest.java | 96 +++++++++++++++++++ .../generators/JavaClientGenerator.java | 4 + src/main/resources/java/README.hbs | 3 - .../configurations/JsonSchemaKeywordFlags.hbs | 94 ++++++++++++++++++ .../JsonSchemaKeywordFlagsTest.hbs | 96 +++++++++++++++++++ 8 files changed, 385 insertions(+), 6 deletions(-) create mode 100644 samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java create mode 100644 src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 7c6b75308ed..b0867a92af7 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -2,4 +2,5 @@ README.md pom.xml src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java +src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java diff --git a/samples/client/petstore/java/README.md b/samples/client/petstore/java/README.md index af688ca2cd9..0b0b1290533 100644 --- a/samples/client/petstore/java/README.md +++ b/samples/client/petstore/java/README.md @@ -7,9 +7,6 @@ This Java package is automatically generated by the [OpenAPI JSON Schema Generat - API version: 1.0.0 - Package version: - -- Build date: 2023-11-03T14:07:31.452320-07:00[America/Los_Angeles] - - Build package: JavaClientGenerator diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java index 596eaa7cab2..3d7131e31e7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java @@ -1,5 +1,7 @@ package org.openapijsonschematools.configurations; +import java.util.LinkedHashSet; + public record JsonSchemaKeywordFlags( boolean additionalProperties, boolean allOf, @@ -41,4 +43,96 @@ public record JsonSchemaKeywordFlags( boolean unevaluatedItems, boolean unevaluatedProperties ) { + + public LinkedHashSet getEnabledKeywords() { + LinkedHashSet enabledKeywords = new LinkedHashSet<>(); + if (additionalProperties) { enabledKeywords.add("additionalProperties"); } + if (allOf) { enabledKeywords.add("allOf"); } + if (anyOf) { enabledKeywords.add("anyOf"); } + if (const_) { enabledKeywords.add("const_"); } + if (contains) { enabledKeywords.add("contains"); } + if (dependentRequired) { enabledKeywords.add("dependentRequired"); } + if (dependentSchemas) { enabledKeywords.add("dependentSchemas"); } + if (discriminator) { enabledKeywords.add("discriminator"); } + if (else_) { enabledKeywords.add("else_"); } + if (enum_) { enabledKeywords.add("enum_"); } + if (exclusiveMaximum) { enabledKeywords.add("exclusiveMaximum"); } + if (exclusiveMinimum) { enabledKeywords.add("exclusiveMinimum"); } + if (format) { enabledKeywords.add("format"); } + if (if_) { enabledKeywords.add("if_"); } + if (maximum) { enabledKeywords.add("maximum"); } + if (minimum) { enabledKeywords.add("minimum"); } + if (items) { enabledKeywords.add("items"); } + if (maxContains) { enabledKeywords.add("maxContains"); } + if (maxItems) { enabledKeywords.add("maxItems"); } + if (maxLength) { enabledKeywords.add("maxLength"); } + if (maxProperties) { enabledKeywords.add("maxProperties"); } + if (minContains) { enabledKeywords.add("minContains"); } + if (minItems) { enabledKeywords.add("minItems"); } + if (minLength) { enabledKeywords.add("minLength"); } + if (minProperties) { enabledKeywords.add("minProperties"); } + if (multipleOf) { enabledKeywords.add("multipleOf"); } + if (not) { enabledKeywords.add("not"); } + if (oneOf) { enabledKeywords.add("oneOf"); } + if (pattern) { enabledKeywords.add("pattern"); } + if (patternProperties) { enabledKeywords.add("patternProperties"); } + if (prefixItems) { enabledKeywords.add("prefixItems"); } + if (properties) { enabledKeywords.add("properties"); } + if (propertyNames) { enabledKeywords.add("propertyNames"); } + if (required) { enabledKeywords.add("required"); } + if (then) { enabledKeywords.add("then"); } + if (type) { enabledKeywords.add("type"); } + if (uniqueItems) { enabledKeywords.add("uniqueItems"); } + if (unevaluatedItems) { enabledKeywords.add("unevaluatedItems"); } + if (unevaluatedProperties) { enabledKeywords.add("unevaluatedProperties"); } + return enabledKeywords; + } + + @Test + public void testGetNoEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java new file mode 100644 index 00000000000..044c242cb98 --- /dev/null +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java @@ -0,0 +1,96 @@ +package org.openapijsonschematools.configurations; + +import org.junit.Assert; +import org.junit.Test; +import java.util.LinkedHashSet; + +public final class JsonSchemaKeywordFlagsTest { + + @Test + public void testGetEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + expectedEnabledKeywords.add("additionalProperties"); + expectedEnabledKeywords.add("allOf"); + expectedEnabledKeywords.add("anyOf"); + expectedEnabledKeywords.add("const_"); + expectedEnabledKeywords.add("contains"); + expectedEnabledKeywords.add("dependentRequired"); + expectedEnabledKeywords.add("dependentSchemas"); + expectedEnabledKeywords.add("discriminator"); + expectedEnabledKeywords.add("else_"); + expectedEnabledKeywords.add("enum_"); + expectedEnabledKeywords.add("exclusiveMaximum"); + expectedEnabledKeywords.add("exclusiveMinimum"); + expectedEnabledKeywords.add("format"); + expectedEnabledKeywords.add("if_"); + expectedEnabledKeywords.add("maximum"); + expectedEnabledKeywords.add("minimum"); + expectedEnabledKeywords.add("items"); + expectedEnabledKeywords.add("maxContains"); + expectedEnabledKeywords.add("maxItems"); + expectedEnabledKeywords.add("maxLength"); + expectedEnabledKeywords.add("maxProperties"); + expectedEnabledKeywords.add("minContains"); + expectedEnabledKeywords.add("minItems"); + expectedEnabledKeywords.add("minLength"); + expectedEnabledKeywords.add("minProperties"); + expectedEnabledKeywords.add("multipleOf"); + expectedEnabledKeywords.add("not"); + expectedEnabledKeywords.add("oneOf"); + expectedEnabledKeywords.add("pattern"); + expectedEnabledKeywords.add("patternProperties"); + expectedEnabledKeywords.add("prefixItems"); + expectedEnabledKeywords.add("properties"); + expectedEnabledKeywords.add("propertyNames"); + expectedEnabledKeywords.add("required"); + expectedEnabledKeywords.add("then"); + expectedEnabledKeywords.add("type"); + expectedEnabledKeywords.add("uniqueItems"); + expectedEnabledKeywords.add("unevaluatedItems"); + expectedEnabledKeywords.add("unevaluatedProperties"); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } + +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 61136dcd8bf..85487168357 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -274,6 +274,10 @@ public void processOpts() { "src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs", packagePath() + File.separatorChar + "configurations", "JsonSchemaKeywordFlags.java")); + supportingFiles.add(new SupportingFile( + "src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs", + testPackagePath() + File.separatorChar + "configurations", + "JsonSchemaKeywordFlagsTest.java")); // jsonPathDocTemplateFiles.put( // CodegenConstants.JSON_PATH_LOCATION_TYPE.SCHEMA, diff --git a/src/main/resources/java/README.hbs b/src/main/resources/java/README.hbs index 21b533de541..735a1677bff 100644 --- a/src/main/resources/java/README.hbs +++ b/src/main/resources/java/README.hbs @@ -7,9 +7,6 @@ This Java package is automatically generated by the [OpenAPI JSON Schema Generat - API version: {{appVersion}} - Package version: {{packageVersion}} -{{#unless hideGenerationTimestamp}} -- Build date: {{generatedDate}} -{{/unless}} - Build package: {{generatorClass}} {{#if infoUrl}} For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}) diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs index c2565c25d60..8e98bb29977 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs @@ -1,5 +1,7 @@ package {{{packageName}}}.configurations; +import java.util.LinkedHashSet; + public record JsonSchemaKeywordFlags( boolean additionalProperties, boolean allOf, @@ -41,4 +43,96 @@ public record JsonSchemaKeywordFlags( boolean unevaluatedItems, boolean unevaluatedProperties ) { + + public LinkedHashSet getEnabledKeywords() { + LinkedHashSet enabledKeywords = new LinkedHashSet<>(); + if (additionalProperties) { enabledKeywords.add("additionalProperties"); } + if (allOf) { enabledKeywords.add("allOf"); } + if (anyOf) { enabledKeywords.add("anyOf"); } + if (const_) { enabledKeywords.add("const_"); } + if (contains) { enabledKeywords.add("contains"); } + if (dependentRequired) { enabledKeywords.add("dependentRequired"); } + if (dependentSchemas) { enabledKeywords.add("dependentSchemas"); } + if (discriminator) { enabledKeywords.add("discriminator"); } + if (else_) { enabledKeywords.add("else_"); } + if (enum_) { enabledKeywords.add("enum_"); } + if (exclusiveMaximum) { enabledKeywords.add("exclusiveMaximum"); } + if (exclusiveMinimum) { enabledKeywords.add("exclusiveMinimum"); } + if (format) { enabledKeywords.add("format"); } + if (if_) { enabledKeywords.add("if_"); } + if (maximum) { enabledKeywords.add("maximum"); } + if (minimum) { enabledKeywords.add("minimum"); } + if (items) { enabledKeywords.add("items"); } + if (maxContains) { enabledKeywords.add("maxContains"); } + if (maxItems) { enabledKeywords.add("maxItems"); } + if (maxLength) { enabledKeywords.add("maxLength"); } + if (maxProperties) { enabledKeywords.add("maxProperties"); } + if (minContains) { enabledKeywords.add("minContains"); } + if (minItems) { enabledKeywords.add("minItems"); } + if (minLength) { enabledKeywords.add("minLength"); } + if (minProperties) { enabledKeywords.add("minProperties"); } + if (multipleOf) { enabledKeywords.add("multipleOf"); } + if (not) { enabledKeywords.add("not"); } + if (oneOf) { enabledKeywords.add("oneOf"); } + if (pattern) { enabledKeywords.add("pattern"); } + if (patternProperties) { enabledKeywords.add("patternProperties"); } + if (prefixItems) { enabledKeywords.add("prefixItems"); } + if (properties) { enabledKeywords.add("properties"); } + if (propertyNames) { enabledKeywords.add("propertyNames"); } + if (required) { enabledKeywords.add("required"); } + if (then) { enabledKeywords.add("then"); } + if (type) { enabledKeywords.add("type"); } + if (uniqueItems) { enabledKeywords.add("uniqueItems"); } + if (unevaluatedItems) { enabledKeywords.add("unevaluatedItems"); } + if (unevaluatedProperties) { enabledKeywords.add("unevaluatedProperties"); } + return enabledKeywords; + } + + @Test + public void testGetNoEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs new file mode 100644 index 00000000000..e169e51719a --- /dev/null +++ b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs @@ -0,0 +1,96 @@ +package {{{packageName}}}.configurations; + +import org.junit.Assert; +import org.junit.Test; +import java.util.LinkedHashSet; + +public final class JsonSchemaKeywordFlagsTest { + + @Test + public void testGetEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true, + true + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + expectedEnabledKeywords.add("additionalProperties"); + expectedEnabledKeywords.add("allOf"); + expectedEnabledKeywords.add("anyOf"); + expectedEnabledKeywords.add("const_"); + expectedEnabledKeywords.add("contains"); + expectedEnabledKeywords.add("dependentRequired"); + expectedEnabledKeywords.add("dependentSchemas"); + expectedEnabledKeywords.add("discriminator"); + expectedEnabledKeywords.add("else_"); + expectedEnabledKeywords.add("enum_"); + expectedEnabledKeywords.add("exclusiveMaximum"); + expectedEnabledKeywords.add("exclusiveMinimum"); + expectedEnabledKeywords.add("format"); + expectedEnabledKeywords.add("if_"); + expectedEnabledKeywords.add("maximum"); + expectedEnabledKeywords.add("minimum"); + expectedEnabledKeywords.add("items"); + expectedEnabledKeywords.add("maxContains"); + expectedEnabledKeywords.add("maxItems"); + expectedEnabledKeywords.add("maxLength"); + expectedEnabledKeywords.add("maxProperties"); + expectedEnabledKeywords.add("minContains"); + expectedEnabledKeywords.add("minItems"); + expectedEnabledKeywords.add("minLength"); + expectedEnabledKeywords.add("minProperties"); + expectedEnabledKeywords.add("multipleOf"); + expectedEnabledKeywords.add("not"); + expectedEnabledKeywords.add("oneOf"); + expectedEnabledKeywords.add("pattern"); + expectedEnabledKeywords.add("patternProperties"); + expectedEnabledKeywords.add("prefixItems"); + expectedEnabledKeywords.add("properties"); + expectedEnabledKeywords.add("propertyNames"); + expectedEnabledKeywords.add("required"); + expectedEnabledKeywords.add("then"); + expectedEnabledKeywords.add("type"); + expectedEnabledKeywords.add("uniqueItems"); + expectedEnabledKeywords.add("unevaluatedItems"); + expectedEnabledKeywords.add("unevaluatedProperties"); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } + +} From 3a974d443344a17c412eb9e6764c1f4174ae422e Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 3 Nov 2023 15:23:53 -0700 Subject: [PATCH 3/8] Adds SchemaConfiguration class --- .../petstore/java/.openapi-generator/FILES | 1 + .../JsonSchemaKeywordFlags.java | 48 ------------------- .../configurations/SchemaConfiguration.java | 4 ++ .../JsonSchemaKeywordFlagsTest.java | 47 ++++++++++++++++++ .../generators/JavaClientGenerator.java | 4 ++ .../configurations/JsonSchemaKeywordFlags.hbs | 48 ------------------- .../configurations/SchemaConfiguration.hbs | 4 ++ .../JsonSchemaKeywordFlagsTest.hbs | 47 ++++++++++++++++++ 8 files changed, 107 insertions(+), 96 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java create mode 100644 src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index b0867a92af7..66ded33dfb2 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -1,6 +1,7 @@ README.md pom.xml src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java +src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java index 3d7131e31e7..6634b31c8bb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java @@ -87,52 +87,4 @@ public LinkedHashSet getEnabledKeywords() { if (unevaluatedProperties) { enabledKeywords.add("unevaluatedProperties"); } return enabledKeywords; } - - @Test - public void testGetNoEnabledKeywords() { - final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); - LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); - Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); - } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java new file mode 100644 index 00000000000..b5fa4c3fa77 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java @@ -0,0 +1,4 @@ +package org.openapijsonschematools.configurations; + +public record SchemaConfiguration(JsonSchemaKeywordFlags enabledKeywordFlags) { +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java index 044c242cb98..47b225c80f4 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java @@ -93,4 +93,51 @@ public void testGetEnabledKeywords() { Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); } + @Test + public void testGetNoEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } } diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 85487168357..2bbcd9c544c 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -278,6 +278,10 @@ public void processOpts() { "src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs", testPackagePath() + File.separatorChar + "configurations", "JsonSchemaKeywordFlagsTest.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs", + packagePath() + File.separatorChar + "configurations", + "SchemaConfiguration.java")); // jsonPathDocTemplateFiles.put( // CodegenConstants.JSON_PATH_LOCATION_TYPE.SCHEMA, diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs index 8e98bb29977..3e20bcb0700 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs @@ -87,52 +87,4 @@ public record JsonSchemaKeywordFlags( if (unevaluatedProperties) { enabledKeywords.add("unevaluatedProperties"); } return enabledKeywords; } - - @Test - public void testGetNoEnabledKeywords() { - final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); - LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); - Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); - } } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs new file mode 100644 index 00000000000..20af25caf66 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs @@ -0,0 +1,4 @@ +package {{{packageName}}}.configurations; + +public record SchemaConfiguration(JsonSchemaKeywordFlags enabledKeywordFlags) { +} \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs index e169e51719a..c1aab28a802 100644 --- a/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs +++ b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs @@ -93,4 +93,51 @@ public final class JsonSchemaKeywordFlagsTest { Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); } + @Test + public void testGetNoEnabledKeywords() { + final JsonSchemaKeywordFlags jsonSchemaKeywordFlags = new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); + Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); + } } From 7251dd4a2b2b442af0720d2813d270bae804b1e2 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 3 Nov 2023 15:34:35 -0700 Subject: [PATCH 4/8] Adds ValidationMetadata --- .../client/petstore/java/.openapi-generator/FILES | 1 + .../schemas/ValidationMetadata.java | 14 ++++++++++++++ .../codegen/generators/JavaClientGenerator.java | 4 ++++ .../openapitools/schemas/ValidationMetadata.hbs | 14 ++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java create mode 100644 src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 66ded33dfb2..a4c622c3267 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -3,5 +3,6 @@ pom.xml src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java +src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java new file mode 100644 index 00000000000..26d4b81a63a --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.schemas; + +import org.openapijsonschematools.configurations.SchemaConfiguration; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public record ValidationMetadata( + List pathToItem, + SchemaConfiguration configuration, + Map, Map, Void>> validatedPathToSchemas, + Set> seenClasses +) { +} \ 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 2bbcd9c544c..e277d566599 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -269,6 +269,10 @@ public void processOpts() { "src/test/java/org/openapitools/schemas/CustomIsoparserTest.hbs", testPackagePath() + File.separatorChar + "schemas", "CustomIsoparserTest.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/schemas/ValidationMetadata.hbs", + packagePath() + File.separatorChar + "schemas", + "ValidationMetadata.java")); supportingFiles.add(new SupportingFile( "src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs", diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs new file mode 100644 index 00000000000..e59f540fad1 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.schemas; + +import {{{packageName}}}.configurations.SchemaConfiguration; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public record ValidationMetadata( + List pathToItem, + SchemaConfiguration configuration, + Map, Map, Void>> validatedPathToSchemas, + Set> seenClasses +) { +} \ No newline at end of file From 8da571c5c9f3a96238ef5b3b7c3d4fec27d0e498 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sat, 4 Nov 2023 13:16:44 -0700 Subject: [PATCH 5/8] Adds validationRanEarlier method --- .../schemas/ValidationMetadata.java | 12 ++++++++++++ .../org/openapitools/schemas/ValidationMetadata.hbs | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java index 26d4b81a63a..07eaaad92d2 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java @@ -11,4 +11,16 @@ public record ValidationMetadata( Map, Map, Void>> validatedPathToSchemas, Set> seenClasses ) { + + protected boolean validationRanEarlier(Class cls) { + Map, Void> validatedSchemas = validatedPathToSchemas.getOrDefault(pathToItem, null); + if (validatedSchemas != null && validatedSchemas.containsKey(cls)) { + return true; + } + if (seenClasses.contains(cls)) { + return true; + } + return false; + } + } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs index e59f540fad1..898f4e2edf2 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs @@ -11,4 +11,16 @@ public record ValidationMetadata( Map, Map, Void>> validatedPathToSchemas, Set> seenClasses ) { + + protected boolean validationRanEarlier(Class cls) { + Map, Void> validatedSchemas = validatedPathToSchemas.getOrDefault(pathToItem, null); + if (validatedSchemas != null && validatedSchemas.containsKey(cls)) { + return true; + } + if (seenClasses.contains(cls)) { + return true; + } + return false; + } + } \ No newline at end of file From defb282eb86947779225ccb1ae794ef4971ee082 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sat, 4 Nov 2023 13:39:54 -0700 Subject: [PATCH 6/8] Adds PathToSchemasMap class --- .../petstore/java/.openapi-generator/FILES | 1 + .../schemas/PathToSchemasMap.java | 8 ++ .../schemas/SchemaValidator.java | 91 +++++++++++++++++++ .../schemas/ValidationMetadata.java | 2 +- .../generators/JavaClientGenerator.java | 4 + .../openapitools/schemas/PathToSchemasMap.hbs | 8 ++ .../schemas/ValidationMetadata.hbs | 2 +- 7 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java create mode 100644 src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index a4c622c3267..e35f5acac0e 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -3,6 +3,7 @@ pom.xml src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java +src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java new file mode 100644 index 00000000000..915813b0f6f --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.schemas; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PathToSchemasMap extends HashMap, Map, Void>> { +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java new file mode 100644 index 00000000000..aee9c7c22b9 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java @@ -0,0 +1,91 @@ +package org.openapijsonschematools.schemas; + +public class SchemaValidator { + static + +/** + * @classmethod + * def _validate( + * cls, + * arg, + * validation_metadata: ValidationMetadata, + * ) -> PathToSchemasType: + * """ + * SchemaValidator validate + * All keyword validation except for type checking was done in calling stack frames + * If those validations passed, the validated classes are collected in path_to_schemas + * """ + * cls_schema = cls() + * json_schema_data = { + * k: v + * for k, v in vars(cls_schema).items() + * if k not in cls.__excluded_cls_properties + * and k + * not in validation_metadata.configuration.disabled_json_schema_python_keywords + * } + * contains_path_to_schemas = [] + * path_to_schemas: PathToSchemasType = {} + * if 'contains' in vars(cls_schema): + * contains_path_to_schemas = _get_contains_path_to_schemas( + * arg, + * vars(cls_schema)['contains'], + * validation_metadata, + * path_to_schemas + * ) + * if_path_to_schemas = None + * if 'if_' in vars(cls_schema): + * if_path_to_schemas = _get_if_path_to_schemas( + * arg, + * vars(cls_schema)['if_'], + * validation_metadata, + * ) + * validated_pattern_properties: typing.Optional[PathToSchemasType] = None + * if 'pattern_properties' in vars(cls_schema): + * validated_pattern_properties = _get_validated_pattern_properties( + * arg, + * vars(cls_schema)['pattern_properties'], + * cls, + * validation_metadata + * ) + * prefix_items_length = 0 + * if 'prefix_items' in vars(cls_schema): + * prefix_items_length = len(vars(cls_schema)['prefix_items']) + * for keyword, val in json_schema_data.items(): + * used_val: typing.Any + * if keyword in {'contains', 'min_contains', 'max_contains'}: + * used_val = (val, contains_path_to_schemas) + * elif keyword == 'items': + * used_val = (val, prefix_items_length) + * elif keyword in {'unevaluated_items', 'unevaluated_properties'}: + * used_val = (val, path_to_schemas) + * elif keyword in {'types'}: + * format: typing.Optional[str] = vars(cls_schema).get('format', None) + * used_val = (val, format) + * elif keyword in {'pattern_properties', 'additional_properties'}: + * used_val = (val, validated_pattern_properties) + * elif keyword in {'if_', 'then', 'else_'}: + * used_val = (val, if_path_to_schemas) + * else: + * used_val = val + * validator = json_schema_keyword_to_validator[keyword] + * + * other_path_to_schemas = validator( + * arg, + * used_val, + * cls, + * validation_metadata, + * {{#if nonCompliantUseDiscriminatorIfCompositionFails}} + * **kwargs + * {{/if}} + * ) + * if other_path_to_schemas: + * update(path_to_schemas, other_path_to_schemas) + * + * base_class = type(arg) + * if validation_metadata.path_to_item not in path_to_schemas: + * path_to_schemas[validation_metadata.path_to_item] = dict() + * path_to_schemas[validation_metadata.path_to_item][base_class] = None + * path_to_schemas[validation_metadata.path_to_item][cls] = None + * return path_to_schemas + */ +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java index 07eaaad92d2..b6745c11648 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java @@ -8,7 +8,7 @@ public record ValidationMetadata( List pathToItem, SchemaConfiguration configuration, - Map, Map, Void>> validatedPathToSchemas, + PathToSchemasMap validatedPathToSchemas, Set> seenClasses ) { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index e277d566599..42e4b06e6c2 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -273,6 +273,10 @@ public void processOpts() { "src/main/java/org/openapitools/schemas/ValidationMetadata.hbs", packagePath() + File.separatorChar + "schemas", "ValidationMetadata.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs", + packagePath() + File.separatorChar + "schemas", + "PathToSchemasMap.java")); supportingFiles.add(new SupportingFile( "src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs", diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs new file mode 100644 index 00000000000..915813b0f6f --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs @@ -0,0 +1,8 @@ +package org.openapijsonschematools.schemas; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PathToSchemasMap extends HashMap, Map, Void>> { +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs index 898f4e2edf2..9557ac8260c 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/ValidationMetadata.hbs @@ -8,7 +8,7 @@ import java.util.Set; public record ValidationMetadata( List pathToItem, SchemaConfiguration configuration, - Map, Map, Void>> validatedPathToSchemas, + PathToSchemasMap validatedPathToSchemas, Set> seenClasses ) { From 75481e2f4236ee71d28729ff6fa5d76819b73e20 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sat, 4 Nov 2023 21:13:06 -0700 Subject: [PATCH 7/8] Sample updated --- .../petstore/java/.openapi-generator/FILES | 4 + .../JsonSchemaKeywordFlags.java | 46 +++++- .../configurations/SchemaConfiguration.java | 2 +- .../schemas/SchemaValidator.java | 51 ++++++- .../schemas/validators/KeywordValidator.java | 14 ++ .../schemas/validators/TypeValidator.java | 18 +++ .../JsonSchemaKeywordFlagsTest.java | 4 +- .../schemas/validators/TypeValidatorTest.java | 56 ++++++++ .../generators/JavaClientGenerator.java | 20 +++ .../configurations/JsonSchemaKeywordFlags.hbs | 46 +++++- .../configurations/SchemaConfiguration.hbs | 2 +- .../openapitools/schemas/PathToSchemasMap.hbs | 2 +- .../openapitools/schemas/SchemaValidator.hbs | 132 ++++++++++++++++++ .../schemas/validators/KeywordValidator.hbs | 14 ++ .../schemas/validators/TypeValidator.hbs | 18 +++ .../JsonSchemaKeywordFlagsTest.hbs | 4 +- .../schemas/validators/TypeValidatorTest.hbs | 56 ++++++++ 17 files changed, 474 insertions(+), 15 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java create mode 100644 samples/client/petstore/java/src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java create mode 100644 src/main/resources/java/src/main/java/org/openapitools/schemas/SchemaValidator.hbs create mode 100644 src/main/resources/java/src/main/java/org/openapitools/schemas/validators/KeywordValidator.hbs create mode 100644 src/main/resources/java/src/main/java/org/openapitools/schemas/validators/TypeValidator.hbs create mode 100644 src/main/resources/java/src/test/java/org/openapitools/schemas/validators/TypeValidatorTest.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index e35f5acac0e..95fce7d5197 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -4,6 +4,10 @@ src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.j src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/schemas/CustomIsoparser.java src/main/java/org/openapijsonschematools/schemas/PathToSchemasMap.java +src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java +src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java +src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java +src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java index 6634b31c8bb..61c645d5e7e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlags.java @@ -44,7 +44,51 @@ public record JsonSchemaKeywordFlags( boolean unevaluatedProperties ) { - public LinkedHashSet getEnabledKeywords() { + public static JsonSchemaKeywordFlags ofNone() { + return new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + } + + public LinkedHashSet getKeywords() { LinkedHashSet enabledKeywords = new LinkedHashSet<>(); if (additionalProperties) { enabledKeywords.add("additionalProperties"); } if (allOf) { enabledKeywords.add("allOf"); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java index b5fa4c3fa77..498e6298691 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/configurations/SchemaConfiguration.java @@ -1,4 +1,4 @@ package org.openapijsonschematools.configurations; -public record SchemaConfiguration(JsonSchemaKeywordFlags enabledKeywordFlags) { +public record SchemaConfiguration(JsonSchemaKeywordFlags disabledKeywordFlags) { } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java index aee9c7c22b9..1f46de8520e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/SchemaValidator.java @@ -1,8 +1,50 @@ package org.openapijsonschematools.schemas; -public class SchemaValidator { - static +import org.openapijsonschematools.schemas.validators.KeywordValidator; +import org.openapijsonschematools.schemas.validators.TypeValidator; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +public class SchemaValidator { + static final HashMap keywordToValidator = new HashMap(){{ + put("type", new TypeValidator()); + }}; + static PathToSchemasMap _validate( + Class cls, + Object arg, + ValidationMetadata validationMetadata + ) throws InstantiationException, IllegalAccessException { + SchemaValidator clsSchema = cls.newInstance(); + Field[] fields = cls.getDeclaredFields(); + HashMap fieldsToValues = new HashMap<>(); + LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); + for (Field field : fields) { + String fieldName = field.getName(); + if (disabledKeywords.contains(fieldName)) { + continue; + } + Object value = field.get(clsSchema); + fieldsToValues.put(fieldName, value); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: fieldsToValues.entrySet()) { + String jsonKeyword = entry.getKey(); + Object value = entry.getValue(); + KeywordValidator validatorClass = keywordToValidator.get(jsonKeyword); + PathToSchemasMap otherPathToSchemas = validatorClass.validate( + arg, + value, + null, + cls, + validationMetadata + ); + } + return pathToSchemas; + } +} /** * @classmethod * def _validate( @@ -74,9 +116,7 @@ public class SchemaValidator { * used_val, * cls, * validation_metadata, - * {{#if nonCompliantUseDiscriminatorIfCompositionFails}} - * **kwargs - * {{/if}} + * * ) * if other_path_to_schemas: * update(path_to_schemas, other_path_to_schemas) @@ -88,4 +128,3 @@ public class SchemaValidator { * path_to_schemas[validation_metadata.path_to_item][cls] = None * return path_to_schemas */ -} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java new file mode 100644 index 00000000000..f341089b1d5 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java @@ -0,0 +1,14 @@ +package org.openapijsonschematools.schemas.validators; + +import org.openapijsonschematools.schemas.PathToSchemasMap; +import org.openapijsonschematools.schemas.SchemaValidator; +import org.openapijsonschematools.schemas.ValidationMetadata; + +public interface KeywordValidator { + PathToSchemasMap validate( + Object arg, + Object value, + Object extra, + Class cls, + ValidationMetadata validationMetadata); +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java new file mode 100644 index 00000000000..64d78937612 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.schemas.validators; + +import org.openapijsonschematools.schemas.PathToSchemasMap; +import org.openapijsonschematools.schemas.SchemaValidator; +import org.openapijsonschematools.schemas.ValidationMetadata; + +import java.util.HashSet; + +public class TypeValidator implements KeywordValidator { + @Override + public PathToSchemasMap validate(Object arg, Object value, Object extra, Class cls, ValidationMetadata validationMetadata) { + HashSet> types = (HashSet>) value; + if (!types.contains(arg.getClass())) { + throw new RuntimeException("invalid type"); + } + return null; + } +} diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java index 47b225c80f4..a472ccc5bad 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java @@ -49,7 +49,7 @@ public void testGetEnabledKeywords() { true, true ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getKeywords(); LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); expectedEnabledKeywords.add("additionalProperties"); expectedEnabledKeywords.add("allOf"); @@ -136,7 +136,7 @@ public void testGetNoEnabledKeywords() { false, false ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getKeywords(); LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); } diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java new file mode 100644 index 00000000000..a908abea0b7 --- /dev/null +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java @@ -0,0 +1,56 @@ +package org.openapijsonschematools.schemas.validators; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.configurations.SchemaConfiguration; +import org.openapijsonschematools.schemas.PathToSchemasMap; +import org.openapijsonschematools.schemas.SchemaValidator; +import org.openapijsonschematools.schemas.ValidationMetadata; + +import java.util.ArrayList; +import java.util.LinkedHashSet; + +public class TypeValidatorTest { + + @Test + public void testValidateSucceeds() { + final TypeValidator validator = new TypeValidator(); + LinkedHashSet> value = new LinkedHashSet<>(); + value.add(String.class); + ValidationMetadata validationMetadata = new ValidationMetadata( + new ArrayList<>(), + new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), + new PathToSchemasMap(), + new LinkedHashSet<>() + ); + PathToSchemasMap pathToSchemasMap = validator.validate( + "hi", + value, + null, + SchemaValidator.class, + validationMetadata + ); + Assert.assertNull(pathToSchemasMap); + } + + @Test + public void testValidateFailsIntIsNotString() throws RuntimeException { + final TypeValidator validator = new TypeValidator(); + LinkedHashSet> value = new LinkedHashSet<>(); + value.add(String.class); + ValidationMetadata validationMetadata = new ValidationMetadata( + new ArrayList<>(), + new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), + new PathToSchemasMap(), + new LinkedHashSet<>() + ); + Assert.assertThrows(RuntimeException.class, () -> validator.validate( + 1, + value, + null, + SchemaValidator.class, + validationMetadata + )); + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 42e4b06e6c2..081d462c87b 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -277,7 +277,27 @@ public void processOpts() { "src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs", packagePath() + File.separatorChar + "schemas", "PathToSchemasMap.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/schemas/SchemaValidator.hbs", + packagePath() + File.separatorChar + "schemas", + "SchemaValidator.java")); + + // keyword validators + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/schemas/validators/KeywordValidator.hbs", + packagePath() + File.separatorChar + "schemas" + File.separatorChar + "validators", + "KeywordValidator.java")); + // type + supportingFiles.add(new SupportingFile( + "src/main/java/org/openapitools/schemas/validators/TypeValidator.hbs", + packagePath() + File.separatorChar + "schemas" + File.separatorChar + "validators", + "TypeValidator.java")); + supportingFiles.add(new SupportingFile( + "src/test/java/org/openapitools/schemas/validators/TypeValidatorTest.hbs", + testPackagePath() + File.separatorChar + "schemas" + File.separatorChar + "validators", + "TypeValidatorTest.java")); + // configuration supportingFiles.add(new SupportingFile( "src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs", packagePath() + File.separatorChar + "configurations", diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs index 3e20bcb0700..8b5da889f65 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/JsonSchemaKeywordFlags.hbs @@ -44,7 +44,51 @@ public record JsonSchemaKeywordFlags( boolean unevaluatedProperties ) { - public LinkedHashSet getEnabledKeywords() { + public static JsonSchemaKeywordFlags ofNone() { + return new JsonSchemaKeywordFlags( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); + } + + public LinkedHashSet getKeywords() { LinkedHashSet enabledKeywords = new LinkedHashSet<>(); if (additionalProperties) { enabledKeywords.add("additionalProperties"); } if (allOf) { enabledKeywords.add("allOf"); } diff --git a/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs b/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs index 20af25caf66..c63928c0d7f 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/configurations/SchemaConfiguration.hbs @@ -1,4 +1,4 @@ package {{{packageName}}}.configurations; -public record SchemaConfiguration(JsonSchemaKeywordFlags enabledKeywordFlags) { +public record SchemaConfiguration(JsonSchemaKeywordFlags disabledKeywordFlags) { } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs index 915813b0f6f..cc8526fb767 100644 --- a/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/PathToSchemasMap.hbs @@ -1,4 +1,4 @@ -package org.openapijsonschematools.schemas; +package {{{packageName}}}.schemas; import java.util.HashMap; import java.util.List; diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/SchemaValidator.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/SchemaValidator.hbs new file mode 100644 index 00000000000..f731be796c4 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/SchemaValidator.hbs @@ -0,0 +1,132 @@ +package org.openapijsonschematools.schemas; + +import org.openapijsonschematools.schemas.validators.KeywordValidator; +import org.openapijsonschematools.schemas.validators.TypeValidator; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; + +public class SchemaValidator { + static final HashMap keywordToValidator = new HashMap()\{{ + put("type", new TypeValidator()); + }}; + static PathToSchemasMap _validate( + Class cls, + Object arg, + ValidationMetadata validationMetadata + ) throws InstantiationException, IllegalAccessException { + SchemaValidator clsSchema = cls.newInstance(); + Field[] fields = cls.getDeclaredFields(); + HashMap fieldsToValues = new HashMap<>(); + LinkedHashSet disabledKeywords = validationMetadata.configuration().disabledKeywordFlags().getKeywords(); + for (Field field : fields) { + String fieldName = field.getName(); + if (disabledKeywords.contains(fieldName)) { + continue; + } + Object value = field.get(clsSchema); + fieldsToValues.put(fieldName, value); + } + PathToSchemasMap pathToSchemas = new PathToSchemasMap(); + for (Map.Entry entry: fieldsToValues.entrySet()) { + String jsonKeyword = entry.getKey(); + Object value = entry.getValue(); + KeywordValidator validatorClass = keywordToValidator.get(jsonKeyword); + PathToSchemasMap otherPathToSchemas = validatorClass.validate( + arg, + value, + null, + cls, + validationMetadata + ); + } + return pathToSchemas; + } +} +/** + * @classmethod + * def _validate( + * cls, + * arg, + * validation_metadata: ValidationMetadata, + * ) -> PathToSchemasType: + * """ + * SchemaValidator validate + * All keyword validation except for type checking was done in calling stack frames + * If those validations passed, the validated classes are collected in path_to_schemas + * """ + * cls_schema = cls() + * json_schema_data = { + * k: v + * for k, v in vars(cls_schema).items() + * if k not in cls.__excluded_cls_properties + * and k + * not in validation_metadata.configuration.disabled_json_schema_python_keywords + * } + * contains_path_to_schemas = [] + * path_to_schemas: PathToSchemasType = {} + * if 'contains' in vars(cls_schema): + * contains_path_to_schemas = _get_contains_path_to_schemas( + * arg, + * vars(cls_schema)['contains'], + * validation_metadata, + * path_to_schemas + * ) + * if_path_to_schemas = None + * if 'if_' in vars(cls_schema): + * if_path_to_schemas = _get_if_path_to_schemas( + * arg, + * vars(cls_schema)['if_'], + * validation_metadata, + * ) + * validated_pattern_properties: typing.Optional[PathToSchemasType] = None + * if 'pattern_properties' in vars(cls_schema): + * validated_pattern_properties = _get_validated_pattern_properties( + * arg, + * vars(cls_schema)['pattern_properties'], + * cls, + * validation_metadata + * ) + * prefix_items_length = 0 + * if 'prefix_items' in vars(cls_schema): + * prefix_items_length = len(vars(cls_schema)['prefix_items']) + * for keyword, val in json_schema_data.items(): + * used_val: typing.Any + * if keyword in {'contains', 'min_contains', 'max_contains'}: + * used_val = (val, contains_path_to_schemas) + * elif keyword == 'items': + * used_val = (val, prefix_items_length) + * elif keyword in {'unevaluated_items', 'unevaluated_properties'}: + * used_val = (val, path_to_schemas) + * elif keyword in {'types'}: + * format: typing.Optional[str] = vars(cls_schema).get('format', None) + * used_val = (val, format) + * elif keyword in {'pattern_properties', 'additional_properties'}: + * used_val = (val, validated_pattern_properties) + * elif keyword in {'if_', 'then', 'else_'}: + * used_val = (val, if_path_to_schemas) + * else: + * used_val = val + * validator = json_schema_keyword_to_validator[keyword] + * + * other_path_to_schemas = validator( + * arg, + * used_val, + * cls, + * validation_metadata, + * {{#if nonCompliantUseDiscriminatorIfCompositionFails}} + * **kwargs + * {{/if}} + * ) + * if other_path_to_schemas: + * update(path_to_schemas, other_path_to_schemas) + * + * base_class = type(arg) + * if validation_metadata.path_to_item not in path_to_schemas: + * path_to_schemas[validation_metadata.path_to_item] = dict() + * path_to_schemas[validation_metadata.path_to_item][base_class] = None + * path_to_schemas[validation_metadata.path_to_item][cls] = None + * return path_to_schemas + */ diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/KeywordValidator.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/KeywordValidator.hbs new file mode 100644 index 00000000000..8228de6fd74 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/KeywordValidator.hbs @@ -0,0 +1,14 @@ +package {{{packageName}}}.schemas.validators; + +import {{{packageName}}}.schemas.PathToSchemasMap; +import {{{packageName}}}.schemas.SchemaValidator; +import {{{packageName}}}.schemas.ValidationMetadata; + +public interface KeywordValidator { + PathToSchemasMap validate( + Object arg, + Object value, + Object extra, + Class cls, + ValidationMetadata validationMetadata); +} diff --git a/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/TypeValidator.hbs b/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/TypeValidator.hbs new file mode 100644 index 00000000000..2baeea76b43 --- /dev/null +++ b/src/main/resources/java/src/main/java/org/openapitools/schemas/validators/TypeValidator.hbs @@ -0,0 +1,18 @@ +package {{{packageName}}}.schemas.validators; + +import {{{packageName}}}.schemas.PathToSchemasMap; +import {{{packageName}}}.schemas.SchemaValidator; +import {{{packageName}}}.schemas.ValidationMetadata; + +import java.util.HashSet; + +public class TypeValidator implements KeywordValidator { + @Override + public PathToSchemasMap validate(Object arg, Object value, Object extra, Class cls, ValidationMetadata validationMetadata) { + HashSet> types = (HashSet>) value; + if (!types.contains(arg.getClass())) { + throw new RuntimeException("invalid type"); + } + return null; + } +} diff --git a/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs index c1aab28a802..15f9d79b450 100644 --- a/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs +++ b/src/main/resources/java/src/test/java/org/openapitools/configurations/JsonSchemaKeywordFlagsTest.hbs @@ -49,7 +49,7 @@ public final class JsonSchemaKeywordFlagsTest { true, true ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getKeywords(); LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); expectedEnabledKeywords.add("additionalProperties"); expectedEnabledKeywords.add("allOf"); @@ -136,7 +136,7 @@ public final class JsonSchemaKeywordFlagsTest { false, false ); - LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getEnabledKeywords(); + LinkedHashSet enabledKeywords = jsonSchemaKeywordFlags.getKeywords(); LinkedHashSet expectedEnabledKeywords = new LinkedHashSet<>(); Assert.assertEquals(enabledKeywords, expectedEnabledKeywords); } diff --git a/src/main/resources/java/src/test/java/org/openapitools/schemas/validators/TypeValidatorTest.hbs b/src/main/resources/java/src/test/java/org/openapitools/schemas/validators/TypeValidatorTest.hbs new file mode 100644 index 00000000000..ea2e3373f47 --- /dev/null +++ b/src/main/resources/java/src/test/java/org/openapitools/schemas/validators/TypeValidatorTest.hbs @@ -0,0 +1,56 @@ +package {{{packageName}}}.schemas.validators; + +import org.junit.Assert; +import org.junit.Test; +import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.schemas.PathToSchemasMap; +import {{{packageName}}}.schemas.SchemaValidator; +import {{{packageName}}}.schemas.ValidationMetadata; + +import java.util.ArrayList; +import java.util.LinkedHashSet; + +public class TypeValidatorTest { + + @Test + public void testValidateSucceeds() { + final TypeValidator validator = new TypeValidator(); + LinkedHashSet> value = new LinkedHashSet<>(); + value.add(String.class); + ValidationMetadata validationMetadata = new ValidationMetadata( + new ArrayList<>(), + new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), + new PathToSchemasMap(), + new LinkedHashSet<>() + ); + PathToSchemasMap pathToSchemasMap = validator.validate( + "hi", + value, + null, + SchemaValidator.class, + validationMetadata + ); + Assert.assertNull(pathToSchemasMap); + } + + @Test + public void testValidateFailsIntIsNotString() throws RuntimeException { + final TypeValidator validator = new TypeValidator(); + LinkedHashSet> value = new LinkedHashSet<>(); + value.add(String.class); + ValidationMetadata validationMetadata = new ValidationMetadata( + new ArrayList<>(), + new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()), + new PathToSchemasMap(), + new LinkedHashSet<>() + ); + Assert.assertThrows(RuntimeException.class, () -> validator.validate( + 1, + value, + null, + SchemaValidator.class, + validationMetadata + )); + } +} From 2f55aa086eb0df5fb39613aa34bcbf5983408374 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sat, 4 Nov 2023 21:18:18 -0700 Subject: [PATCH 8/8] Docs updated --- docs/generators/java.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/generators/java.md b/docs/generators/java.md index 15aaa3c8e56..36e24737312 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -10,6 +10,7 @@ title: Documentation for the java generator | generator stability | EXPERIMENTAL | | | generator type | CLIENT | | | generator language | Java | | +| generator language version | 17 | | | generator default templating engine | handlebars | | | helpTxt | Generates a Java client library (HTTP lib: Jersey (1.x, 2.x), Retrofit (2.x), OpenFeign (10.x) and more. | |