forked from loafle/openapi-generator-original
fix anyOf in handling primitive types in java client (#16264)
This commit is contained in:
parent
1d4a6d713f
commit
5b2ceac93d
@ -8,6 +8,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
@ -27,6 +28,7 @@ import com.google.gson.JsonSerializationContext;
|
|||||||
import com.google.gson.JsonSerializer;
|
import com.google.gson.JsonSerializer;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
import {{invokerPackage}}.JSON;
|
import {{invokerPackage}}.JSON;
|
||||||
@ -43,9 +45,18 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
return null; // this class only serializes '{{classname}}' and its subtypes
|
return null; // this class only serializes '{{classname}}' and its subtypes
|
||||||
}
|
}
|
||||||
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
|
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
final TypeAdapter<{{.}}> adapter{{.}} = gson.getDelegateAdapter(this, TypeToken.get({{.}}.class));
|
{{^isArray}}
|
||||||
|
final TypeAdapter<{{{dataType}}}> adapter{{{dataType}}} = gson.getDelegateAdapter(this, TypeToken.get({{{dataType}}}.class));
|
||||||
|
{{/isArray}}
|
||||||
|
{{#isArray}}
|
||||||
|
|
||||||
|
final Type typeInstance = new TypeToken<List<{{complexType}}>>(){}.getType();
|
||||||
|
final TypeAdapter<{{{dataType}}}> adapter{{complexType}}List = (TypeAdapter<List<{{complexType}}>>) gson.getDelegateAdapter(this, TypeToken.get(typeInstance));
|
||||||
|
{{/isArray}}
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
|
{{/composedSchemas}}
|
||||||
|
|
||||||
return (TypeAdapter<T>) new TypeAdapter<{{classname}}>() {
|
return (TypeAdapter<T>) new TypeAdapter<{{classname}}>() {
|
||||||
@Override
|
@Override
|
||||||
@ -55,16 +66,34 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
// check if the actual instance is of the type `{{.}}`
|
// check if the actual instance is of the type `{{{dataType}}}`
|
||||||
if (value.getActualInstance() instanceof {{.}}) {
|
if (value.getActualInstance() instanceof {{#isArray}}List<?>{{/isArray}}{{^isArray}}{{{dataType}}}{{/isArray}}) {
|
||||||
JsonObject obj = adapter{{.}}.toJsonTree(({{.}})value.getActualInstance()).getAsJsonObject();
|
{{#isPrimitiveType}}
|
||||||
elementAdapter.write(out, obj);
|
JsonPrimitive primitive = adapter{{{dataType}}}.toJsonTree(({{{dataType}}})value.getActualInstance()).getAsJsonPrimitive();
|
||||||
|
elementAdapter.write(out, primitive);
|
||||||
|
return;
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{#isArray}}
|
||||||
|
List<?> list = (List<?>) value.getActualInstance();
|
||||||
|
if(list.get(0) instanceof {{complexType}}) {
|
||||||
|
JsonArray array = adapter{{{complexType}}}List.toJsonTree(({{{dataType}}})value.getActualInstance()).getAsJsonArray();
|
||||||
|
elementAdapter.write(out, array);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
{{/isArray}}
|
||||||
|
{{^isArray}}
|
||||||
|
{{^isPrimitiveType}}
|
||||||
|
JsonElement element = adapter{{{dataType}}}.toJsonTree(({{{dataType}}})value.getActualInstance());
|
||||||
|
elementAdapter.write(out, element);
|
||||||
|
return;
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{/isArray}}
|
||||||
}
|
}
|
||||||
|
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
throw new IOException("Failed to serialize as the type doesn't match anyOf schemas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
|
{{/composedSchemas}}
|
||||||
|
throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -72,41 +101,93 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
Object deserialized = null;
|
Object deserialized = null;
|
||||||
JsonElement jsonElement = elementAdapter.read(in);
|
JsonElement jsonElement = elementAdapter.read(in);
|
||||||
|
|
||||||
{{#useOneOfDiscriminatorLookup}}
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
{{#discriminator}}
|
TypeAdapter actualAdapter = elementAdapter;
|
||||||
// use discriminator value for faster anyOf lookup
|
|
||||||
{{classname}} new{{classname}} = new {{classname}}();
|
|
||||||
String discriminatorValue = elementAdapter.read(in).getAsJsonObject().get("{{{propertyBaseName}}}").getAsString();
|
|
||||||
switch (discriminatorValue) {
|
|
||||||
{{#mappedModels}}
|
|
||||||
case "{{{mappingName}}}":
|
|
||||||
deserialized = adapter{{modelName}}.fromJsonTree(jsonElement);
|
|
||||||
new{{classname}}.setActualInstance(deserialized);
|
|
||||||
return new{{classname}};
|
|
||||||
{{/mappedModels}}
|
|
||||||
default:
|
|
||||||
log.log(Level.WARNING, String.format("Failed to lookup discriminator value `%s` for {{classname}}. Possible values:{{#mappedModels}} {{{mappingName}}}{{/mappedModels}}", discriminatorValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
{{/discriminator}}
|
{{#composedSchemas}}
|
||||||
{{/useOneOfDiscriminatorLookup}}
|
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
|
{{^hasVars}}
|
||||||
|
// deserialize {{{dataType}}}
|
||||||
|
try {
|
||||||
|
// validate the JSON object to see if any exception is thrown
|
||||||
|
{{#isNumber}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapter{{{dataType}}};
|
||||||
|
{{/isNumber}}
|
||||||
|
{{^isNumber}}
|
||||||
|
{{#isPrimitiveType}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().is{{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}}()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type {{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}} in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapter{{{dataType}}};
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{^isPrimitiveType}}
|
||||||
|
{{^isArray}}
|
||||||
|
{{{dataType}}}.validateJsonElement(jsonElement);
|
||||||
|
actualAdapter = adapter{{{dataType}}};
|
||||||
|
{{/isArray}}
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{#isArray}}
|
||||||
|
if (!jsonElement.isJsonArray()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArray array = jsonElement.getAsJsonArray();
|
||||||
|
// validate array items
|
||||||
|
for(JsonElement element : array) {
|
||||||
|
{{#items}}
|
||||||
|
{{#isNumber}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapter{{{dataType}}};
|
||||||
|
{{/isNumber}}
|
||||||
|
{{^isNumber}}
|
||||||
|
{{#isPrimitiveType}}
|
||||||
|
if(!element.getAsJsonPrimitive().is{{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}}()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected array items to be of type {{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}} in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{^isPrimitiveType}}
|
||||||
|
{{{dataType}}}.validateJsonElement(element);
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{/items}}
|
||||||
|
}
|
||||||
|
actualAdapter = adapter{{{complexType}}}List;
|
||||||
|
{{/isArray}}
|
||||||
|
{{classname}} ret = new {{classname}}();
|
||||||
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// deserialization failed, continue
|
||||||
|
errorMessages.add(String.format("Deserialization for {{{dataType}}} failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema '{{{dataType}}}'", e);
|
||||||
|
}
|
||||||
|
{{/hasVars}}
|
||||||
|
{{#hasVars}}
|
||||||
// deserialize {{{.}}}
|
// deserialize {{{.}}}
|
||||||
try {
|
try {
|
||||||
// validate the JSON object to see if any exception is thrown
|
// validate the JSON object to see if any exception is thrown
|
||||||
{{.}}.validateJsonElement(jsonElement);
|
{{.}}.validateJsonElement(jsonElement);
|
||||||
log.log(Level.FINER, "Input data matches schema '{{{.}}}'");
|
actualAdapter = adapter{{.}};
|
||||||
{{classname}} ret = new {{classname}}();
|
{{classname}} ret = new {{classname}}();
|
||||||
ret.setActualInstance(adapter{{.}}.fromJsonTree(jsonElement));
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
return ret;
|
return ret;
|
||||||
|
log.log(Level.FINER, "Input data matches schema '{{{.}}}'");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// deserialization failed, continue
|
// deserialization failed, continue
|
||||||
|
errorMessages.add(String.format("Deserialization for {{{.}}} failed with `%s`.", e.getMessage()));
|
||||||
log.log(Level.FINER, "Input data does not match schema '{{{.}}}'", e);
|
log.log(Level.FINER, "Input data does not match schema '{{{.}}}'", e);
|
||||||
}
|
}
|
||||||
|
{{/hasVars}}
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
|
{{/composedSchemas}}
|
||||||
|
|
||||||
throw new IOException(String.format("Failed deserialization for {{classname}}: no class matched. JSON: %s", jsonElement.toString()));
|
throw new IOException(String.format("Failed deserialization for {{classname}}: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
}
|
}
|
||||||
}.nullSafe();
|
}.nullSafe();
|
||||||
}
|
}
|
||||||
@ -127,9 +208,11 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
|
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
static {
|
static {
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
schemas.put("{{{.}}}", {{{.}}}.class);
|
schemas.put("{{{dataType}}}", {{{baseType}}}.class);
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
|
{{/composedSchemas}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -143,7 +226,6 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
* {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}
|
* {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'anyOf' schemas.
|
* It could be an instance of the 'anyOf' schemas.
|
||||||
* The anyOf child schemas may themselves be a composed schema (allOf, anyOf, anyOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
@ -154,13 +236,24 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
}
|
}
|
||||||
|
|
||||||
{{/isNullable}}
|
{{/isNullable}}
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
if (instance instanceof {{{.}}}) {
|
if (instance instanceof {{#isArray}}List<?>{{/isArray}}{{^isArray}}{{{dataType}}}{{/isArray}}) {
|
||||||
|
{{#isArray}}
|
||||||
|
List<?> list = (List<?>) instance;
|
||||||
|
if(list.get(0) instanceof {{complexType}}) {
|
||||||
|
super.setActualInstance(instance);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
{{/isArray}}
|
||||||
|
{{^isArray}}
|
||||||
super.setActualInstance(instance);
|
super.setActualInstance(instance);
|
||||||
return;
|
return;
|
||||||
|
{{/isArray}}
|
||||||
}
|
}
|
||||||
|
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
|
{{/composedSchemas}}
|
||||||
throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
|
throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,19 +268,20 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
return super.getActualInstance();
|
return super.getActualInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
/**
|
/**
|
||||||
* Get the actual instance of `{{{.}}}`. If the actual instance is not `{{{.}}}`,
|
* Get the actual instance of `{{{dataType}}}`. If the actual instance is not `{{{dataType}}}`,
|
||||||
* the ClassCastException will be thrown.
|
* the ClassCastException will be thrown.
|
||||||
*
|
*
|
||||||
* @return The actual instance of `{{{.}}}`
|
* @return The actual instance of `{{{dataType}}}`
|
||||||
* @throws ClassCastException if the instance is not `{{{.}}}`
|
* @throws ClassCastException if the instance is not `{{{dataType}}}`
|
||||||
*/
|
*/
|
||||||
public {{{.}}} get{{{.}}}() throws ClassCastException {
|
public {{{dataType}}} get{{#isArray}}{{complexType}}List{{/isArray}}{{^isArray}}{{{dataType}}}{{/isArray}}() throws ClassCastException {
|
||||||
return ({{{.}}})super.getActualInstance();
|
return ({{{dataType}}})super.getActualInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
|
{{/composedSchemas}}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates the JSON Element and throws an exception if issues found
|
* Validates the JSON Element and throws an exception if issues found
|
||||||
@ -197,20 +291,69 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
*/
|
*/
|
||||||
public static void validateJsonElement(JsonElement jsonElement) throws IOException {
|
public static void validateJsonElement(JsonElement jsonElement) throws IOException {
|
||||||
// validate anyOf schemas one by one
|
// validate anyOf schemas one by one
|
||||||
int validCount = 0;
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
|
{{#composedSchemas}}
|
||||||
{{#anyOf}}
|
{{#anyOf}}
|
||||||
// validate the json string with {{{.}}}
|
// validate the json string with {{{dataType}}}
|
||||||
try {
|
try {
|
||||||
|
{{^hasVars}}
|
||||||
|
{{#isNumber}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{^isNumber}}
|
||||||
|
{{#isPrimitiveType}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().is{{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}}()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type {{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}} in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{^isPrimitiveType}}
|
||||||
|
{{^isArray}}
|
||||||
|
{{{dataType}}}.validateJsonElement(jsonElement);
|
||||||
|
{{/isArray}}
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{#isArray}}
|
||||||
|
if (!jsonElement.isJsonArray()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
JsonArray array = jsonElement.getAsJsonArray();
|
||||||
|
// validate array items
|
||||||
|
for(JsonElement element : array) {
|
||||||
|
{{#items}}
|
||||||
|
{{#isNumber}}
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{^isNumber}}
|
||||||
|
{{#isPrimitiveType}}
|
||||||
|
if(!element.getAsJsonPrimitive().is{{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}}()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected array items to be of type {{#isBoolean}}Boolean{{/isBoolean}}{{#isString}}String{{/isString}}{{^isString}}{{^isBoolean}}Number{{/isBoolean}}{{/isString}} in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{^isPrimitiveType}}
|
||||||
|
{{{dataType}}}.validateJsonElement(element);
|
||||||
|
{{/isPrimitiveType}}
|
||||||
|
{{/isNumber}}
|
||||||
|
{{/items}}
|
||||||
|
}
|
||||||
|
{{/isArray}}
|
||||||
|
{{/hasVars}}
|
||||||
|
{{#hasVars}}
|
||||||
{{{.}}}.validateJsonElement(jsonElement);
|
{{{.}}}.validateJsonElement(jsonElement);
|
||||||
return; // return earlier as at least one schema is valid with respect to the Json object
|
return;
|
||||||
//validCount++;
|
{{/hasVars}}
|
||||||
|
return;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for {{{dataType}}} failed with `%s`.", e.getMessage()));
|
||||||
// continue to the next one
|
// continue to the next one
|
||||||
}
|
}
|
||||||
{{/anyOf}}
|
{{/anyOf}}
|
||||||
if (validCount == 0) {
|
{{/composedSchemas}}
|
||||||
throw new IOException(String.format("The JSON string is invalid for {{classname}} with anyOf schemas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}. JSON: %s", jsonElement.toString()));
|
throw new IOException(String.format("The JSON string is invalid for {{classname}} with anyOf schemas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -254,7 +254,6 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
|
|||||||
* {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}
|
* {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -2308,6 +2308,13 @@ components:
|
|||||||
maxLength: 1089
|
maxLength: 1089
|
||||||
- type: number
|
- type: number
|
||||||
- type: boolean
|
- type: boolean
|
||||||
|
ScalarAnyOf:
|
||||||
|
description: Values of scalar type using anyOf
|
||||||
|
anyOf:
|
||||||
|
- type: string
|
||||||
|
maxLength: 1089
|
||||||
|
- type: number
|
||||||
|
- type: boolean
|
||||||
Array:
|
Array:
|
||||||
description: Values of array type
|
description: Values of array type
|
||||||
type: array
|
type: array
|
||||||
|
@ -173,7 +173,6 @@ public class SimpleOneOf extends AbstractOpenApiSchema implements Serializable {
|
|||||||
* Integer, String
|
* Integer, String
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -80,6 +80,7 @@ docs/Quadrilateral.md
|
|||||||
docs/QuadrilateralInterface.md
|
docs/QuadrilateralInterface.md
|
||||||
docs/ReadOnlyFirst.md
|
docs/ReadOnlyFirst.md
|
||||||
docs/Scalar.md
|
docs/Scalar.md
|
||||||
|
docs/ScalarAnyOf.md
|
||||||
docs/ScaleneTriangle.md
|
docs/ScaleneTriangle.md
|
||||||
docs/Shape.md
|
docs/Shape.md
|
||||||
docs/ShapeInterface.md
|
docs/ShapeInterface.md
|
||||||
@ -206,6 +207,7 @@ 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/QuadrilateralInterface.java
|
||||||
src/main/java/org/openapitools/client/model/ReadOnlyFirst.java
|
src/main/java/org/openapitools/client/model/ReadOnlyFirst.java
|
||||||
src/main/java/org/openapitools/client/model/Scalar.java
|
src/main/java/org/openapitools/client/model/Scalar.java
|
||||||
|
src/main/java/org/openapitools/client/model/ScalarAnyOf.java
|
||||||
src/main/java/org/openapitools/client/model/ScaleneTriangle.java
|
src/main/java/org/openapitools/client/model/ScaleneTriangle.java
|
||||||
src/main/java/org/openapitools/client/model/Shape.java
|
src/main/java/org/openapitools/client/model/Shape.java
|
||||||
src/main/java/org/openapitools/client/model/ShapeInterface.java
|
src/main/java/org/openapitools/client/model/ShapeInterface.java
|
||||||
|
@ -229,6 +229,7 @@ Class | Method | HTTP request | Description
|
|||||||
- [QuadrilateralInterface](docs/QuadrilateralInterface.md)
|
- [QuadrilateralInterface](docs/QuadrilateralInterface.md)
|
||||||
- [ReadOnlyFirst](docs/ReadOnlyFirst.md)
|
- [ReadOnlyFirst](docs/ReadOnlyFirst.md)
|
||||||
- [Scalar](docs/Scalar.md)
|
- [Scalar](docs/Scalar.md)
|
||||||
|
- [ScalarAnyOf](docs/ScalarAnyOf.md)
|
||||||
- [ScaleneTriangle](docs/ScaleneTriangle.md)
|
- [ScaleneTriangle](docs/ScaleneTriangle.md)
|
||||||
- [Shape](docs/Shape.md)
|
- [Shape](docs/Shape.md)
|
||||||
- [ShapeInterface](docs/ShapeInterface.md)
|
- [ShapeInterface](docs/ShapeInterface.md)
|
||||||
|
@ -2315,6 +2315,13 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
- type: number
|
- type: number
|
||||||
- type: boolean
|
- type: boolean
|
||||||
|
ScalarAnyOf:
|
||||||
|
anyOf:
|
||||||
|
- maxLength: 1089
|
||||||
|
type: string
|
||||||
|
- type: number
|
||||||
|
- type: boolean
|
||||||
|
description: Values of scalar type using anyOf
|
||||||
Array:
|
Array:
|
||||||
description: Values of array type
|
description: Values of array type
|
||||||
items:
|
items:
|
||||||
|
13
samples/client/petstore/java/okhttp-gson/docs/ScalarAnyOf.md
Normal file
13
samples/client/petstore/java/okhttp-gson/docs/ScalarAnyOf.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
|
||||||
|
# ScalarAnyOf
|
||||||
|
|
||||||
|
Values of scalar type using anyOf
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
|
||||||
|
| Name | Type | Description | Notes |
|
||||||
|
|------------ | ------------- | ------------- | -------------|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -292,6 +292,7 @@ public class JSON {
|
|||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.QuadrilateralInterface.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.QuadrilateralInterface.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ReadOnlyFirst.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ReadOnlyFirst.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Scalar.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Scalar.CustomTypeAdapterFactory());
|
||||||
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ScalarAnyOf.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ScaleneTriangle.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ScaleneTriangle.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Shape.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Shape.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ShapeInterface.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.ShapeInterface.CustomTypeAdapterFactory());
|
||||||
|
@ -177,7 +177,6 @@ public class Fruit extends AbstractOpenApiSchema {
|
|||||||
* Apple, Banana
|
* Apple, Banana
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -177,7 +177,6 @@ public class FruitReq extends AbstractOpenApiSchema {
|
|||||||
* AppleReq, BananaReq
|
* AppleReq, BananaReq
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -35,6 +35,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
@ -54,6 +55,7 @@ import com.google.gson.JsonSerializationContext;
|
|||||||
import com.google.gson.JsonSerializer;
|
import com.google.gson.JsonSerializer;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
import org.openapitools.client.JSON;
|
import org.openapitools.client.JSON;
|
||||||
@ -83,19 +85,17 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
|
|
||||||
// check if the actual instance is of the type `Apple`
|
// check if the actual instance is of the type `Apple`
|
||||||
if (value.getActualInstance() instanceof Apple) {
|
if (value.getActualInstance() instanceof Apple) {
|
||||||
JsonObject obj = adapterApple.toJsonTree((Apple)value.getActualInstance()).getAsJsonObject();
|
JsonElement element = adapterApple.toJsonTree((Apple)value.getActualInstance());
|
||||||
elementAdapter.write(out, obj);
|
elementAdapter.write(out, element);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if the actual instance is of the type `Banana`
|
// check if the actual instance is of the type `Banana`
|
||||||
if (value.getActualInstance() instanceof Banana) {
|
if (value.getActualInstance() instanceof Banana) {
|
||||||
JsonObject obj = adapterBanana.toJsonTree((Banana)value.getActualInstance()).getAsJsonObject();
|
JsonElement element = adapterBanana.toJsonTree((Banana)value.getActualInstance());
|
||||||
elementAdapter.write(out, obj);
|
elementAdapter.write(out, element);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: Apple, Banana");
|
||||||
throw new IOException("Failed to serialize as the type doesn't match anyOf schemas: Apple, Banana");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -103,34 +103,37 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
Object deserialized = null;
|
Object deserialized = null;
|
||||||
JsonElement jsonElement = elementAdapter.read(in);
|
JsonElement jsonElement = elementAdapter.read(in);
|
||||||
|
|
||||||
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
|
TypeAdapter actualAdapter = elementAdapter;
|
||||||
|
|
||||||
// deserialize Apple
|
// deserialize Apple
|
||||||
try {
|
try {
|
||||||
// validate the JSON object to see if any exception is thrown
|
// validate the JSON object to see if any exception is thrown
|
||||||
Apple.validateJsonElement(jsonElement);
|
Apple.validateJsonElement(jsonElement);
|
||||||
log.log(Level.FINER, "Input data matches schema 'Apple'");
|
actualAdapter = adapterApple;
|
||||||
GmFruit ret = new GmFruit();
|
GmFruit ret = new GmFruit();
|
||||||
ret.setActualInstance(adapterApple.fromJsonTree(jsonElement));
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
return ret;
|
return ret;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// deserialization failed, continue
|
// deserialization failed, continue
|
||||||
log.log(Level.FINER, "Input data does not match schema 'Apple'", e);
|
errorMessages.add(String.format("Deserialization for Apple failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema 'Apple'", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// deserialize Banana
|
// deserialize Banana
|
||||||
try {
|
try {
|
||||||
// validate the JSON object to see if any exception is thrown
|
// validate the JSON object to see if any exception is thrown
|
||||||
Banana.validateJsonElement(jsonElement);
|
Banana.validateJsonElement(jsonElement);
|
||||||
log.log(Level.FINER, "Input data matches schema 'Banana'");
|
actualAdapter = adapterBanana;
|
||||||
GmFruit ret = new GmFruit();
|
GmFruit ret = new GmFruit();
|
||||||
ret.setActualInstance(adapterBanana.fromJsonTree(jsonElement));
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
return ret;
|
return ret;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// deserialization failed, continue
|
// deserialization failed, continue
|
||||||
log.log(Level.FINER, "Input data does not match schema 'Banana'", e);
|
errorMessages.add(String.format("Deserialization for Banana failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema 'Banana'", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw new IOException(String.format("Failed deserialization for GmFruit: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
throw new IOException(String.format("Failed deserialization for GmFruit: no class matched. JSON: %s", jsonElement.toString()));
|
|
||||||
}
|
}
|
||||||
}.nullSafe();
|
}.nullSafe();
|
||||||
}
|
}
|
||||||
@ -169,7 +172,6 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
* Apple, Banana
|
* Apple, Banana
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'anyOf' schemas.
|
* It could be an instance of the 'anyOf' schemas.
|
||||||
* The anyOf child schemas may themselves be a composed schema (allOf, anyOf, anyOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
@ -207,7 +209,6 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
public Apple getApple() throws ClassCastException {
|
public Apple getApple() throws ClassCastException {
|
||||||
return (Apple)super.getActualInstance();
|
return (Apple)super.getActualInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the actual instance of `Banana`. If the actual instance is not `Banana`,
|
* Get the actual instance of `Banana`. If the actual instance is not `Banana`,
|
||||||
* the ClassCastException will be thrown.
|
* the ClassCastException will be thrown.
|
||||||
@ -219,7 +220,6 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
return (Banana)super.getActualInstance();
|
return (Banana)super.getActualInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validates the JSON Element and throws an exception if issues found
|
* Validates the JSON Element and throws an exception if issues found
|
||||||
*
|
*
|
||||||
@ -228,26 +228,25 @@ public class GmFruit extends AbstractOpenApiSchema {
|
|||||||
*/
|
*/
|
||||||
public static void validateJsonElement(JsonElement jsonElement) throws IOException {
|
public static void validateJsonElement(JsonElement jsonElement) throws IOException {
|
||||||
// validate anyOf schemas one by one
|
// validate anyOf schemas one by one
|
||||||
int validCount = 0;
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
// validate the json string with Apple
|
// validate the json string with Apple
|
||||||
try {
|
try {
|
||||||
Apple.validateJsonElement(jsonElement);
|
Apple.validateJsonElement(jsonElement);
|
||||||
return; // return earlier as at least one schema is valid with respect to the Json object
|
return;
|
||||||
//validCount++;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for Apple failed with `%s`.", e.getMessage()));
|
||||||
// continue to the next one
|
// continue to the next one
|
||||||
}
|
}
|
||||||
// validate the json string with Banana
|
// validate the json string with Banana
|
||||||
try {
|
try {
|
||||||
Banana.validateJsonElement(jsonElement);
|
Banana.validateJsonElement(jsonElement);
|
||||||
return; // return earlier as at least one schema is valid with respect to the Json object
|
return;
|
||||||
//validCount++;
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for Banana failed with `%s`.", e.getMessage()));
|
||||||
// continue to the next one
|
// continue to the next one
|
||||||
}
|
}
|
||||||
if (validCount == 0) {
|
throw new IOException(String.format("The JSON string is invalid for GmFruit with anyOf schemas: Apple, Banana. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
throw new IOException(String.format("The JSON string is invalid for GmFruit with anyOf schemas: Apple, Banana. JSON: %s", jsonElement.toString()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -228,7 +228,6 @@ public class Mammal extends AbstractOpenApiSchema {
|
|||||||
* Pig, Whale, Zebra
|
* Pig, Whale, Zebra
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -198,7 +198,6 @@ public class NullableShape extends AbstractOpenApiSchema {
|
|||||||
* Quadrilateral, Triangle
|
* Quadrilateral, Triangle
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -198,7 +198,6 @@ public class Pig extends AbstractOpenApiSchema {
|
|||||||
* BasquePig, DanishPig
|
* BasquePig, DanishPig
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -198,7 +198,6 @@ public class Quadrilateral extends AbstractOpenApiSchema {
|
|||||||
* ComplexQuadrilateral, SimpleQuadrilateral
|
* ComplexQuadrilateral, SimpleQuadrilateral
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -200,7 +200,6 @@ public class Scalar extends AbstractOpenApiSchema {
|
|||||||
* BigDecimal, Boolean, String
|
* BigDecimal, Boolean, String
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -0,0 +1,325 @@
|
|||||||
|
/*
|
||||||
|
* 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 java.math.BigDecimal;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.TypeAdapter;
|
||||||
|
import com.google.gson.TypeAdapterFactory;
|
||||||
|
import com.google.gson.reflect.TypeToken;
|
||||||
|
import com.google.gson.JsonPrimitive;
|
||||||
|
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 com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonDeserializer;
|
||||||
|
import com.google.gson.JsonSerializationContext;
|
||||||
|
import com.google.gson.JsonSerializer;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
|
import org.openapitools.client.JSON;
|
||||||
|
|
||||||
|
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen")
|
||||||
|
public class ScalarAnyOf extends AbstractOpenApiSchema {
|
||||||
|
private static final Logger log = Logger.getLogger(ScalarAnyOf.class.getName());
|
||||||
|
|
||||||
|
public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
|
||||||
|
if (!ScalarAnyOf.class.isAssignableFrom(type.getRawType())) {
|
||||||
|
return null; // this class only serializes 'ScalarAnyOf' and its subtypes
|
||||||
|
}
|
||||||
|
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
|
||||||
|
final TypeAdapter<String> adapterString = gson.getDelegateAdapter(this, TypeToken.get(String.class));
|
||||||
|
final TypeAdapter<BigDecimal> adapterBigDecimal = gson.getDelegateAdapter(this, TypeToken.get(BigDecimal.class));
|
||||||
|
final TypeAdapter<Boolean> adapterBoolean = gson.getDelegateAdapter(this, TypeToken.get(Boolean.class));
|
||||||
|
|
||||||
|
return (TypeAdapter<T>) new TypeAdapter<ScalarAnyOf>() {
|
||||||
|
@Override
|
||||||
|
public void write(JsonWriter out, ScalarAnyOf value) throws IOException {
|
||||||
|
if (value == null || value.getActualInstance() == null) {
|
||||||
|
elementAdapter.write(out, null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if the actual instance is of the type `String`
|
||||||
|
if (value.getActualInstance() instanceof String) {
|
||||||
|
JsonPrimitive primitive = adapterString.toJsonTree((String)value.getActualInstance()).getAsJsonPrimitive();
|
||||||
|
elementAdapter.write(out, primitive);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check if the actual instance is of the type `BigDecimal`
|
||||||
|
if (value.getActualInstance() instanceof BigDecimal) {
|
||||||
|
JsonElement element = adapterBigDecimal.toJsonTree((BigDecimal)value.getActualInstance());
|
||||||
|
elementAdapter.write(out, element);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check if the actual instance is of the type `Boolean`
|
||||||
|
if (value.getActualInstance() instanceof Boolean) {
|
||||||
|
JsonPrimitive primitive = adapterBoolean.toJsonTree((Boolean)value.getActualInstance()).getAsJsonPrimitive();
|
||||||
|
elementAdapter.write(out, primitive);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: BigDecimal, Boolean, String");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScalarAnyOf read(JsonReader in) throws IOException {
|
||||||
|
Object deserialized = null;
|
||||||
|
JsonElement jsonElement = elementAdapter.read(in);
|
||||||
|
|
||||||
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
|
TypeAdapter actualAdapter = elementAdapter;
|
||||||
|
|
||||||
|
// deserialize String
|
||||||
|
try {
|
||||||
|
// validate the JSON object to see if any exception is thrown
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isString()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type String in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapterString;
|
||||||
|
ScalarAnyOf ret = new ScalarAnyOf();
|
||||||
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// deserialization failed, continue
|
||||||
|
errorMessages.add(String.format("Deserialization for String failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema 'String'", e);
|
||||||
|
}
|
||||||
|
// deserialize BigDecimal
|
||||||
|
try {
|
||||||
|
// validate the JSON object to see if any exception is thrown
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapterBigDecimal;
|
||||||
|
ScalarAnyOf ret = new ScalarAnyOf();
|
||||||
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// deserialization failed, continue
|
||||||
|
errorMessages.add(String.format("Deserialization for BigDecimal failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema 'BigDecimal'", e);
|
||||||
|
}
|
||||||
|
// deserialize Boolean
|
||||||
|
try {
|
||||||
|
// validate the JSON object to see if any exception is thrown
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isBoolean()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Boolean in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
actualAdapter = adapterBoolean;
|
||||||
|
ScalarAnyOf ret = new ScalarAnyOf();
|
||||||
|
ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement));
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// deserialization failed, continue
|
||||||
|
errorMessages.add(String.format("Deserialization for Boolean failed with `%s`.", e.getMessage()));
|
||||||
|
log.log(Level.FINER, "Input data does not match schema 'Boolean'", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IOException(String.format("Failed deserialization for ScalarAnyOf: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
|
}
|
||||||
|
}.nullSafe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store a list of schema names defined in anyOf
|
||||||
|
public static final Map<String, Class<?>> schemas = new HashMap<String, Class<?>>();
|
||||||
|
|
||||||
|
public ScalarAnyOf() {
|
||||||
|
super("anyOf", Boolean.FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScalarAnyOf(BigDecimal o) {
|
||||||
|
super("anyOf", Boolean.FALSE);
|
||||||
|
setActualInstance(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScalarAnyOf(Boolean o) {
|
||||||
|
super("anyOf", Boolean.FALSE);
|
||||||
|
setActualInstance(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScalarAnyOf(String o) {
|
||||||
|
super("anyOf", Boolean.FALSE);
|
||||||
|
setActualInstance(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
schemas.put("String", String.class);
|
||||||
|
schemas.put("BigDecimal", BigDecimal.class);
|
||||||
|
schemas.put("Boolean", Boolean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Class<?>> getSchemas() {
|
||||||
|
return ScalarAnyOf.schemas;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the instance that matches the anyOf child schema, check
|
||||||
|
* the instance parameter is valid against the anyOf child schemas:
|
||||||
|
* BigDecimal, Boolean, String
|
||||||
|
*
|
||||||
|
* It could be an instance of the 'anyOf' schemas.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setActualInstance(Object instance) {
|
||||||
|
if (instance instanceof String) {
|
||||||
|
super.setActualInstance(instance);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instance instanceof BigDecimal) {
|
||||||
|
super.setActualInstance(instance);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instance instanceof Boolean) {
|
||||||
|
super.setActualInstance(instance);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException("Invalid instance type. Must be BigDecimal, Boolean, String");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the actual instance, which can be the following:
|
||||||
|
* BigDecimal, Boolean, String
|
||||||
|
*
|
||||||
|
* @return The actual instance (BigDecimal, Boolean, String)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object getActualInstance() {
|
||||||
|
return super.getActualInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the actual instance of `String`. If the actual instance is not `String`,
|
||||||
|
* the ClassCastException will be thrown.
|
||||||
|
*
|
||||||
|
* @return The actual instance of `String`
|
||||||
|
* @throws ClassCastException if the instance is not `String`
|
||||||
|
*/
|
||||||
|
public String getString() throws ClassCastException {
|
||||||
|
return (String)super.getActualInstance();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the actual instance of `BigDecimal`. If the actual instance is not `BigDecimal`,
|
||||||
|
* the ClassCastException will be thrown.
|
||||||
|
*
|
||||||
|
* @return The actual instance of `BigDecimal`
|
||||||
|
* @throws ClassCastException if the instance is not `BigDecimal`
|
||||||
|
*/
|
||||||
|
public BigDecimal getBigDecimal() throws ClassCastException {
|
||||||
|
return (BigDecimal)super.getActualInstance();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the actual instance of `Boolean`. If the actual instance is not `Boolean`,
|
||||||
|
* the ClassCastException will be thrown.
|
||||||
|
*
|
||||||
|
* @return The actual instance of `Boolean`
|
||||||
|
* @throws ClassCastException if the instance is not `Boolean`
|
||||||
|
*/
|
||||||
|
public Boolean getBoolean() throws ClassCastException {
|
||||||
|
return (Boolean)super.getActualInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the JSON Element and throws an exception if issues found
|
||||||
|
*
|
||||||
|
* @param jsonElement JSON Element
|
||||||
|
* @throws IOException if the JSON Element is invalid with respect to ScalarAnyOf
|
||||||
|
*/
|
||||||
|
public static void validateJsonElement(JsonElement jsonElement) throws IOException {
|
||||||
|
// validate anyOf schemas one by one
|
||||||
|
ArrayList<String> errorMessages = new ArrayList<>();
|
||||||
|
// validate the json string with String
|
||||||
|
try {
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isString()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type String in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for String failed with `%s`.", e.getMessage()));
|
||||||
|
// continue to the next one
|
||||||
|
}
|
||||||
|
// validate the json string with BigDecimal
|
||||||
|
try {
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for BigDecimal failed with `%s`.", e.getMessage()));
|
||||||
|
// continue to the next one
|
||||||
|
}
|
||||||
|
// validate the json string with Boolean
|
||||||
|
try {
|
||||||
|
if(!jsonElement.getAsJsonPrimitive().isBoolean()) {
|
||||||
|
throw new IllegalArgumentException(String.format("Expected json element to be of type Boolean in the JSON string but got `%s`", jsonElement.toString()));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} catch (Exception e) {
|
||||||
|
errorMessages.add(String.format("Deserialization for Boolean failed with `%s`.", e.getMessage()));
|
||||||
|
// continue to the next one
|
||||||
|
}
|
||||||
|
throw new IOException(String.format("The JSON string is invalid for ScalarAnyOf with anyOf schemas: BigDecimal, Boolean, String. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an instance of ScalarAnyOf given an JSON string
|
||||||
|
*
|
||||||
|
* @param jsonString JSON string
|
||||||
|
* @return An instance of ScalarAnyOf
|
||||||
|
* @throws IOException if the JSON string is invalid with respect to ScalarAnyOf
|
||||||
|
*/
|
||||||
|
public static ScalarAnyOf fromJson(String jsonString) throws IOException {
|
||||||
|
return JSON.getGson().fromJson(jsonString, ScalarAnyOf.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an instance of ScalarAnyOf to an JSON string
|
||||||
|
*
|
||||||
|
* @return JSON string
|
||||||
|
*/
|
||||||
|
public String toJson() {
|
||||||
|
return JSON.getGson().toJson(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -198,7 +198,6 @@ public class Shape extends AbstractOpenApiSchema {
|
|||||||
* Quadrilateral, Triangle
|
* Quadrilateral, Triangle
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -198,7 +198,6 @@ public class ShapeOrNull extends AbstractOpenApiSchema {
|
|||||||
* Quadrilateral, Triangle
|
* Quadrilateral, Triangle
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -228,7 +228,6 @@ public class Triangle extends AbstractOpenApiSchema {
|
|||||||
* EquilateralTriangle, IsoscelesTriangle, ScaleneTriangle
|
* EquilateralTriangle, IsoscelesTriangle, ScaleneTriangle
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -182,7 +182,6 @@ public class Value extends AbstractOpenApiSchema {
|
|||||||
* List<Scalar>, Scalar
|
* List<Scalar>, Scalar
|
||||||
*
|
*
|
||||||
* It could be an instance of the 'oneOf' schemas.
|
* It could be an instance of the 'oneOf' schemas.
|
||||||
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setActualInstance(Object instance) {
|
public void setActualInstance(Object instance) {
|
||||||
|
@ -740,4 +740,39 @@ public class JSONTest {
|
|||||||
p.setTypeWithUnderscore("test3");
|
p.setTypeWithUnderscore("test3");
|
||||||
assertEquals(json.getGson().toJson(p), "{\"_type\":\"test1\",\"type\":\"test2\",\"type_\":\"test3\"}");
|
assertEquals(json.getGson().toJson(p), "{\"_type\":\"test1\",\"type\":\"test2\",\"type_\":\"test3\"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate a anyOf schema can be deserialized into the expected class.
|
||||||
|
* The anyOf schema contains primitive Types.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAnyOfSchemaWithPrimitives() throws Exception {
|
||||||
|
{
|
||||||
|
// string test
|
||||||
|
String str = "\"just a string\"";
|
||||||
|
ScalarAnyOf s = json.getGson().fromJson(str, ScalarAnyOf.class);
|
||||||
|
assertTrue(s.getActualInstance() instanceof String);
|
||||||
|
assertEquals(json.getGson().toJson(s), str);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// number test
|
||||||
|
String str = "123.45";
|
||||||
|
ScalarAnyOf s = json.getGson().fromJson(str, ScalarAnyOf.class);
|
||||||
|
assertTrue(s.getActualInstance() instanceof BigDecimal);
|
||||||
|
assertEquals(json.getGson().toJson(s), str);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// boolean test
|
||||||
|
String str = "true";
|
||||||
|
ScalarAnyOf s = json.getGson().fromJson(str, ScalarAnyOf.class);
|
||||||
|
assertTrue(s.getActualInstance() instanceof Boolean);
|
||||||
|
assertEquals(json.getGson().toJson(s), str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test no match
|
||||||
|
com.google.gson.JsonSyntaxException thrown = Assertions.assertThrows(com.google.gson.JsonSyntaxException.class, () -> {
|
||||||
|
String str = "{\"id\": 5847, \"name\":\"tag test 1\"}";
|
||||||
|
ScalarAnyOf s = json.getGson().fromJson(str, ScalarAnyOf.class);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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.math.BigDecimal;
|
||||||
|
import org.junit.jupiter.api.Disabled;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model tests for ScalarAnyOf
|
||||||
|
*/
|
||||||
|
public class ScalarAnyOfTest {
|
||||||
|
private final ScalarAnyOf model = new ScalarAnyOf();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model tests for ScalarAnyOf
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testScalarAnyOf() {
|
||||||
|
// TODO: test ScalarAnyOf
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user