From 9ece1b51119638b7996c585cf96dc2bce796c3ee Mon Sep 17 00:00:00 2001 From: Guillaume TOURBIER Date: Tue, 17 Aug 2021 12:10:19 +0200 Subject: [PATCH] [Java] refactor: improve additionalModelTypeAnnotations generation (#8269) * refactor: improve additionalModelTypeAnnotations generation Split by ';' and/or newline Trim value fix: #7032 Run ./bin/generate-samples.sh to regenerate model files Revert "Run ./bin/generate-samples.sh to regenerate model files" This reverts commit da509c39f363da046fbd457e1ab67ef0f62f3561. refector: remove unnecessary import test: multiples tests for AdditionalModelTypeAnnotations Add a getter to test the list refactor: remove duplicate AdditionalModelTypeAnnotations Without using Set to avoid any side effect somewhere, I use stream and distinct to avoid duplicates refactor: using Set instead of stream Remove stream distinct for performance reason, use newHashSet Keep AdditionalModelTypeAnnotations as List doc: update info additionalModelTypeAnnotations refactor: move doc in code for autogen style: tab in java class doc: run ensure-up-to-date refactor: add imports lost in rebase docs: regenerate docs docs: update * fix: docs --- docs/generators/groovy.md | 2 +- docs/generators/java-inflector.md | 2 +- docs/generators/java-micronaut-client.md | 2 +- docs/generators/java-msf4j.md | 2 +- docs/generators/java-pkmst.md | 2 +- docs/generators/java-play-framework.md | 2 +- docs/generators/java-undertow-server.md | 2 +- docs/generators/java-vertx-web.md | 2 +- docs/generators/java-vertx.md | 2 +- docs/generators/java.md | 2 +- docs/generators/jaxrs-cxf-cdi.md | 2 +- docs/generators/jaxrs-cxf-client.md | 2 +- docs/generators/jaxrs-cxf-extended.md | 2 +- docs/generators/jaxrs-cxf.md | 2 +- docs/generators/jaxrs-jersey.md | 2 +- docs/generators/jaxrs-resteasy-eap.md | 2 +- docs/generators/jaxrs-resteasy.md | 2 +- docs/generators/jaxrs-spec.md | 2 +- docs/generators/spring.md | 2 +- .../languages/AbstractJavaCodegen.java | 58 +++++++++++- .../codegen/java/AbstractJavaCodegenTest.java | 88 +++++++++++++++++++ 21 files changed, 162 insertions(+), 22 deletions(-) diff --git a/docs/generators/groovy.md b/docs/generators/groovy.md index 4cd2af16f90..858464a52e1 100644 --- a/docs/generators/groovy.md +++ b/docs/generators/groovy.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactId|artifactId in generated pom.xml. This also becomes part of the generated library's filename| |openapi-groovy| diff --git a/docs/generators/java-inflector.md b/docs/generators/java-inflector.md index 373bc61861b..bb4d9dbb236 100644 --- a/docs/generators/java-inflector.md +++ b/docs/generators/java-inflector.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.controllers| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-micronaut-client.md b/docs/generators/java-micronaut-client.md index ab0333b9bf1..95e4cf76c36 100644 --- a/docs/generators/java-micronaut-client.md +++ b/docs/generators/java-micronaut-client.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-msf4j.md b/docs/generators/java-msf4j.md index e0d62c36cd7..cddf3dde0b7 100644 --- a/docs/generators/java-msf4j.md +++ b/docs/generators/java-msf4j.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-pkmst.md b/docs/generators/java-pkmst.md index be689abd329..073b381962c 100644 --- a/docs/generators/java-pkmst.md +++ b/docs/generators/java-pkmst.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |com.prokarma.pkmst.controller| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-play-framework.md b/docs/generators/java-play-framework.md index 3f926d08a2d..f7bf3373c7f 100644 --- a/docs/generators/java-play-framework.md +++ b/docs/generators/java-play-framework.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |controllers| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-undertow-server.md b/docs/generators/java-undertow-server.md index 9b70a6763f5..77d069151bd 100644 --- a/docs/generators/java-undertow-server.md +++ b/docs/generators/java-undertow-server.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |null| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-vertx-web.md b/docs/generators/java-vertx-web.md index 78118f1a4d7..1c14df7a90f 100644 --- a/docs/generators/java-vertx-web.md +++ b/docs/generators/java-vertx-web.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.vertxweb.server.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java-vertx.md b/docs/generators/java-vertx.md index c1b480b012a..78b0508c01d 100644 --- a/docs/generators/java-vertx.md +++ b/docs/generators/java-vertx.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.server.api.verticle| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/java.md b/docs/generators/java.md index 6de9ed101b0..df346d5e8d5 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.client.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-cxf-cdi.md b/docs/generators/jaxrs-cxf-cdi.md index 7cd7ed52c80..b604285fdbf 100644 --- a/docs/generators/jaxrs-cxf-cdi.md +++ b/docs/generators/jaxrs-cxf-cdi.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-cxf-client.md b/docs/generators/jaxrs-cxf-client.md index fb3547c920d..36393f588aa 100644 --- a/docs/generators/jaxrs-cxf-client.md +++ b/docs/generators/jaxrs-cxf-client.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-cxf-extended.md b/docs/generators/jaxrs-cxf-extended.md index 39c9dcba665..b8e1da73614 100644 --- a/docs/generators/jaxrs-cxf-extended.md +++ b/docs/generators/jaxrs-cxf-extended.md @@ -9,7 +9,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | ------ | ----------- | ------ | ------- | |addConsumesProducesJson|Add @Consumes/@Produces Json to API interface| |false| |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-cxf.md b/docs/generators/jaxrs-cxf.md index 915ec4a96b1..5958bcdd2ec 100644 --- a/docs/generators/jaxrs-cxf.md +++ b/docs/generators/jaxrs-cxf.md @@ -9,7 +9,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | ------ | ----------- | ------ | ------- | |addConsumesProducesJson|Add @Consumes/@Produces Json to API interface| |false| |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-jersey.md b/docs/generators/jaxrs-jersey.md index e79a378b7be..076d72881e3 100644 --- a/docs/generators/jaxrs-jersey.md +++ b/docs/generators/jaxrs-jersey.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-resteasy-eap.md b/docs/generators/jaxrs-resteasy-eap.md index c7b5fdd5c1e..ed99a6037ef 100644 --- a/docs/generators/jaxrs-resteasy-eap.md +++ b/docs/generators/jaxrs-resteasy-eap.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-resteasy.md b/docs/generators/jaxrs-resteasy.md index 4be73c6a6d1..e7e1a5fd228 100644 --- a/docs/generators/jaxrs-resteasy.md +++ b/docs/generators/jaxrs-resteasy.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/jaxrs-spec.md b/docs/generators/jaxrs-spec.md index 1b0425bdfc0..3f7e3c6de57 100644 --- a/docs/generators/jaxrs-spec.md +++ b/docs/generators/jaxrs-spec.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiPackage|package for generated api classes| |org.openapitools.api| |artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| diff --git a/docs/generators/spring.md b/docs/generators/spring.md index 43614a0a5aa..b5033cd4fef 100644 --- a/docs/generators/spring.md +++ b/docs/generators/spring.md @@ -8,7 +8,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |additionalEnumTypeAnnotations|Additional annotations for enum type(class level annotations)| |null| -|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations)| |null| +|additionalModelTypeAnnotations|Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)| |null| |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| |apiFirst|Generate the API from the OAI spec at server compile time (API first approach)| |false| |apiPackage|package for generated api classes| |org.openapitools.api| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index a5d05d09cb6..f4557791a99 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -17,7 +17,56 @@ package org.openapitools.codegen.languages; +import static org.openapitools.codegen.utils.StringUtils.camelize; +import static org.openapitools.codegen.utils.StringUtils.escape; +import static org.openapitools.codegen.utils.StringUtils.underscore; + +import java.io.File; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.openapitools.codegen.CliOption; +import org.openapitools.codegen.CodegenConfig; +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.DefaultCodegen; +import org.openapitools.codegen.meta.features.ClientModificationFeature; +import org.openapitools.codegen.meta.features.DocumentationFeature; +import org.openapitools.codegen.meta.features.GlobalFeature; +import org.openapitools.codegen.meta.features.SchemaSupportFeature; +import org.openapitools.codegen.meta.features.SecurityFeature; +import org.openapitools.codegen.meta.features.WireFormatFeature; +import org.openapitools.codegen.utils.ModelUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.common.base.Strings; +import com.google.common.collect.Sets; + import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; @@ -250,8 +299,8 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code cliOptions.add(CliOption.newBoolean(DISABLE_HTML_ESCAPING, "Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)", disableHtmlEscaping)); cliOptions.add(CliOption.newString(BOOLEAN_GETTER_PREFIX, "Set booleanGetterPrefix").defaultValue(this.getBooleanGetterPrefix())); cliOptions.add(CliOption.newBoolean(IGNORE_ANYOF_IN_ENUM, "Ignore anyOf keyword in enum", ignoreAnyOfInEnum)); - cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "Additional annotations for model type(class level annotations)")); cliOptions.add(CliOption.newString(ADDITIONAL_ENUM_TYPE_ANNOTATIONS, "Additional annotations for enum type(class level annotations)")); + cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "Additional annotations for model type(class level annotations). List separated by semicolon(;) or new line (Linux or Windows)")); cliOptions.add(CliOption.newBoolean(OPENAPI_NULLABLE, "Enable OpenAPI Jackson Nullable library", this.openApiNullable)); cliOptions.add(CliOption.newString(CodegenConstants.PARENT_GROUP_ID, CodegenConstants.PARENT_GROUP_ID_DESC)); @@ -297,8 +346,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code if (additionalProperties.containsKey(ADDITIONAL_MODEL_TYPE_ANNOTATIONS)) { String additionalAnnotationsList = additionalProperties.get(ADDITIONAL_MODEL_TYPE_ANNOTATIONS).toString(); - - this.setAdditionalModelTypeAnnotations(Arrays.asList(additionalAnnotationsList.split(";"))); + this.setAdditionalModelTypeAnnotations(new ArrayList<>(Sets.newHashSet(additionalAnnotationsList.trim().split("\\s*(;|\\r?\\n)\\s*")))); } if (additionalProperties.containsKey(ADDITIONAL_ENUM_TYPE_ANNOTATIONS)) { @@ -1879,6 +1927,10 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code this.parentOverridden = parentOverridden; } + public List getAdditionalModelTypeAnnotations() { + return additionalModelTypeAnnotations; + } + public void setAdditionalModelTypeAnnotations(final List additionalModelTypeAnnotations) { this.additionalModelTypeAnnotations = additionalModelTypeAnnotations; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java index 5cfeb03d57f..fe4259d2d67 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java @@ -32,7 +32,9 @@ import org.testng.annotations.Test; import java.io.File; import java.time.LocalDate; import java.time.ZoneId; +import java.util.ArrayList; import java.util.Date; +import java.util.List; public class AbstractJavaCodegenTest { @@ -200,6 +202,92 @@ public class AbstractJavaCodegenTest { Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.ARTIFACT_VERSION), "0.8.0-SNAPSHOT"); } + @Test + public void testAdditionalModelTypeAnnotationsSemiColon() throws Exception { + OpenAPI openAPI = TestUtils.createOpenAPI(); + + final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.additionalProperties().put(AbstractJavaCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "@Foo;@Bar"); + + codegen.processOpts(); + codegen.preprocessOpenAPI(openAPI); + + final List additionalModelTypeAnnotations = new ArrayList(); + additionalModelTypeAnnotations.add("@Foo"); + additionalModelTypeAnnotations.add("@Bar"); + + Assert.assertEquals(codegen.getAdditionalModelTypeAnnotations(), additionalModelTypeAnnotations); + } + + @Test + public void testAdditionalModelTypeAnnotationsNewLineLinux() throws Exception { + OpenAPI openAPI = TestUtils.createOpenAPI(); + + final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.additionalProperties().put(AbstractJavaCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "@Foo\n@Bar"); + + codegen.processOpts(); + codegen.preprocessOpenAPI(openAPI); + + final List additionalModelTypeAnnotations = new ArrayList(); + additionalModelTypeAnnotations.add("@Foo"); + additionalModelTypeAnnotations.add("@Bar"); + + Assert.assertEquals(codegen.getAdditionalModelTypeAnnotations(), additionalModelTypeAnnotations); + } + + @Test + public void testAdditionalModelTypeAnnotationsNewLineWindows() throws Exception { + OpenAPI openAPI = TestUtils.createOpenAPI(); + + final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.additionalProperties().put(AbstractJavaCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "@Foo\r\n@Bar"); + + codegen.processOpts(); + codegen.preprocessOpenAPI(openAPI); + + final List additionalModelTypeAnnotations = new ArrayList(); + additionalModelTypeAnnotations.add("@Foo"); + additionalModelTypeAnnotations.add("@Bar"); + + Assert.assertEquals(codegen.getAdditionalModelTypeAnnotations(), additionalModelTypeAnnotations); + } + + @Test + public void testAdditionalModelTypeAnnotationsMixed() throws Exception { + OpenAPI openAPI = TestUtils.createOpenAPI(); + + final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.additionalProperties().put(AbstractJavaCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, " \t @Foo;\r\n@Bar ;\n @Foobar "); + + codegen.processOpts(); + codegen.preprocessOpenAPI(openAPI); + + final List additionalModelTypeAnnotations = new ArrayList(); + additionalModelTypeAnnotations.add("@Foo"); + additionalModelTypeAnnotations.add("@Bar"); + additionalModelTypeAnnotations.add("@Foobar"); + + Assert.assertEquals(codegen.getAdditionalModelTypeAnnotations(), additionalModelTypeAnnotations); + } + + @Test + public void testAdditionalModelTypeAnnotationsNoDuplicate() throws Exception { + OpenAPI openAPI = TestUtils.createOpenAPI(); + + final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.additionalProperties().put(AbstractJavaCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "@Foo;@Bar;@Foo"); + + codegen.processOpts(); + codegen.preprocessOpenAPI(openAPI); + + final List additionalModelTypeAnnotations = new ArrayList(); + additionalModelTypeAnnotations.add("@Foo"); + additionalModelTypeAnnotations.add("@Bar"); + + Assert.assertEquals(codegen.getAdditionalModelTypeAnnotations(), additionalModelTypeAnnotations); + } + @Test public void toEnumValue() { final AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();