From cc6c7975e2bd21c27c6cc3e793e61835462ca526 Mon Sep 17 00:00:00 2001 From: Martin <2026226+martin-mfg@users.noreply.github.com> Date: Tue, 8 Oct 2024 20:24:58 +0200 Subject: [PATCH] anyOf --- .../libraries/jersey2/anyof_model.mustache | 30 ++++++++++++++++--- .../libraries/jersey3/anyof_model.mustache | 30 ++++++++++++++++--- .../openapitools/client/model/GmFruit.java | 4 +-- .../client/model/MammalAnyof.java | 24 +++++++-------- .../openapitools/client/model/GmFruit.java | 4 +-- .../client/model/MammalAnyof.java | 24 +++++++-------- 6 files changed, 80 insertions(+), 36 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/anyof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/anyof_model.mustache index deaac4225f185..46c2cdc3a666f 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/anyof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/anyof_model.mustache @@ -68,10 +68,23 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im return ret; } {{/discriminator}} + {{#composedSchemas}} {{#anyOf}} - // deserialize {{{.}}} + // deserialize {{{dataType}}}{{#isNullable}} (nullable){{/isNullable}} try { - deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class); + {{^isArray}} + {{^isMap}} + deserialized = tree.traverse(jp.getCodec()).readValueAs({{{dataType}}}.class); + {{/isMap}} + {{/isArray}} + {{#isArray}} + final TypeReference<{{{dataType}}}> ref = new TypeReference<{{{dataType}}}>(){}; + deserialized = tree.traverse(jp.getCodec()).readValueAs(ref); + {{/isArray}} + {{#isMap}} + final TypeReference<{{{dataType}}}> ref = new TypeReference<{{{dataType}}}>(){}; + deserialized = tree.traverse(jp.getCodec()).readValueAs(ref); + {{/isMap}} {{classname}} ret = new {{classname}}(); ret.setActualInstance(deserialized); return ret; @@ -81,6 +94,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/anyOf}} + {{/composedSchemas}} throw new IOException(String.format("Failed deserialization for {{classname}}: no match found")); } @@ -119,13 +133,17 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties); } {{/additionalPropertiesType}} + {{#composedSchemas}} {{#anyOf}} - public {{classname}}({{{.}}} o) { + {{^vendorExtensions.x-duplicated-data-type}} + public {{classname}}({{{baseType}}} o) { super("anyOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}}); setActualInstance(o); } + {{/vendorExtensions.x-duplicated-data-type}} {{/anyOf}} + {{/composedSchemas}} static { {{#anyOf}} schemas.put("{{{.}}}", new GenericType<{{{.}}}>() { @@ -165,13 +183,17 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/isNullable}} + {{#composedSchemas}} {{#anyOf}} - if (JSON.isInstanceOf({{{.}}}.class, instance, new HashSet<>())) { + {{^vendorExtensions.x-duplicated-data-type}} + if (JSON.isInstanceOf({{{baseType}}}.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } + {{/vendorExtensions.x-duplicated-data-type}} {{/anyOf}} + {{/composedSchemas}} throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}"); } diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey3/anyof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey3/anyof_model.mustache index deaac4225f185..46c2cdc3a666f 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey3/anyof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey3/anyof_model.mustache @@ -68,10 +68,23 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im return ret; } {{/discriminator}} + {{#composedSchemas}} {{#anyOf}} - // deserialize {{{.}}} + // deserialize {{{dataType}}}{{#isNullable}} (nullable){{/isNullable}} try { - deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class); + {{^isArray}} + {{^isMap}} + deserialized = tree.traverse(jp.getCodec()).readValueAs({{{dataType}}}.class); + {{/isMap}} + {{/isArray}} + {{#isArray}} + final TypeReference<{{{dataType}}}> ref = new TypeReference<{{{dataType}}}>(){}; + deserialized = tree.traverse(jp.getCodec()).readValueAs(ref); + {{/isArray}} + {{#isMap}} + final TypeReference<{{{dataType}}}> ref = new TypeReference<{{{dataType}}}>(){}; + deserialized = tree.traverse(jp.getCodec()).readValueAs(ref); + {{/isMap}} {{classname}} ret = new {{classname}}(); ret.setActualInstance(deserialized); return ret; @@ -81,6 +94,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/anyOf}} + {{/composedSchemas}} throw new IOException(String.format("Failed deserialization for {{classname}}: no match found")); } @@ -119,13 +133,17 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties); } {{/additionalPropertiesType}} + {{#composedSchemas}} {{#anyOf}} - public {{classname}}({{{.}}} o) { + {{^vendorExtensions.x-duplicated-data-type}} + public {{classname}}({{{baseType}}} o) { super("anyOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}}); setActualInstance(o); } + {{/vendorExtensions.x-duplicated-data-type}} {{/anyOf}} + {{/composedSchemas}} static { {{#anyOf}} schemas.put("{{{.}}}", new GenericType<{{{.}}}>() { @@ -165,13 +183,17 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/isNullable}} + {{#composedSchemas}} {{#anyOf}} - if (JSON.isInstanceOf({{{.}}}.class, instance, new HashSet<>())) { + {{^vendorExtensions.x-duplicated-data-type}} + if (JSON.isInstanceOf({{{baseType}}}.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } + {{/vendorExtensions.x-duplicated-data-type}} {{/anyOf}} + {{/composedSchemas}} throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}"); } diff --git a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/GmFruit.java b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/GmFruit.java index b718b0b32a3c3..ee6edc290d122 100644 --- a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/GmFruit.java +++ b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/GmFruit.java @@ -89,7 +89,7 @@ public GmFruit deserialize(JsonParser jp, DeserializationContext ctxt) throws IO JsonNode tree = jp.readValueAsTree(); Object deserialized = null; - // deserialize Apple + // deserialize Apple (nullable) try { deserialized = tree.traverse(jp.getCodec()).readValueAs(Apple.class); GmFruit ret = new GmFruit(); @@ -131,7 +131,7 @@ public GmFruit() { } public GmFruit(Apple o) { - super("anyOf", Boolean.FALSE); + super("anyOf", Boolean.TRUE); setActualInstance(o); } diff --git a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/MammalAnyof.java b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/MammalAnyof.java index b9231318fb1b6..68a51d1438d5c 100644 --- a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/MammalAnyof.java +++ b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/MammalAnyof.java @@ -106,9 +106,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw ret.setActualInstance(deserialized); return ret; } - // deserialize Pig + // deserialize Whale try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Pig.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Whale.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -117,9 +117,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw log.log(Level.FINER, "Input data does not match 'MammalAnyof'", e); } - // deserialize Whale + // deserialize Zebra try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Whale.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Zebra.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -128,9 +128,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw log.log(Level.FINER, "Input data does not match 'MammalAnyof'", e); } - // deserialize Zebra + // deserialize Pig try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Zebra.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Pig.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -207,17 +207,17 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties); } - public MammalAnyof(Pig o) { + public MammalAnyof(Whale o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } - public MammalAnyof(Whale o) { + public MammalAnyof(Zebra o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } - public MammalAnyof(Zebra o) { + public MammalAnyof(Pig o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } @@ -254,17 +254,17 @@ public Map> getSchemas() { */ @Override public void setActualInstance(Object instance) { - if (JSON.isInstanceOf(Pig.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Whale.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } - if (JSON.isInstanceOf(Whale.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Zebra.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } - if (JSON.isInstanceOf(Zebra.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Pig.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/GmFruit.java b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/GmFruit.java index 2206205198b2f..627e7715e779c 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/GmFruit.java +++ b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/GmFruit.java @@ -87,7 +87,7 @@ public GmFruit deserialize(JsonParser jp, DeserializationContext ctxt) throws IO JsonNode tree = jp.readValueAsTree(); Object deserialized = null; - // deserialize Apple + // deserialize Apple (nullable) try { deserialized = tree.traverse(jp.getCodec()).readValueAs(Apple.class); GmFruit ret = new GmFruit(); @@ -129,7 +129,7 @@ public GmFruit() { } public GmFruit(Apple o) { - super("anyOf", Boolean.FALSE); + super("anyOf", Boolean.TRUE); setActualInstance(o); } diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/MammalAnyof.java b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/MammalAnyof.java index 8753aa23f90df..51013cfbede49 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/MammalAnyof.java +++ b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/MammalAnyof.java @@ -104,9 +104,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw ret.setActualInstance(deserialized); return ret; } - // deserialize Pig + // deserialize Whale try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Pig.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Whale.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -115,9 +115,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw log.log(Level.FINER, "Input data does not match 'MammalAnyof'", e); } - // deserialize Whale + // deserialize Zebra try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Whale.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Zebra.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -126,9 +126,9 @@ public MammalAnyof deserialize(JsonParser jp, DeserializationContext ctxt) throw log.log(Level.FINER, "Input data does not match 'MammalAnyof'", e); } - // deserialize Zebra + // deserialize Pig try { - deserialized = tree.traverse(jp.getCodec()).readValueAs(Zebra.class); + deserialized = tree.traverse(jp.getCodec()).readValueAs(Pig.class); MammalAnyof ret = new MammalAnyof(); ret.setActualInstance(deserialized); return ret; @@ -205,17 +205,17 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties); } - public MammalAnyof(Pig o) { + public MammalAnyof(Whale o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } - public MammalAnyof(Whale o) { + public MammalAnyof(Zebra o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } - public MammalAnyof(Zebra o) { + public MammalAnyof(Pig o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } @@ -252,17 +252,17 @@ public Map> getSchemas() { */ @Override public void setActualInstance(Object instance) { - if (JSON.isInstanceOf(Pig.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Whale.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } - if (JSON.isInstanceOf(Whale.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Zebra.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; } - if (JSON.isInstanceOf(Zebra.class, instance, new HashSet<>())) { + if (JSON.isInstanceOf(Pig.class, instance, new HashSet<>())) { super.setActualInstance(instance); return; }