From 0940474c19497f8b16f3126ed79936e1f5056e9d Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 21:27:53 +0000 Subject: [PATCH 01/12] one-of-spring: Updating JavaSpring templates. - Adding support for oneOf with and without discriminators. - Created oneof_interface.mustache template. --- .../src/main/resources/JavaSpring/model.mustache | 2 +- .../src/main/resources/JavaSpring/oneof_interface.mustache | 6 ++++++ .../src/main/resources/JavaSpring/pojo.mustache | 2 +- .../main/resources/JavaSpring/typeInfoAnnotation.mustache | 7 ++++++- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/JavaSpring/oneof_interface.mustache diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache index 05eb15e10545..cc675d7e82a9 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/model.mustache @@ -47,7 +47,7 @@ import java.util.*; {{>enumOuterClass}} {{/isEnum}} {{^isEnum}} -{{>pojo}} +{{#vendorExtensions.x-is-one-of-interface}}{{>oneof_interface}}{{/vendorExtensions.x-is-one-of-interface}}{{^vendorExtensions.x-is-one-of-interface}}{{>pojo}}{{/vendorExtensions.x-is-one-of-interface}} {{/isEnum}} {{/model}} {{/models}} diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/oneof_interface.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/oneof_interface.mustache new file mode 100644 index 000000000000..7e6ddb8a69db --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaSpring/oneof_interface.mustache @@ -0,0 +1,6 @@ +{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>typeInfoAnnotation}}{{>xmlAnnotation}} +public interface {{classname}} {{#vendorExtensions.x-implements}}{{#-first}}extends {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} { +{{^vendorExtensions.x-deduction}}{{#discriminator}} + public {{propertyType}} {{propertyGetter}}(); +{{/discriminator}}{{/vendorExtensions.x-deduction}} +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache index f9bc2ae722a0..44de0a4fd45b 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache @@ -3,7 +3,7 @@ */{{#description}} {{#oas3}}@Schema({{#name}}name = "{{name}}",{{/name}}{{/oas3}}{{^oas3}}@ApiModel({{/oas3}}description = "{{{.}}}"){{/description}} {{>generatedAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{>xmlAnnotation}}{{>additionalModelTypeAnnotations}} -public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#hateoas}}extends RepresentationModel<{{classname}}> {{/hateoas}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { +public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#hateoas}}extends RepresentationModel<{{classname}}> {{/hateoas}}{{/parent}} {{^vendorExtensions.x-implements}}{{#serializableModel}}implements Serializable{{/serializableModel}}{{/vendorExtensions.x-implements}} {{#vendorExtensions.x-implements}}{{#-first}}implements {{#serializableModel}}Serializable, {{/serializableModel}}{{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{ {{#serializableModel}} private static final long serialVersionUID = 1L; diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache index 81c2ba05f903..161e594061c1 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache @@ -1,8 +1,13 @@ {{#jackson}} - +{{^vendorExtensions.x-deduction}} @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) +{{/vendorExtensions.x-deduction}}{{#vendorExtensions.x-deduction}} +@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, visible = true){{/vendorExtensions.x-deduction}} @JsonSubTypes({ {{#discriminator.mappedModels}} @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), {{/discriminator.mappedModels}} + {{#vendorExtensions.x-deduction-model-names}} + @JsonSubTypes.Type(value = {{.}}.class, name = "{{.}}"), + {{/vendorExtensions.x-deduction-model-names}} }){{/jackson}} From 2fde0cbf0e232a5b27b4fc6c8de1d5c55f2c6caa Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 21:32:38 +0000 Subject: [PATCH 02/12] one-of-spring: Updating SpringCodegen for oneOf interface imports. - Updating SpringCodegen with an implementation to add imports for one of interfaces. --- .../codegen/languages/SpringCodegen.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 297c458e3c23..e7e0291f1e6d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -144,6 +144,8 @@ public SpringCodegen() { modelPackage = "org.openapitools.model"; invokerPackage = "org.openapitools.api"; artifactId = "openapi-spring"; + useOneOfInterfaces = true; + addOneOfInterfaceImports = true; // clioOptions default redefinition need to be updated updateOption(CodegenConstants.INVOKER_PACKAGE, this.getInvokerPackage()); @@ -959,4 +961,17 @@ public void setPerformBeanValidation(boolean performBeanValidation) { public void setUseOptional(boolean useOptional) { this.useOptional = useOptional; } + + @Override + public void addImportsToOneOfInterface(List> imports) { + if (additionalProperties.containsKey(JACKSON)) { + for (String i : Arrays.asList("JsonSubTypes", "JsonTypeInfo")) { + Map oneImport = new HashMap<>(); + oneImport.put("import", importMapping.get(i)); + if (!imports.contains(oneImport)) { + imports.add(oneImport); + } + } + } + } } From dd8e52a7862105d1ea8b35c4527357b4c71aefa2 Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 22:05:29 +0000 Subject: [PATCH 03/12] one-of-spring: Updating SpringCodegen with a hook to repair inline one of. - Attempting to repair inline oneOf before calling the super. --- .../codegen/languages/SpringCodegen.java | 77 +++++++++++++++++-- .../codegen/utils/ModelUtils.java | 21 +++++ 2 files changed, 91 insertions(+), 7 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index e7e0291f1e6d..307d350debb3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -22,16 +22,15 @@ import java.io.File; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.stream.Collectors; +import io.swagger.v3.oas.models.media.ComposedSchema; +import io.swagger.v3.oas.models.media.Content; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.parameters.RequestBody; +import io.swagger.v3.oas.models.responses.ApiResponse; import org.apache.commons.lang3.tuple.Pair; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConstants; @@ -54,6 +53,7 @@ import org.openapitools.codegen.meta.features.WireFormatFeature; import org.openapitools.codegen.templating.mustache.SplitStringLambda; import org.openapitools.codegen.templating.mustache.TrimWhitespaceLambda; +import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.URLPathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -592,6 +592,7 @@ public void addOperationToGroup(String tag, String resourcePath, Operation opera @Override public void preprocessOpenAPI(OpenAPI openAPI) { + preprocessInlineOneOf(openAPI); super.preprocessOpenAPI(openAPI); /* * TODO the following logic should not need anymore in OAS 3.0 if @@ -974,4 +975,66 @@ public void addImportsToOneOfInterface(List> imports) { } } } + + private void preprocessInlineOneOf(OpenAPI openAPI) { + if (openAPI != null) { + if (openAPI.getPaths() != null) { + for (Map.Entry openAPIGetPathsEntry : openAPI.getPaths().entrySet()) { + String pathname = openAPIGetPathsEntry.getKey(); + PathItem path = openAPIGetPathsEntry.getValue(); + if (path.readOperations() == null) { + continue; + } + for (Operation operation : path.readOperations()) { + boolean hasBodyParameter = hasBodyParameter(openAPI, operation); + + // OpenAPI parser do not add Inline One Of models in Operations to Components/Schemas + if (hasBodyParameter(openAPI, operation)) { + Optional.ofNullable(operation.getRequestBody()) + .map(RequestBody::getContent) + .ifPresent(this::repairInlineOneOf); + } + if (operation.getResponses() != null) { + operation.getResponses().values().stream().map(ApiResponse::getContent) + .filter(Objects::nonNull) + .forEach(this::repairInlineOneOf); + } + } + } + } + } + } + + /** + * Add all OneOf schemas to #/components/schemas and replace them in the original content by ref schema + * Replace OneOf with unmodifiable types with an empty Schema + * + * OpenAPI Parser does not add inline OneOf schemas to models to generate + * + * @param content a 'content' section in the OAS specification. + */ + private void repairInlineOneOf(final Content content) { + content.values().forEach(mediaType -> { + final Schema replacingSchema = mediaType.getSchema(); + if (isOneOfSchema(replacingSchema)) { + if (ModelUtils.isSchemaOneOfConsistsOfCustomTypes(openAPI, replacingSchema)) { + final String oneOfModelName = (String) replacingSchema.getExtensions().get("x-one-of-name"); + final Schema newRefSchema = new Schema<>().$ref("#/components/schemas/" + oneOfModelName); + mediaType.setSchema(newRefSchema); + ModelUtils.getSchemas(openAPI).put(oneOfModelName, replacingSchema); + } else { + mediaType.setSchema(new Schema()); + } + } + }); + } + + private static boolean isOneOfSchema(final Schema schema) { + if (schema instanceof ComposedSchema) { + ComposedSchema composedSchema = (ComposedSchema) schema; + return Optional.ofNullable(composedSchema.getProperties()).map(Map::isEmpty).orElse(true) + && Optional.ofNullable(schema.getExtensions()).map(m -> m.containsKey("x-one-of-name")).orElse(false); + } + return false; + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index b5e10d5c4b60..9fb84150dce1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -1672,4 +1672,25 @@ public static SemVer getOpenApiVersion(OpenAPI openAPI, String location, List schema) { + if (schema instanceof ComposedSchema) { + ComposedSchema composedSchema = (ComposedSchema) schema; + if (composedSchema.getOneOf() == null || composedSchema.getOneOf().isEmpty()) { + return false; + } + for (Schema oneOfSchema : composedSchema.getOneOf()) { + if (oneOfSchema.get$ref() != null) { + oneOfSchema = ModelUtils.getReferencedSchema(openAPI, schema); + } + if (!(oneOfSchema instanceof ComposedSchema + || oneOfSchema instanceof MapSchema + || oneOfSchema instanceof ArraySchema + || oneOfSchema instanceof ObjectSchema)) { + return false; + } + } + } + return true; + } } From 48f729864882148ba1febe6afaaa2cdd075a419c Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 23:28:37 +0000 Subject: [PATCH 04/12] one-of-spring: Adding post processing to all models for oneOf support. - Post processing all oneOf models to add x-deduction and x-deduction-model-names vendor extensions. --- .../codegen/languages/SpringCodegen.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 307d350debb3..8ba7e3662696 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -32,16 +32,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import org.apache.commons.lang3.tuple.Pair; -import org.openapitools.codegen.CliOption; -import org.openapitools.codegen.CodegenConstants; -import org.openapitools.codegen.CodegenModel; -import org.openapitools.codegen.CodegenOperation; -import org.openapitools.codegen.CodegenParameter; -import org.openapitools.codegen.CodegenProperty; -import org.openapitools.codegen.CodegenResponse; -import org.openapitools.codegen.CodegenSecurity; -import org.openapitools.codegen.CodegenType; -import org.openapitools.codegen.SupportingFile; +import org.openapitools.codegen.*; import org.openapitools.codegen.languages.features.BeanValidationFeatures; import org.openapitools.codegen.languages.features.OptionalFeatures; import org.openapitools.codegen.languages.features.PerformBeanValidationFeatures; @@ -976,6 +967,26 @@ public void addImportsToOneOfInterface(List> imports) { } } + @Override + public Map postProcessAllModels(Map objs) { + Map postProcessedModels = super.postProcessAllModels(objs); + + for (Map.Entry modelsEntry : objs.entrySet()) { + Map modelsAttrs = (Map) modelsEntry.getValue(); + List models = (List) modelsAttrs.get("models"); + for (Object _mo : models) { + Map mo = (Map) _mo; + CodegenModel cm = (CodegenModel) mo.get("model"); + if (cm.oneOf.size() > 0) { + cm.vendorExtensions.put("x-deduction", true); + cm.vendorExtensions.put("x-deduction-model-names", cm.oneOf.toArray()); + } + } + } + + return postProcessedModels; + } + private void preprocessInlineOneOf(OpenAPI openAPI) { if (openAPI != null) { if (openAPI.getPaths() != null) { From f7dd2b589ac004e39b18fe5cdb9f4161836ddecf Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 23:41:48 +0000 Subject: [PATCH 05/12] one-of-spring: Fixing a bug where composed schema having isMap set. - Composed schema defaults to having isMap set to true if it contains additional properties, this is not the case some times. --- .../src/main/resources/JavaSpring/pojo.mustache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache index 44de0a4fd45b..e0cebbd03300 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache @@ -81,7 +81,7 @@ public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#ha return this; } {{/isArray}} - {{#isMap}} + {{#isMap}}{{#items.datatypeWithEnum}} public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) { {{^required}} @@ -92,7 +92,7 @@ public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#ha this.{{name}}.put(key, {{name}}Item); return this; } - {{/isMap}} + {{/items.datatypeWithEnum}}{{/isMap}} /** {{#description}} From 58329627c6c38a0bda81211b54427c49e9760c94 Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 23:49:48 +0000 Subject: [PATCH 06/12] one-of-spring: Fixing import all. - Fixing the squashed imports. --- .../codegen/languages/SpringCodegen.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 8ba7e3662696..c2436459973a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -22,7 +22,15 @@ import java.io.File; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.regex.Matcher; import java.util.stream.Collectors; @@ -32,7 +40,16 @@ import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.responses.ApiResponse; import org.apache.commons.lang3.tuple.Pair; -import org.openapitools.codegen.*; +import org.openapitools.codegen.CliOption; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.CodegenModel; +import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenParameter; +import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.CodegenResponse; +import org.openapitools.codegen.CodegenSecurity; +import org.openapitools.codegen.CodegenType; +import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.languages.features.BeanValidationFeatures; import org.openapitools.codegen.languages.features.OptionalFeatures; import org.openapitools.codegen.languages.features.PerformBeanValidationFeatures; From cb71af3b2a731c7ba9577033468713d45b85237f Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Mon, 29 Nov 2021 23:55:54 +0000 Subject: [PATCH 07/12] one-of-spring: Fixing spacing in generated interface. - Removing extra space in between annotation and interface. --- .../src/main/resources/JavaSpring/typeInfoAnnotation.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache index 161e594061c1..4cafb0d6ae2f 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache @@ -10,4 +10,4 @@ {{#vendorExtensions.x-deduction-model-names}} @JsonSubTypes.Type(value = {{.}}.class, name = "{{.}}"), {{/vendorExtensions.x-deduction-model-names}} -}){{/jackson}} +}){{/jackson}} \ No newline at end of file From 80b503cee9a45da1f549a498b814b51e5659f55b Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Tue, 30 Nov 2021 00:37:59 +0000 Subject: [PATCH 08/12] one-of-spring: If components are null, don't preprocess openApi. - If components are null, there is nothing to preprocess other than title etc. --- .../org/openapitools/codegen/languages/SpringCodegen.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index c2436459973a..d2f6c9f61c7d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -600,8 +600,11 @@ public void addOperationToGroup(String tag, String resourcePath, Operation opera @Override public void preprocessOpenAPI(OpenAPI openAPI) { - preprocessInlineOneOf(openAPI); - super.preprocessOpenAPI(openAPI); + if (openAPI.getComponents() != null) { + preprocessInlineOneOf(openAPI); + super.preprocessOpenAPI(openAPI); + } + /* * TODO the following logic should not need anymore in OAS 3.0 if * ("/".equals(swagger.getBasePath())) { swagger.setBasePath(""); } From 913be1b19201dd444ae2ee8a1c036c3e1a66e352 Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Tue, 30 Nov 2021 01:20:46 +0000 Subject: [PATCH 09/12] one-of-spring: Adding tests for oneOf. - Adding some test cases for oneOf code generation. --- .../java/spring/SpringCodegenTest.java | 102 ++++++++++++++++++ .../3_0/spring/oneOf_inherited_class.yaml | 46 ++++++++ .../spring/oneOf_inherited_class_array.yaml | 50 +++++++++ .../resources/3_0/spring/oneOf_interface.yaml | 52 +++++++++ .../3_0/spring/oneOf_interface_array.yaml | 51 +++++++++ .../oneOf_with_allOf_inherited_class.yaml | 46 ++++++++ ...neOf_with_allOf_inherited_class_array.yaml | 50 +++++++++ 7 files changed, 397 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class_array.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_array.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class_array.yaml diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index 8ba2950c2d3e..ba904a210704 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -21,24 +21,32 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.parameters.RequestBody; +import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.core.models.ParseOptions; import org.openapitools.codegen.*; import org.openapitools.codegen.languages.SpringCodegen; import org.openapitools.codegen.languages.features.CXFServerFeatures; +import org.openapitools.codegen.utils.ModelUtils; import org.testng.Assert; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; +import static org.junit.Assert.assertFalse; import static org.openapitools.codegen.TestUtils.assertFileContains; import static org.openapitools.codegen.TestUtils.assertFileNotContains; import static org.openapitools.codegen.languages.SpringCodegen.RESPONSE_WRAPPER; @@ -764,4 +772,98 @@ public void testConfigFileGeneration() { fail("OpenAPIDocumentationConfig.java not generated"); } } + + @Test(dataProvider = "specifications") + public void oneOfModelsGeneration(String specificationFile) throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/spring/" + specificationFile); + final CodegenConfig codegen = new SpringCodegen(); + codegen.setOpenAPI(openAPI); + codegen.setOutputDir(output.getAbsolutePath()); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + + generator.opts(input).generate(); + + final String responseCode = "200"; + final String extension = "x-one-of-name"; + final Operation operation = openAPI.getPaths().get("/addFruits").getPost(); + List oneOfModels = new ArrayList<>(); + + // If response body contains oneOf definition - add OneOf model + final ApiResponse apiResponse = operation.getResponses().get(responseCode); + final Schema responseSchema = ModelUtils.getSchemaFromResponse(apiResponse); + if (ModelUtils.isArraySchema(responseSchema)) { + Schema responseItems = ((ArraySchema) responseSchema).getItems(); + if (responseItems.get$ref() == null) { + oneOfModels.add((String) (responseItems.getExtensions().get(extension))); + } + } + + // If request body contains oneOf definition - add OneOf model + final RequestBody requestBody = operation.getRequestBody(); + final Schema requestSchema = ModelUtils.getSchemaFromRequestBody(requestBody); + if (ModelUtils.isArraySchema(requestSchema)) { + Schema requestItems = ((ArraySchema) requestSchema).getItems(); + if (requestItems.get$ref() == null) { + oneOfModels.add((String) (requestItems.getExtensions().get(extension))); + } + } + + List models = new ArrayList<>(); + // If model contains discriminator - add to OneOf models, otherwise - generic models + openAPI.getComponents().getSchemas().forEach((modelName, modelSchema) -> { + if (modelSchema.getDiscriminator() != null || (modelSchema.getExtensions() != null && modelSchema.getExtensions().containsKey("x-one-of-name"))) { + oneOfModels.add(modelName); + } else { + // exclude allOf models + if (!modelName.contains("_")) { + models.add(modelName); + } + } + }); + assertFalse(oneOfModels.isEmpty()); + + final String pathFormat = "%s/%s/%s.java"; + final String relativePath = "/src/main/java/org/openapitools/model"; + final String jacksonSubTypeFormat = "@JsonSubTypes.Type(value = %s.class, name = \"%s\"),"; + + models.forEach(modelName -> { + final String modelPath = String.format(Locale.ROOT, pathFormat, outputPath, relativePath, modelName); + + oneOfModels.forEach(oneOfModelName -> { + // Models should implement all linked OneOf interfaces + assertFileContains(Paths.get(modelPath), oneOfModelName); + + // OneOf model should contain relevant jackson annotations + final String oneOfPath = String.format(Locale.ROOT, pathFormat, outputPath, relativePath, oneOfModelName); + assertFileContains(Paths.get(oneOfPath), String.format(Locale.ROOT, jacksonSubTypeFormat, modelName, modelName)); + }); + }); + } + + @DataProvider(name = "specifications") + public static Object[][] specificationsProviderMethod() { + return new Object[][] { + { "oneOf_inherited_class.yaml" }, + { "oneOf_inherited_class_array.yaml" }, + { "oneOf_interface.yaml" }, + { "oneOf_interface_array.yaml" }, + { "oneOf_with_allOf_inherited_class.yaml" }, + { "oneOf_with_allOf_inherited_class_array.yaml" }, + }; + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class.yaml new file mode 100644 index 000000000000..d2db0731b793 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class.yaml @@ -0,0 +1,46 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "API should have import for OneOf Class, models should extend OneOf Class" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + $ref: '#/components/schemas/Fruit' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Fruit' +components: + schemas: + Fruit: + type: object + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind + Apple: + type: object + properties: + kind: + type: string + identifier: + type: string + required: + - kind + Orange: + type: object + properties: + kind: + type: string + identifier2: + type: string + required: + - kind \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class_array.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class_array.yaml new file mode 100644 index 000000000000..8e542d9d9eef --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_inherited_class_array.yaml @@ -0,0 +1,50 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "API should have import for OneOf Class, models should extend OneOf Class" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Fruit' + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Fruit' +components: + schemas: + Fruit: + type: object + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind + Apple: + type: object + properties: + kind: + type: string + identifier: + type: string + required: + - kind + Orange: + type: object + properties: + kind: + type: string + identifier2: + type: string + required: + - kind \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface.yaml new file mode 100644 index 000000000000..a35325825e59 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface.yaml @@ -0,0 +1,52 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "OneOf interface should be generated, API has link to OneOf, models implement OneOf interface" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' +components: + schemas: + Apple: + type: object + properties: + kind: + type: string + identifier: + type: string + required: + - kind + Orange: + type: object + properties: + kind: + type: string + identifier2: + type: string + required: + - kind + Fruit: + type: object + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_array.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_array.yaml new file mode 100644 index 000000000000..286c2e1a0226 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_array.yaml @@ -0,0 +1,51 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "OneOf interface should be generated, API has link to OneOf, models implement OneOf interface" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + type: array + items: + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind + requestBody: + content: + application/json: + schema: + type: array + items: + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Orange' + discriminator: + propertyName: kind +components: + schemas: + Apple: + type: object + properties: + kind: + type: string + identifier: + type: string + required: + - kind + Orange: + type: object + properties: + kind: + type: string + identifier2: + type: string + required: + - kind \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class.yaml new file mode 100644 index 000000000000..37d8afc14490 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class.yaml @@ -0,0 +1,46 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "API should have import for OneOf Class, models should extend OneOf Class" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + $ref: '#/components/schemas/Fruit' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Fruit' +components: + schemas: + Apple: + type: object + allOf: + - $ref: '#/components/schemas/Fruit' + - type: object + properties: + identifier: + type: string + Orange: + type: object + allOf: + - $ref: '#/components/schemas/Fruit' + - type: object + properties: + identifier2: + type: string + Fruit: + type: object + properties: + kind: + type: string + required: + - kind + discriminator: + propertyName: kind \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class_array.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class_array.yaml new file mode 100644 index 000000000000..17fa81801cf2 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_with_allOf_inherited_class_array.yaml @@ -0,0 +1,50 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "API should have import for OneOf Class, models should extend OneOf Class" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Fruit' + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Fruit' +components: + schemas: + Apple: + type: object + allOf: + - $ref: '#/components/schemas/Fruit' + - type: object + properties: + identifier: + type: string + Orange: + type: object + allOf: + - $ref: '#/components/schemas/Fruit' + - type: object + properties: + identifier2: + type: string + Fruit: + type: object + properties: + kind: + type: string + required: + - kind + discriminator: + propertyName: kind \ No newline at end of file From fe35a1f648600065cf236b133f6f94f6e2ad31ee Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Tue, 30 Nov 2021 01:30:44 +0000 Subject: [PATCH 10/12] one-of-spring: Adding test case for base class. --- .../codegen/languages/SpringCodegen.java | 2 +- .../java/spring/SpringCodegenTest.java | 42 +++++++++++++++++++ .../spring/oneOf_interface_base_classes.yaml | 30 +++++++++++++ ...oneOf_interface_base_classes_combined.yaml | 38 +++++++++++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes_combined.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index d2f6c9f61c7d..bb74c770bfb7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -1054,7 +1054,7 @@ private void repairInlineOneOf(final Content content) { mediaType.setSchema(newRefSchema); ModelUtils.getSchemas(openAPI).put(oneOfModelName, replacingSchema); } else { - mediaType.setSchema(new Schema()); + mediaType.setSchema(new Schema().type("object")); } } }); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index ba904a210704..d53634df749a 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -855,6 +855,40 @@ public void oneOfModelsGeneration(String specificationFile) throws IOException { }); } + @Test(dataProvider = "baseClassSpecifications") + public void oneOfShouldBeObject(String specificationFile) throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/spring/" + specificationFile); + final CodegenConfig codegen = new SpringCodegen(); + codegen.setOpenAPI(openAPI); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.setEnablePostProcessFile(true); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + + generator.opts(input).generate(); + + final String pathFormat = "%s/%s/%s.java"; + final String relativePath = "/src/main/java/org/openapitools/api"; + + // OneOf model should be replaced with object + final String oneOfPath = String.format(Locale.ROOT, pathFormat, outputPath, relativePath, "AddFruitsApi"); + assertFileContains(Paths.get(oneOfPath), "ResponseEntity", "Object body"); + } + @DataProvider(name = "specifications") public static Object[][] specificationsProviderMethod() { return new Object[][] { @@ -866,4 +900,12 @@ public static Object[][] specificationsProviderMethod() { { "oneOf_with_allOf_inherited_class_array.yaml" }, }; } + + @DataProvider(name = "baseClassSpecifications") + public static Object[][] baseClassSpecificationsProviderMethod() { + return new Object[][] { + { "oneOf_interface_base_classes.yaml" }, + { "oneOf_interface_base_classes_combined.yaml" } + }; + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes.yaml new file mode 100644 index 000000000000..71d62299351f --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes.yaml @@ -0,0 +1,30 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "OneOf interface should be generated, API has link to OneOf, models implement OneOf interface" +paths: + /addFruits: + post: + operationId: "addFruits" + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + x-one-of-name: "AddFruitsOneOf" + oneOf: + - type: string + format: date + - type: string + format: date-time + requestBody: + content: + application/json: + schema: + x-one-of-name: "AddFruitsOneOf" + oneOf: + - type: string + format: date + - type: string + format: date-time \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes_combined.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes_combined.yaml new file mode 100644 index 000000000000..5cab8ff61b06 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/oneOf_interface_base_classes_combined.yaml @@ -0,0 +1,38 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: "OneOf interface should be generated, API has link to OneOf, models implement OneOf interface" +paths: + /addFruits: + post: + responses: + '200': + description: Returns a list of fruits + content: + application/json: + schema: + x-one-of-name: "AddFruitsOneOf" + oneOf: + - type: string + format: date + - $ref: '#/components/schemas/Apple' + requestBody: + content: + application/json: + schema: + x-one-of-name: "AddFruitsOneOf" + oneOf: + - type: string + format: date + - $ref: '#/components/schemas/Apple' +components: + schemas: + Apple: + type: object + properties: + kind: + type: string + identifier: + type: string + required: + - kind \ No newline at end of file From 13a9ceef70907df410f4c88a612b70b8564a6808 Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Tue, 30 Nov 2021 01:56:21 +0000 Subject: [PATCH 11/12] one-of-spring: Updating samples. - Running /bin/generate-samples.sh - Running /bin/utils/export_docs_generators.sh Signed-off-by: Martin <7595909+martin-bucinskas@users.noreply.github.com> --- .../src/main/resources/JavaSpring/pojo.mustache | 7 ++----- .../main/resources/JavaSpring/typeInfoAnnotation.mustache | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache index e0cebbd03300..e3b264e39397 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache @@ -80,9 +80,7 @@ public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#ha {{/openApiNullable}} return this; } - {{/isArray}} - {{#isMap}}{{#items.datatypeWithEnum}} - +{{/isArray}}{{#isMap}}{{#items.datatypeWithEnum}} public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) { {{^required}} if (this.{{name}} == null) { @@ -92,8 +90,7 @@ public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{^parent}}{{#ha this.{{name}}.put(key, {{name}}Item); return this; } - {{/items.datatypeWithEnum}}{{/isMap}} - +{{/items.datatypeWithEnum}}{{/isMap}} /** {{#description}} * {{{.}}} diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache index 4cafb0d6ae2f..4a45c71db97d 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache @@ -1,7 +1,7 @@ {{#jackson}} + {{^vendorExtensions.x-deduction}} -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) -{{/vendorExtensions.x-deduction}}{{#vendorExtensions.x-deduction}} +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true){{/vendorExtensions.x-deduction}}{{#vendorExtensions.x-deduction}} @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, visible = true){{/vendorExtensions.x-deduction}} @JsonSubTypes({ {{#discriminator.mappedModels}} @@ -10,4 +10,4 @@ {{#vendorExtensions.x-deduction-model-names}} @JsonSubTypes.Type(value = {{.}}.class, name = "{{.}}"), {{/vendorExtensions.x-deduction-model-names}} -}){{/jackson}} \ No newline at end of file +}){{/jackson}} From d9c523d9f3511bf87d6bb0c82567cc9cb1ee09b6 Mon Sep 17 00:00:00 2001 From: Martin <7595909+martin-bucinskas@users.noreply.github.com> Date: Sun, 3 Apr 2022 20:04:37 +0100 Subject: [PATCH 12/12] feature/one-of-spring: Fixing merge conflicts in typeInfoAnnotation, updating tests. --- .../JavaSpring/typeInfoAnnotation.mustache | 80 ++++++------------- .../java/spring/SpringCodegenTest.java | 17 +--- 2 files changed, 25 insertions(+), 72 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache index bda40b19e6af..01ffb6bd16b4 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/typeInfoAnnotation.mustache @@ -1,61 +1,27 @@ {{#jackson}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->>>>>> 84660920873893358ad119a1306143a12399db77--> {{#discriminator.mappedModels}} - {{#-first}} - {{^vendorExtensions.x-deduction}} - @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true){{/vendorExtensions.x-deduction}}{{#vendorExtensions.x-deduction}} - @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, visible = true) - {{#vendorExtensions.x-deduction}} - @JsonIgnoreProperties( - value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization - allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization - ) - @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) - {{/vendorExtensions.x-deduction}} - @JsonSubTypes({ - {{/-first}} - {{^vendorExtensions.x-discriminator-value}} - @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{mappingName}}}"){{^-last}},{{/-last}} - {{/vendorExtensions.x-discriminator-value}} - {{#vendorExtensions.x-discriminator-value}} - @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{vendorExtensions.x-discriminator-value}}}"){{^-last}},{{/-last}} - {{/vendorExtensions.x-discriminator-value}} - {{#-last}} - }) - {{/-last}} +{{#-first}} +{{#vendorExtensions.x-deduction}} +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) +@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, visible = true) +{{/vendorExtensions.x-deduction}} +{{^vendorExtensions.x-deduction}} +@JsonIgnoreProperties( + value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization + allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization +) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true) +{{/vendorExtensions.x-deduction}} +@JsonSubTypes({ +{{/-first}} +{{^vendorExtensions.x-discriminator-value}} + @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{mappingName}}}"){{^-last}},{{/-last}} +{{/vendorExtensions.x-discriminator-value}} +{{#vendorExtensions.x-discriminator-value}} + @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{{vendorExtensions.x-discriminator-value}}}"){{^-last}},{{/-last}} +{{/vendorExtensions.x-discriminator-value}} +{{#-last}} +}) +{{/-last}} {{/discriminator.mappedModels}} {{/jackson}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index 06123f6cd128..2b3191f96e5b 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -56,14 +56,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static java.util.stream.Collectors.groupingBy; -import static org.junit.Assert.assertFalse; -import static org.openapitools.codegen.TestUtils.assertFileContains; -import static org.openapitools.codegen.TestUtils.assertFileNotContains; -import static org.openapitools.codegen.languages.SpringCodegen.RESPONSE_WRAPPER; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - import org.assertj.core.api.Assertions; import org.openapitools.codegen.java.assertions.JavaFileAssert; import org.openapitools.codegen.CliOption; @@ -77,13 +69,8 @@ import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.TestUtils; import org.openapitools.codegen.languages.AbstractJavaCodegen; -import org.openapitools.codegen.languages.SpringCodegen; -import org.openapitools.codegen.languages.features.CXFServerFeatures; import org.openapitools.codegen.languages.features.DocumentationProviderFeatures; -import org.testng.Assert; -import org.testng.annotations.DataProvider; import org.testng.annotations.Ignore; -import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; @@ -1406,11 +1393,11 @@ public void oneOfModelsGeneration(String specificationFile) throws IOException { } } }); - assertFalse(oneOfModels.isEmpty()); + Assert.assertFalse(oneOfModels.isEmpty()); final String pathFormat = "%s/%s/%s.java"; final String relativePath = "/src/main/java/org/openapitools/model"; - final String jacksonSubTypeFormat = "@JsonSubTypes.Type(value = %s.class, name = \"%s\"),"; + final String jacksonSubTypeFormat = "@JsonSubTypes.Type(value = %s.class, name = \"%s\")"; models.forEach(modelName -> { final String modelPath = String.format(Locale.ROOT, pathFormat, outputPath, relativePath, modelName);