forked from loafle/openapi-generator-original
auto fix self-reference schemas
This commit is contained in:
parent
462f450366
commit
d1ca82cb8b
@ -493,12 +493,64 @@ public class OpenAPINormalizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// auto fix self reference schema to avoid stack overflow
|
||||||
|
fixSelfReferenceSchema(schemaName, schema);
|
||||||
|
|
||||||
// normalize the schemas
|
// normalize the schemas
|
||||||
schemas.put(schemaName, normalizeSchema(schema, new HashSet<>()));
|
schemas.put(schemaName, normalizeSchema(schema, new HashSet<>()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto fix a self referencing schema using any type to replace the self-referencing sub-item.
|
||||||
|
*
|
||||||
|
* @param name Schema name
|
||||||
|
* @param schema Schema
|
||||||
|
*/
|
||||||
|
public void fixSelfReferenceSchema(String name, Schema schema) {
|
||||||
|
if (ModelUtils.isArraySchema(schema)) {
|
||||||
|
if (isSelfReference(name, schema.getItems())) {
|
||||||
|
LOGGER.error("Array schema {} has a sub-item referencing itself. Worked around the self-reference schema using any type instead.", name);
|
||||||
|
schema.setItems(new Schema<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ModelUtils.isOneOf(schema)) {
|
||||||
|
for (int i = 0; i < schema.getOneOf().size(); i++) {
|
||||||
|
if (isSelfReference(name, (Schema) schema.getOneOf().get(i))) {
|
||||||
|
LOGGER.error("oneOf schema {} has a sub-item referencing itself. Worked around the self-reference schema by removing it.", name);
|
||||||
|
schema.getOneOf().remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ModelUtils.isAnyOf(schema)) {
|
||||||
|
for (int i = 0; i < schema.getAnyOf().size(); i++) {
|
||||||
|
if (isSelfReference(name, (Schema) schema.getAnyOf().get(i))) {
|
||||||
|
LOGGER.error("anyOf schema {} has a sub-item referencing itself. Worked around the self-reference schema by removing it.", name);
|
||||||
|
schema.getAnyOf().remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schema.getAdditionalProperties() != null && schema.getAdditionalProperties() instanceof Schema) {
|
||||||
|
if (isSelfReference(name, (Schema) schema.getAdditionalProperties())) {
|
||||||
|
LOGGER.error("Schema {} (with additional properties) has a sub-item referencing itself. Worked around the self-reference schema using any type instead.", name);
|
||||||
|
schema.setAdditionalProperties(new Schema<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isSelfReference(String name, Schema subSchema) {
|
||||||
|
if (subSchema != null && name.equals(ModelUtils.getSimpleRef(subSchema.get$ref()))) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normalizes a schema
|
* Normalizes a schema
|
||||||
*
|
*
|
||||||
|
@ -1493,7 +1493,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
|||||||
MediaType mediaType = content.values().iterator().next();
|
MediaType mediaType = content.values().iterator().next();
|
||||||
if (mediaType.getExample() != null) {
|
if (mediaType.getExample() != null) {
|
||||||
if (isModel) {
|
if (isModel) {
|
||||||
LOGGER.warn("Ignoring complex example on request body");
|
once(LOGGER).warn("Ignoring complex example on request body");
|
||||||
} else {
|
} else {
|
||||||
codegenParameter.example = mediaType.getExample().toString();
|
codegenParameter.example = mediaType.getExample().toString();
|
||||||
return;
|
return;
|
||||||
@ -1504,7 +1504,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
|||||||
Example example = mediaType.getExamples().values().iterator().next();
|
Example example = mediaType.getExamples().values().iterator().next();
|
||||||
if (example.getValue() != null) {
|
if (example.getValue() != null) {
|
||||||
if (isModel) {
|
if (isModel) {
|
||||||
LOGGER.warn("Ignoring complex example on request body");
|
once(LOGGER).warn("Ignoring complex example on request body");
|
||||||
} else {
|
} else {
|
||||||
codegenParameter.example = example.getValue().toString();
|
codegenParameter.example = example.getValue().toString();
|
||||||
return;
|
return;
|
||||||
|
@ -1066,3 +1066,24 @@ components:
|
|||||||
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
||||||
myObject:
|
myObject:
|
||||||
type: object
|
type: object
|
||||||
|
SelfReference:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: "#/components/schemas/SelfReference"
|
||||||
|
SelfReferenceOneOf:
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
- type: boolean
|
||||||
|
- $ref: "#/components/schemas/SelfReferenceOneOf"
|
||||||
|
SelfReferenceAnyOf:
|
||||||
|
anyOf:
|
||||||
|
- type: string
|
||||||
|
- type: boolean
|
||||||
|
- $ref: "#/components/schemas/SelfReferenceAnyOf"
|
||||||
|
SelfReferenceAdditionalProperties:
|
||||||
|
type: object
|
||||||
|
additionalProperties:
|
||||||
|
$ref: "#/components/schemas/SelfReferenceAdditionalProperties"
|
||||||
|
properties:
|
||||||
|
dummy:
|
||||||
|
type: string
|
||||||
|
@ -24,6 +24,9 @@ docs/Pet.md
|
|||||||
docs/PetApi.md
|
docs/PetApi.md
|
||||||
docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md
|
docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md
|
||||||
docs/RefToRefParameterAnyofRefToAnyofParameter.md
|
docs/RefToRefParameterAnyofRefToAnyofParameter.md
|
||||||
|
docs/SelfReferenceAdditionalProperties.md
|
||||||
|
docs/SelfReferenceAnyOf.md
|
||||||
|
docs/SelfReferenceOneOf.md
|
||||||
docs/SimpleModelWithArrayProperty.md
|
docs/SimpleModelWithArrayProperty.md
|
||||||
docs/StoreApi.md
|
docs/StoreApi.md
|
||||||
docs/StringOrInt.md
|
docs/StringOrInt.md
|
||||||
@ -82,6 +85,9 @@ src/main/java/org/openapitools/client/model/Order.java
|
|||||||
src/main/java/org/openapitools/client/model/Pet.java
|
src/main/java/org/openapitools/client/model/Pet.java
|
||||||
src/main/java/org/openapitools/client/model/RefRefToPathLevelParameterOneofRefToOneofParameter.java
|
src/main/java/org/openapitools/client/model/RefRefToPathLevelParameterOneofRefToOneofParameter.java
|
||||||
src/main/java/org/openapitools/client/model/RefToRefParameterAnyofRefToAnyofParameter.java
|
src/main/java/org/openapitools/client/model/RefToRefParameterAnyofRefToAnyofParameter.java
|
||||||
|
src/main/java/org/openapitools/client/model/SelfReferenceAdditionalProperties.java
|
||||||
|
src/main/java/org/openapitools/client/model/SelfReferenceAnyOf.java
|
||||||
|
src/main/java/org/openapitools/client/model/SelfReferenceOneOf.java
|
||||||
src/main/java/org/openapitools/client/model/SimpleModelWithArrayProperty.java
|
src/main/java/org/openapitools/client/model/SimpleModelWithArrayProperty.java
|
||||||
src/main/java/org/openapitools/client/model/StringOrInt.java
|
src/main/java/org/openapitools/client/model/StringOrInt.java
|
||||||
src/main/java/org/openapitools/client/model/Tag.java
|
src/main/java/org/openapitools/client/model/Tag.java
|
||||||
|
@ -166,6 +166,9 @@ Class | Method | HTTP request | Description
|
|||||||
- [Pet](docs/Pet.md)
|
- [Pet](docs/Pet.md)
|
||||||
- [RefRefToPathLevelParameterOneofRefToOneofParameter](docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md)
|
- [RefRefToPathLevelParameterOneofRefToOneofParameter](docs/RefRefToPathLevelParameterOneofRefToOneofParameter.md)
|
||||||
- [RefToRefParameterAnyofRefToAnyofParameter](docs/RefToRefParameterAnyofRefToAnyofParameter.md)
|
- [RefToRefParameterAnyofRefToAnyofParameter](docs/RefToRefParameterAnyofRefToAnyofParameter.md)
|
||||||
|
- [SelfReferenceAdditionalProperties](docs/SelfReferenceAdditionalProperties.md)
|
||||||
|
- [SelfReferenceAnyOf](docs/SelfReferenceAnyOf.md)
|
||||||
|
- [SelfReferenceOneOf](docs/SelfReferenceOneOf.md)
|
||||||
- [SimpleModelWithArrayProperty](docs/SimpleModelWithArrayProperty.md)
|
- [SimpleModelWithArrayProperty](docs/SimpleModelWithArrayProperty.md)
|
||||||
- [StringOrInt](docs/StringOrInt.md)
|
- [StringOrInt](docs/StringOrInt.md)
|
||||||
- [Tag](docs/Tag.md)
|
- [Tag](docs/Tag.md)
|
||||||
|
@ -1160,6 +1160,22 @@ components:
|
|||||||
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
- $ref: '#/components/schemas/SimpleModelWithArrayProperty'
|
||||||
myObject:
|
myObject:
|
||||||
type: object
|
type: object
|
||||||
|
SelfReference:
|
||||||
|
items: {}
|
||||||
|
type: array
|
||||||
|
SelfReferenceOneOf:
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
- type: boolean
|
||||||
|
SelfReferenceAnyOf:
|
||||||
|
anyOf:
|
||||||
|
- type: string
|
||||||
|
- type: boolean
|
||||||
|
SelfReferenceAdditionalProperties:
|
||||||
|
additionalProperties: {}
|
||||||
|
properties:
|
||||||
|
dummy:
|
||||||
|
type: string
|
||||||
updatePetWithForm_request:
|
updatePetWithForm_request:
|
||||||
properties:
|
properties:
|
||||||
name:
|
name:
|
||||||
|
@ -137,6 +137,9 @@ public class JSON {
|
|||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefRefToPathLevelParameterOneofRefToOneofParameter.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefRefToPathLevelParameterOneofRefToOneofParameter.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefToRefParameterAnyofRefToAnyofParameter.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.RefToRefParameterAnyofRefToAnyofParameter.CustomTypeAdapterFactory());
|
||||||
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceAdditionalProperties.CustomTypeAdapterFactory());
|
||||||
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceAnyOf.CustomTypeAdapterFactory());
|
||||||
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SelfReferenceOneOf.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SimpleModelWithArrayProperty.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.SimpleModelWithArrayProperty.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.StringOrInt.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.StringOrInt.CustomTypeAdapterFactory());
|
||||||
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Tag.CustomTypeAdapterFactory());
|
gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Tag.CustomTypeAdapterFactory());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user