diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache index 04f8a08934c..e1727ddc047 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache @@ -60,6 +60,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im if (value.getActualInstance() instanceof {{.}}) { JsonObject obj = adapter{{.}}.toJsonTree(({{.}})value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } {{/anyOf}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache index 84c4846dc50..48da5e472c3 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache @@ -60,6 +60,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im if (value.getActualInstance() instanceof {{.}}) { JsonObject obj = adapter{{.}}.toJsonTree(({{.}})value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } {{/oneOf}} diff --git a/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml b/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml index 92b32a47679..bf85279739e 100644 --- a/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml @@ -1888,6 +1888,11 @@ components: type: string pattern: /^[A-Z\s]*$/i nullable: true + pineapple: + type: object + properties: + origin: + type: string banana: type: object properties: @@ -1950,6 +1955,7 @@ components: color: type: string anyOf: + - $ref: '#/components/schemas/pineapple' - $ref: '#/components/schemas/apple' - $ref: '#/components/schemas/banana' additionalProperties: false diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES b/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES index 39148a7980a..29da59bcd3e 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES +++ b/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES @@ -66,6 +66,7 @@ docs/ParentPet.md docs/Pet.md docs/PetApi.md docs/Pig.md +docs/Pineapple.md docs/Quadrilateral.md docs/QuadrilateralInterface.md docs/ReadOnlyFirst.md @@ -178,6 +179,7 @@ src/main/java/org/openapitools/client/model/OuterEnumIntegerDefaultValue.java src/main/java/org/openapitools/client/model/ParentPet.java src/main/java/org/openapitools/client/model/Pet.java src/main/java/org/openapitools/client/model/Pig.java +src/main/java/org/openapitools/client/model/Pineapple.java src/main/java/org/openapitools/client/model/Quadrilateral.java src/main/java/org/openapitools/client/model/QuadrilateralInterface.java src/main/java/org/openapitools/client/model/ReadOnlyFirst.java diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/README.md b/samples/client/petstore/java/okhttp-gson-nextgen/README.md index 6110aea0fa0..3a81849aa6f 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/README.md +++ b/samples/client/petstore/java/okhttp-gson-nextgen/README.md @@ -213,6 +213,7 @@ Class | Method | HTTP request | Description - [ParentPet](docs/ParentPet.md) - [Pet](docs/Pet.md) - [Pig](docs/Pig.md) + - [Pineapple](docs/Pineapple.md) - [Quadrilateral](docs/Quadrilateral.md) - [QuadrilateralInterface](docs/QuadrilateralInterface.md) - [ReadOnlyFirst](docs/ReadOnlyFirst.md) diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml index 8e64d05d5f2..e2ecf87a054 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml @@ -2053,6 +2053,11 @@ components: pattern: /^[A-Z\s]*$/i type: string type: object + pineapple: + properties: + origin: + type: string + type: object banana: properties: lengthCm: @@ -2113,6 +2118,7 @@ components: gmFruit: additionalProperties: false anyOf: + - $ref: '#/components/schemas/pineapple' - $ref: '#/components/schemas/apple' - $ref: '#/components/schemas/banana' properties: diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md b/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md index 1536d689689..d91eec57f89 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md +++ b/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md @@ -8,8 +8,8 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **color** | **String** | | [optional] -**cultivar** | **String** | | [optional] **origin** | **String** | | [optional] +**cultivar** | **String** | | [optional] **lengthCm** | **BigDecimal** | | [optional] diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/docs/Pineapple.md b/samples/client/petstore/java/okhttp-gson-nextgen/docs/Pineapple.md new file mode 100644 index 00000000000..b7980a3b952 --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson-nextgen/docs/Pineapple.md @@ -0,0 +1,13 @@ + + +# Pineapple + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**origin** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java index 40146a3e6f5..33e8ed752ef 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java @@ -270,6 +270,7 @@ public class JSON { .registerTypeAdapterFactory(new org.openapitools.client.model.ParentPet.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Pig.CustomTypeAdapterFactory()) + .registerTypeAdapterFactory(new org.openapitools.client.model.Pineapple.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Quadrilateral.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.QuadrilateralInterface.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.ReadOnlyFirst.CustomTypeAdapterFactory()) diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java index 4b162d79aec..03436bd35b2 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java @@ -87,12 +87,14 @@ public class Fruit extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Apple) { JsonObject obj = adapterApple.toJsonTree((Apple)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Banana` if (value.getActualInstance() instanceof Banana) { JsonObject obj = adapterBanana.toJsonTree((Banana)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Apple, Banana"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java index 13436b1d6e3..6a6ea0c82f6 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java @@ -87,12 +87,14 @@ public class FruitReq extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof AppleReq) { JsonObject obj = adapterAppleReq.toJsonTree((AppleReq)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `BananaReq` if (value.getActualInstance() instanceof BananaReq) { JsonObject obj = adapterBananaReq.toJsonTree((BananaReq)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: AppleReq, BananaReq"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java index 1d07fdfd6ba..4085fd34c10 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.math.BigDecimal; import org.openapitools.client.model.Apple; import org.openapitools.client.model.Banana; +import org.openapitools.client.model.Pineapple; import javax.ws.rs.core.GenericType; @@ -74,6 +75,7 @@ public class GmFruit extends AbstractOpenApiSchema { final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); final TypeAdapter adapterApple = gson.getDelegateAdapter(this, TypeToken.get(Apple.class)); final TypeAdapter adapterBanana = gson.getDelegateAdapter(this, TypeToken.get(Banana.class)); + final TypeAdapter adapterPineapple = gson.getDelegateAdapter(this, TypeToken.get(Pineapple.class)); return (TypeAdapter) new TypeAdapter() { @Override @@ -87,15 +89,24 @@ public class GmFruit extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Apple) { JsonObject obj = adapterApple.toJsonTree((Apple)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Banana` if (value.getActualInstance() instanceof Banana) { JsonObject obj = adapterBanana.toJsonTree((Banana)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } - throw new IOException("Failed to deserialize as the type doesn't match anyOf schemas: Apple, Banana"); + // check if the actual instance is of the type `Pineapple` + if (value.getActualInstance() instanceof Pineapple) { + JsonObject obj = adapterPineapple.toJsonTree((Pineapple)value.getActualInstance()).getAsJsonObject(); + elementAdapter.write(out, obj); + return; + } + + throw new IOException("Failed to deserialize as the type doesn't match anyOf schemas: Apple, Banana, Pineapple"); } @Override @@ -126,6 +137,18 @@ public class GmFruit extends AbstractOpenApiSchema { log.log(Level.FINER, "Input data does not match schema 'Banana'", e); } + // deserialize Pineapple + try { + deserialized = gson.fromJson(in, Pineapple.class); + log.log(Level.FINER, "Input data matches schema 'Pineapple'"); + GmFruit ret = new GmFruit(); + ret.setActualInstance(deserialized); + return ret; + } catch (Exception e) { + // deserialization failed, continue + log.log(Level.FINER, "Input data does not match schema 'Pineapple'", e); + } + throw new IOException("Failed deserialization for GmFruit: no match found."); } }.nullSafe(); @@ -149,11 +172,18 @@ public class GmFruit extends AbstractOpenApiSchema { setActualInstance(o); } + public GmFruit(Pineapple o) { + super("anyOf", Boolean.FALSE); + setActualInstance(o); + } + static { schemas.put("Apple", new GenericType() { }); schemas.put("Banana", new GenericType() { }); + schemas.put("Pineapple", new GenericType() { + }); } @Override @@ -164,7 +194,7 @@ public class GmFruit extends AbstractOpenApiSchema { /** * Set the instance that matches the anyOf child schema, check * the instance parameter is valid against the anyOf child schemas: - * Apple, Banana + * Apple, Banana, Pineapple * * It could be an instance of the 'anyOf' schemas. * The anyOf child schemas may themselves be a composed schema (allOf, anyOf, anyOf). @@ -181,14 +211,19 @@ public class GmFruit extends AbstractOpenApiSchema { return; } - throw new RuntimeException("Invalid instance type. Must be Apple, Banana"); + if (instance instanceof Pineapple) { + super.setActualInstance(instance); + return; + } + + throw new RuntimeException("Invalid instance type. Must be Apple, Banana, Pineapple"); } /** * Get the actual instance, which can be the following: - * Apple, Banana + * Apple, Banana, Pineapple * - * @return The actual instance (Apple, Banana) + * @return The actual instance (Apple, Banana, Pineapple) */ @Override public Object getActualInstance() { @@ -217,5 +252,16 @@ public class GmFruit extends AbstractOpenApiSchema { return (Banana)super.getActualInstance(); } + /** + * Get the actual instance of `Pineapple`. If the actual instance is not `Pineapple`, + * the ClassCastException will be thrown. + * + * @return The actual instance of `Pineapple` + * @throws ClassCastException if the instance is not `Pineapple` + */ + public Pineapple getPineapple() throws ClassCastException { + return (Pineapple)super.getActualInstance(); + } + } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java index fcd1935126b..1298c95a72c 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java @@ -88,18 +88,21 @@ public class Mammal extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Pig) { JsonObject obj = adapterPig.toJsonTree((Pig)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Whale` if (value.getActualInstance() instanceof Whale) { JsonObject obj = adapterWhale.toJsonTree((Whale)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Zebra` if (value.getActualInstance() instanceof Zebra) { JsonObject obj = adapterZebra.toJsonTree((Zebra)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Pig, Whale, Zebra"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java index bb11f4eb0e9..9da8d1671bf 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java @@ -86,12 +86,14 @@ public class NullableShape extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Quadrilateral) { JsonObject obj = adapterQuadrilateral.toJsonTree((Quadrilateral)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Triangle` if (value.getActualInstance() instanceof Triangle) { JsonObject obj = adapterTriangle.toJsonTree((Triangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java index 9e2015ba672..5271006630c 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java @@ -86,12 +86,14 @@ public class Pig extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof BasquePig) { JsonObject obj = adapterBasquePig.toJsonTree((BasquePig)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `DanishPig` if (value.getActualInstance() instanceof DanishPig) { JsonObject obj = adapterDanishPig.toJsonTree((DanishPig)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: BasquePig, DanishPig"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pineapple.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pineapple.java new file mode 100644 index 00000000000..284058b93a8 --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pineapple.java @@ -0,0 +1,162 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +/** + * Pineapple + */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen") +public class Pineapple { + public static final String SERIALIZED_NAME_ORIGIN = "origin"; + @SerializedName(SERIALIZED_NAME_ORIGIN) + private String origin; + + public Pineapple() { + } + + public Pineapple origin(String origin) { + + this.origin = origin; + return this; + } + + /** + * Get origin + * @return origin + **/ + @javax.annotation.Nullable + @ApiModelProperty(value = "") + + public String getOrigin() { + return origin; + } + + + public void setOrigin(String origin) { + this.origin = origin; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pineapple pineapple = (Pineapple) o; + return Objects.equals(this.origin, pineapple.origin); + } + + @Override + public int hashCode() { + return Objects.hash(origin); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pineapple {\n"); + sb.append(" origin: ").append(toIndentedString(origin)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(); + openapiFields.add("origin"); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(); + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!Pineapple.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'Pineapple' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(Pineapple.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, Pineapple value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public Pineapple read(JsonReader in) throws IOException { + JsonObject obj = elementAdapter.read(in).getAsJsonObject(); + Set> entries = obj.entrySet();//will return members of your object + // check to see if the JSON string contains additional fields + for (Entry entry: entries) { + if (!Pineapple.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException("The field `" + entry.getKey() + "` in the JSON string is not defined in the `Pineapple` properties"); + } + } + + return thisAdapter.fromJsonTree(obj); + } + + }.nullSafe(); + } + } +} diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java index 04a317679bd..40785f69a73 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java @@ -86,12 +86,14 @@ public class Quadrilateral extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof ComplexQuadrilateral) { JsonObject obj = adapterComplexQuadrilateral.toJsonTree((ComplexQuadrilateral)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `SimpleQuadrilateral` if (value.getActualInstance() instanceof SimpleQuadrilateral) { JsonObject obj = adapterSimpleQuadrilateral.toJsonTree((SimpleQuadrilateral)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: ComplexQuadrilateral, SimpleQuadrilateral"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java index babaf6be36f..c6ebebc4a3f 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java @@ -86,12 +86,14 @@ public class Shape extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Quadrilateral) { JsonObject obj = adapterQuadrilateral.toJsonTree((Quadrilateral)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Triangle` if (value.getActualInstance() instanceof Triangle) { JsonObject obj = adapterTriangle.toJsonTree((Triangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java index 6b413bce9a3..ddb66a3ec63 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java @@ -86,12 +86,14 @@ public class ShapeOrNull extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof Quadrilateral) { JsonObject obj = adapterQuadrilateral.toJsonTree((Quadrilateral)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `Triangle` if (value.getActualInstance() instanceof Triangle) { JsonObject obj = adapterTriangle.toJsonTree((Triangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java index f9a3276d9b1..a0f2a5847f9 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java @@ -88,18 +88,21 @@ public class Triangle extends AbstractOpenApiSchema { if (value.getActualInstance() instanceof EquilateralTriangle) { JsonObject obj = adapterEquilateralTriangle.toJsonTree((EquilateralTriangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `IsoscelesTriangle` if (value.getActualInstance() instanceof IsoscelesTriangle) { JsonObject obj = adapterIsoscelesTriangle.toJsonTree((IsoscelesTriangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } // check if the actual instance is of the type `ScaleneTriangle` if (value.getActualInstance() instanceof ScaleneTriangle) { JsonObject obj = adapterScaleneTriangle.toJsonTree((ScaleneTriangle)value.getActualInstance()).getAsJsonObject(); elementAdapter.write(out, obj); + return; } throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: EquilateralTriangle, IsoscelesTriangle, ScaleneTriangle"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java index 4c3fbb12ec5..aab71f4c462 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java @@ -286,6 +286,36 @@ public class JSONTest { return offset; } + /** + * Validate an anyOf schema can be deserialized into the expected class. + * The anyOf schema does not have a discriminator. + */ + @Test + public void testAnyOfSchemaWithoutDiscriminator() throws Exception { + { + String str = "{ \"cultivar\": \"golden delicious\", \"origin\": \"japan\" }"; + String str2 = "{ \"origin_typo\": \"japan\" }"; + + // make sure deserialization works for pojo object + Apple a = json.getGson().fromJson(str, Apple.class); + assertEquals(a.getCultivar(), "golden delicious"); + assertEquals(a.getOrigin(), "japan"); + + GmFruit o = json.getGson().fromJson(str, GmFruit.class); + assertTrue(o.getActualInstance() instanceof Apple); + Apple inst = (Apple) o.getActualInstance(); + assertEquals(inst.getCultivar(), "golden delicious"); + assertEquals(inst.getOrigin(), "japan"); + assertEquals(json.getGson().toJson(inst), "{\"cultivar\":\"golden delicious\",\"origin\":\"japan\"}"); + assertEquals(json.getGson().toJson(o), "{\"cultivar\":\"golden delicious\",\"origin\":\"japan\"}"); + + // no match + Exception exception = assertThrows(com.google.gson.JsonSyntaxException.class, () -> { + GmFruit o2 = json.getGson().fromJson(str2, GmFruit.class); + }); + } + } + /** * Validate a oneOf schema can be deserialized into the expected class. * The oneOf schema does not have a discriminator. @@ -308,6 +338,7 @@ public class JSONTest { assertEquals(inst.getCultivar(), "golden delicious"); assertEquals(inst.getMealy(), false); assertEquals(json.getGson().toJson(inst), "{\"cultivar\":\"golden delicious\",\"mealy\":false}"); + assertEquals(json.getGson().toJson(o), "{\"cultivar\":\"golden delicious\",\"mealy\":false}"); AppleReq inst2 = o.getAppleReq(); assertEquals(inst2.getCultivar(), "golden delicious"); diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/model/PineappleTest.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/model/PineappleTest.java new file mode 100644 index 00000000000..33c1e27f36e --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/model/PineappleTest.java @@ -0,0 +1,51 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for Pineapple + */ +public class PineappleTest { + private final Pineapple model = new Pineapple(); + + /** + * Model tests for Pineapple + */ + @Test + public void testPineapple() { + // TODO: test Pineapple + } + + /** + * Test the property 'origin' + */ + @Test + public void originTest() { + // TODO: test origin + } + +}