From 7eb917a3e5d2e3d1134c367a39b2279b8c83d2c8 Mon Sep 17 00:00:00 2001 From: Ravisankar-Challa Date: Fri, 16 Apr 2021 12:37:02 +1000 Subject: [PATCH] A new property additionalModelTypeAnnotations that allows to add any custom annotations on the top of generated java class model --- .../languages/AbstractJavaCodegen.java | 25 ++++++++++ .../main/resources/JavaJaxRS/pojo.mustache | 3 +- .../main/resources/JavaSpring/pojo.mustache | 2 + .../swagger/codegen/DefaultGeneratorTest.java | 50 +++++++++++++++++++ .../codegen/options/JavaOptionsProvider.java | 2 + .../options/JaxRSServerOptionsProvider.java | 4 +- 6 files changed, 84 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java index a48a6bb885c..065c2726309 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java @@ -5,6 +5,7 @@ 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.Map; @@ -63,6 +64,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code public static final String DISABLE_HTML_ESCAPING = "disableHtmlEscaping"; public static final String ERROR_ON_UNKNOWN_ENUM = "errorOnUnknownEnum"; public static final String CHECK_DUPLICATED_MODEL_NAME = "checkDuplicatedModelName"; + public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "additionalModelTypeAnnotations"; protected String dateLibrary = "threetenbp"; protected boolean supportAsync = false; @@ -98,6 +100,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code protected boolean disableHtmlEscaping = false; private NotNullAnnotationFeatures notNullOption; private IgnoreUnknownJacksonFeatures ignoreUnknown; + protected List additionalModelTypeAnnotations = new LinkedList<>(); public AbstractJavaCodegen() { super(); @@ -198,6 +201,7 @@ public AbstractJavaCodegen() { cliOptions.add(CliOption.newBoolean(DISABLE_HTML_ESCAPING, "Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)")); cliOptions.add(CliOption.newBoolean(CHECK_DUPLICATED_MODEL_NAME, "Check if there are duplicated model names (ignoring case)")); + cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "Additional annotations for model type(class level annotations)")); } @Override @@ -214,6 +218,11 @@ public void processOpts() { } additionalProperties.put(DISABLE_HTML_ESCAPING, disableHtmlEscaping); + if (additionalProperties.containsKey(ADDITIONAL_MODEL_TYPE_ANNOTATIONS)) { + String additionalAnnotationsList = additionalProperties.get(ADDITIONAL_MODEL_TYPE_ANNOTATIONS).toString(); + this.setAdditionalModelTypeAnnotations(Arrays.asList(additionalAnnotationsList.split(";"))); + } + if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); } else if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) { @@ -508,6 +517,18 @@ public void processOpts() { this.skipAliasGeneration = Boolean.TRUE; } } + + @Override + public Map postProcessAllModels(Map objs) { + objs = super.postProcessAllModels(objs); + if (!additionalModelTypeAnnotations.isEmpty()) { + for (String modelName : objs.keySet()) { + Map models = (Map) objs.get(modelName); + models.put(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, additionalModelTypeAnnotations); + } + } + return objs; + } private void sanitizeConfig() { // Sanitize any config options here. We also have to update the additionalProperties because @@ -1450,6 +1471,10 @@ public void setDisableHtmlEscaping(boolean disabled) { public void setSupportAsync(boolean enabled) { this.supportAsync = enabled; } + + public void setAdditionalModelTypeAnnotations(final List additionalModelTypeAnnotations) { + this.additionalModelTypeAnnotations = additionalModelTypeAnnotations; + } @Override public String escapeQuotationMark(String input) { diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pojo.mustache index 378ec210f2b..5775ba4387e 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pojo.mustache @@ -2,7 +2,8 @@ * {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} */{{#description}} @ApiModel(description = "{{{description}}}"){{/description}} -{{>generatedAnnotation}} +{{>generatedAnnotation}}{{#additionalModelTypeAnnotations}}{{{.}}} +{{/additionalModelTypeAnnotations}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#vars}} {{#isEnum}} diff --git a/modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache index d1a2af14476..3631b9fcc4d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache @@ -18,6 +18,8 @@ {{#ignoreUnknownJacksonAnnotation}} @JsonIgnoreProperties(ignoreUnknown = true) {{/ignoreUnknownJacksonAnnotation}} +{{#additionalModelTypeAnnotations}}{{{.}}} +{{/additionalModelTypeAnnotations}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#serializableModel}} private static final long serialVersionUID = 1L; diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java index 7ade78424d8..b717c2d4665 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java @@ -444,6 +444,56 @@ public void testIgnoreUnknownJacksonAnnotationSpring_False() throws IOException assertFalse(FileUtils.readFileToString(model).contains("@JsonIgnoreProperties(ignoreUnknown = true)")); assertFalse(FileUtils.readFileToString(model).contains("import com.fasterxml.jackson.annotation.JsonIgnoreProperties;")); } + + @Test + public void testAdditionalModelTypeAnnotations() throws IOException { + final File output = folder.getRoot(); + + CodegenConfigurator codegenConfigurator = new CodegenConfigurator(); + codegenConfigurator.setInputSpec("src/test/resources/2_0/allOfTest.yaml"); + codegenConfigurator.setOutputDir(output.getAbsolutePath()); + codegenConfigurator.setLang("jaxrs"); + + Map additionalProperties = new HashMap<>(); + additionalProperties.put("dateLibrary", "java8"); + additionalProperties.put("apiTests", false); + additionalProperties.put("hideGenerationTimestamp", true); + additionalProperties.put("invokerPackage", "com.mycompany.generated.client"); + additionalProperties.put("modelPackage", "com.mycompany.generated.client.model"); + additionalProperties.put("apiPackage", "com.mycompany.generated.client.api"); + additionalProperties.put("additionalModelTypeAnnotations", + "@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true);" + + "@com.fasterxml.jackson.annotation.JsonInclude(JsonInclude.Include.NON_NULL)"); + + codegenConfigurator.setAdditionalProperties(additionalProperties); + + Map importMapping = new HashMap<>(); + + importMapping.put("LocalDateTime", "java.time.LocalDateTime"); + importMapping.put("LocalTime", "java.time.LocalTime"); + importMapping.put("DayOfWeek", "java.time.DayOfWeek"); + importMapping.put("Duration", "java.time.Duration"); + importMapping.put("ChronoUnit", "java.time.temporal.ChronoUnit"); + importMapping.put("Currency", "java.util.Currency"); + importMapping.put("LocalDate", "java.time.LocalDate"); + importMapping.put("Locale", "java.util.Locale"); + importMapping.put("ZoneId", "java.time.ZoneId"); + + codegenConfigurator.setImportMappings(importMapping); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.API_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.API_DOCS, "false"); + + //generate + generator.opts(codegenConfigurator.toClientOptInput()).generate(); + final File model = new File(output, "src/gen/java/com/mycompany/generated/client/model/ModelOne.java"); + assertTrue(model.exists()); + assertTrue(FileUtils.readFileToString(model).contains("@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)")); + assertTrue(FileUtils.readFileToString(model).contains("@com.fasterxml.jackson.annotation.JsonInclude(JsonInclude.Include.NON_NULL)")); + } @Test public void testSecurityWithoutGlobal() throws Exception { diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java index fc2114fdb4d..a80e90d10ce 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java @@ -35,6 +35,7 @@ public class JavaOptionsProvider implements OptionsProvider { //public static final String SUPPORT_JAVA6 = "true"; public static final String USE_BEANVALIDATION = "false"; public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false"; + public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "@TestAnnotation"; private ImmutableMap options; @@ -76,6 +77,7 @@ public JavaOptionsProvider() { .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false") //.put("supportJava6", "true") + .put(JavaClientCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, ADDITIONAL_MODEL_TYPE_ANNOTATIONS) .build(); } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java index 5f1275e1956..91a2e70da06 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java @@ -41,6 +41,7 @@ public class JaxRSServerOptionsProvider implements OptionsProvider { public static final String JAVA8_MODE_VALUE = "false"; public static final String WITH_XML_VALUE = "false"; public static final String USE_TAGS = "useTags"; + public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "@TestAnnotation"; @Override @@ -92,7 +93,8 @@ public Map createOptions() { .put("serverPort", "2345") .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(JavaJerseyServerCodegen.USE_TAGS, USE_TAGS) - .put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false"); + .put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false") + .put(JavaClientCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, ADDITIONAL_MODEL_TYPE_ANNOTATIONS); return builder.build(); }