Skip to content

Commit

Permalink
Added a new property additionalModelTypeAnnotations that allows to ad…
Browse files Browse the repository at this point in the history
…d any custom annotations on the top of generated java class model
  • Loading branch information
Ravisankar-Challa committed Apr 15, 2021
1 parent 751e59d commit 6c94ea5
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -98,6 +100,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
protected boolean disableHtmlEscaping = false;
private NotNullAnnotationFeatures notNullOption;
private IgnoreUnknownJacksonFeatures ignoreUnknown;
protected List<String> additionalModelTypeAnnotations = new LinkedList<>();

public AbstractJavaCodegen() {
super();
Expand Down Expand Up @@ -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
Expand All @@ -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)) {
Expand Down Expand Up @@ -508,6 +517,18 @@ public void processOpts() {
this.skipAliasGeneration = Boolean.TRUE;
}
}

@Override
public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
objs = super.postProcessAllModels(objs);
if (!additionalModelTypeAnnotations.isEmpty()) {
for (String modelName : objs.keySet()) {
Map<String, Object> models = (Map<String, Object>) 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
Expand Down Expand Up @@ -1450,6 +1471,10 @@ public void setDisableHtmlEscaping(boolean disabled) {
public void setSupportAsync(boolean enabled) {
this.supportAsync = enabled;
}

public void setAdditionalModelTypeAnnotations(final List<String> additionalModelTypeAnnotations) {
this.additionalModelTypeAnnotations = additionalModelTypeAnnotations;
}

@Override
public String escapeQuotationMark(String input) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, Object> 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<String, String> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> options;
Expand Down Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -92,7 +93,8 @@ public Map<String, String> 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();
}
Expand Down

0 comments on commit 6c94ea5

Please sign in to comment.