From 9db5b225b44870aca207874ce58ee0c4c056904f Mon Sep 17 00:00:00 2001 From: Ravisankar-Challa Date: Thu, 15 Apr 2021 20:37:52 +1000 Subject: [PATCH] Added a new property additionalModelTypeAnnotations that allows to add any custom annotations on to 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 +++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) 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 a48a6bb885c1..065c27263092 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 378ec210f2b5..5775ba4387ef 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 d1a2af144764..3631b9fcc4d1 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 7ade78424d82..b717c2d46651 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 {