Skip to content

Commit ca9a002

Browse files
authored
Merge pull request #10978 from Ravisankar-Challa/master
A new property additionalModelTypeAnnotations that allows to add any custom annotations on the top of generated java class model
2 parents 1d5c030 + d58737c commit ca9a002

File tree

6 files changed

+84
-2
lines changed

6 files changed

+84
-2
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.HashMap;
66
import java.util.HashSet;
77
import java.util.Iterator;
8+
import java.util.LinkedList;
89
import java.util.List;
910
import java.util.ListIterator;
1011
import java.util.Map;
@@ -63,6 +64,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
6364
public static final String DISABLE_HTML_ESCAPING = "disableHtmlEscaping";
6465
public static final String ERROR_ON_UNKNOWN_ENUM = "errorOnUnknownEnum";
6566
public static final String CHECK_DUPLICATED_MODEL_NAME = "checkDuplicatedModelName";
67+
public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "additionalModelTypeAnnotations";
6668

6769
protected String dateLibrary = "threetenbp";
6870
protected boolean supportAsync = false;
@@ -98,6 +100,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
98100
protected boolean disableHtmlEscaping = false;
99101
private NotNullAnnotationFeatures notNullOption;
100102
private IgnoreUnknownJacksonFeatures ignoreUnknown;
103+
protected List<String> additionalModelTypeAnnotations = new LinkedList<>();
101104

102105
public AbstractJavaCodegen() {
103106
super();
@@ -198,6 +201,7 @@ public AbstractJavaCodegen() {
198201

199202
cliOptions.add(CliOption.newBoolean(DISABLE_HTML_ESCAPING, "Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)"));
200203
cliOptions.add(CliOption.newBoolean(CHECK_DUPLICATED_MODEL_NAME, "Check if there are duplicated model names (ignoring case)"));
204+
cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, "Additional annotations for model type(class level annotations)"));
201205
}
202206

203207
@Override
@@ -214,6 +218,11 @@ public void processOpts() {
214218
}
215219
additionalProperties.put(DISABLE_HTML_ESCAPING, disableHtmlEscaping);
216220

221+
if (additionalProperties.containsKey(ADDITIONAL_MODEL_TYPE_ANNOTATIONS)) {
222+
String additionalAnnotationsList = additionalProperties.get(ADDITIONAL_MODEL_TYPE_ANNOTATIONS).toString();
223+
this.setAdditionalModelTypeAnnotations(Arrays.asList(additionalAnnotationsList.split(";")));
224+
}
225+
217226
if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) {
218227
this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE));
219228
} else if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) {
@@ -508,6 +517,18 @@ public void processOpts() {
508517
this.skipAliasGeneration = Boolean.TRUE;
509518
}
510519
}
520+
521+
@Override
522+
public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
523+
objs = super.postProcessAllModels(objs);
524+
if (!additionalModelTypeAnnotations.isEmpty()) {
525+
for (String modelName : objs.keySet()) {
526+
Map<String, Object> models = (Map<String, Object>) objs.get(modelName);
527+
models.put(ADDITIONAL_MODEL_TYPE_ANNOTATIONS, additionalModelTypeAnnotations);
528+
}
529+
}
530+
return objs;
531+
}
511532

512533
private void sanitizeConfig() {
513534
// Sanitize any config options here. We also have to update the additionalProperties because
@@ -1450,6 +1471,10 @@ public void setDisableHtmlEscaping(boolean disabled) {
14501471
public void setSupportAsync(boolean enabled) {
14511472
this.supportAsync = enabled;
14521473
}
1474+
1475+
public void setAdditionalModelTypeAnnotations(final List<String> additionalModelTypeAnnotations) {
1476+
this.additionalModelTypeAnnotations = additionalModelTypeAnnotations;
1477+
}
14531478

14541479
@Override
14551480
public String escapeQuotationMark(String input) {

modules/swagger-codegen/src/main/resources/JavaJaxRS/pojo.mustache

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
* {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}}
33
*/{{#description}}
44
@ApiModel(description = "{{{description}}}"){{/description}}
5-
{{>generatedAnnotation}}
5+
{{>generatedAnnotation}}{{#additionalModelTypeAnnotations}}{{{.}}}
6+
{{/additionalModelTypeAnnotations}}
67
public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} {
78
{{#vars}}
89
{{#isEnum}}

modules/swagger-codegen/src/main/resources/JavaSpring/pojo.mustache

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
{{#ignoreUnknownJacksonAnnotation}}
1919
@JsonIgnoreProperties(ignoreUnknown = true)
2020
{{/ignoreUnknownJacksonAnnotation}}
21+
{{#additionalModelTypeAnnotations}}{{{.}}}
22+
{{/additionalModelTypeAnnotations}}
2123
public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} {
2224
{{#serializableModel}}
2325
private static final long serialVersionUID = 1L;

modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,56 @@ public void testIgnoreUnknownJacksonAnnotationSpring_False() throws IOException
444444
assertFalse(FileUtils.readFileToString(model).contains("@JsonIgnoreProperties(ignoreUnknown = true)"));
445445
assertFalse(FileUtils.readFileToString(model).contains("import com.fasterxml.jackson.annotation.JsonIgnoreProperties;"));
446446
}
447+
448+
@Test
449+
public void testAdditionalModelTypeAnnotations() throws IOException {
450+
final File output = folder.getRoot();
451+
452+
CodegenConfigurator codegenConfigurator = new CodegenConfigurator();
453+
codegenConfigurator.setInputSpec("src/test/resources/2_0/allOfTest.yaml");
454+
codegenConfigurator.setOutputDir(output.getAbsolutePath());
455+
codegenConfigurator.setLang("jaxrs");
456+
457+
Map<String, Object> additionalProperties = new HashMap<>();
458+
additionalProperties.put("dateLibrary", "java8");
459+
additionalProperties.put("apiTests", false);
460+
additionalProperties.put("hideGenerationTimestamp", true);
461+
additionalProperties.put("invokerPackage", "com.mycompany.generated.client");
462+
additionalProperties.put("modelPackage", "com.mycompany.generated.client.model");
463+
additionalProperties.put("apiPackage", "com.mycompany.generated.client.api");
464+
additionalProperties.put("additionalModelTypeAnnotations",
465+
"@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true);"
466+
+ "@com.fasterxml.jackson.annotation.JsonInclude(JsonInclude.Include.NON_NULL)");
467+
468+
codegenConfigurator.setAdditionalProperties(additionalProperties);
469+
470+
Map<String, String> importMapping = new HashMap<>();
471+
472+
importMapping.put("LocalDateTime", "java.time.LocalDateTime");
473+
importMapping.put("LocalTime", "java.time.LocalTime");
474+
importMapping.put("DayOfWeek", "java.time.DayOfWeek");
475+
importMapping.put("Duration", "java.time.Duration");
476+
importMapping.put("ChronoUnit", "java.time.temporal.ChronoUnit");
477+
importMapping.put("Currency", "java.util.Currency");
478+
importMapping.put("LocalDate", "java.time.LocalDate");
479+
importMapping.put("Locale", "java.util.Locale");
480+
importMapping.put("ZoneId", "java.time.ZoneId");
481+
482+
codegenConfigurator.setImportMappings(importMapping);
483+
484+
DefaultGenerator generator = new DefaultGenerator();
485+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
486+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
487+
generator.setGeneratorPropertyDefault(CodegenConstants.API_TESTS, "false");
488+
generator.setGeneratorPropertyDefault(CodegenConstants.API_DOCS, "false");
489+
490+
//generate
491+
generator.opts(codegenConfigurator.toClientOptInput()).generate();
492+
final File model = new File(output, "src/gen/java/com/mycompany/generated/client/model/ModelOne.java");
493+
assertTrue(model.exists());
494+
assertTrue(FileUtils.readFileToString(model).contains("@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)"));
495+
assertTrue(FileUtils.readFileToString(model).contains("@com.fasterxml.jackson.annotation.JsonInclude(JsonInclude.Include.NON_NULL)"));
496+
}
447497

448498
@Test
449499
public void testSecurityWithoutGlobal() throws Exception {

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JavaOptionsProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class JavaOptionsProvider implements OptionsProvider {
3535
//public static final String SUPPORT_JAVA6 = "true";
3636
public static final String USE_BEANVALIDATION = "false";
3737
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
38+
public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "@TestAnnotation";
3839

3940

4041
private ImmutableMap<String, String> options;
@@ -76,6 +77,7 @@ public JavaOptionsProvider() {
7677
.put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE)
7778
.put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false")
7879
//.put("supportJava6", "true")
80+
.put(JavaClientCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, ADDITIONAL_MODEL_TYPE_ANNOTATIONS)
7981
.build();
8082
}
8183

modules/swagger-codegen/src/test/java/io/swagger/codegen/options/JaxRSServerOptionsProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class JaxRSServerOptionsProvider implements OptionsProvider {
4141
public static final String JAVA8_MODE_VALUE = "false";
4242
public static final String WITH_XML_VALUE = "false";
4343
public static final String USE_TAGS = "useTags";
44+
public static final String ADDITIONAL_MODEL_TYPE_ANNOTATIONS = "@TestAnnotation";
4445

4546

4647
@Override
@@ -92,7 +93,8 @@ public Map<String, String> createOptions() {
9293
.put("serverPort", "2345")
9394
.put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE)
9495
.put(JavaJerseyServerCodegen.USE_TAGS, USE_TAGS)
95-
.put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false");
96+
.put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false")
97+
.put(JavaClientCodegen.ADDITIONAL_MODEL_TYPE_ANNOTATIONS, ADDITIONAL_MODEL_TYPE_ANNOTATIONS);
9698

9799
return builder.build();
98100
}

0 commit comments

Comments
 (0)