From 3d509d8a115b3e9c84ac57d382d17e035bf91db3 Mon Sep 17 00:00:00 2001 From: pappy Date: Mon, 3 May 2021 17:53:56 +0200 Subject: [PATCH 1/4] Added `createApiComponent` configuration. --- boat-scaffold/README.md | 26 +++++++++++++++++++ .../oss/codegen/java/BoatJavaCodeGen.java | 21 +++++++++++---- .../oss/codegen/java/BoatSpringCodeGen.java | 18 ++++++------- .../libraries/resttemplate/api.mustache | 18 +++++++------ .../main/templates/boat-java/pojo.mustache | 2 +- 5 files changed, 62 insertions(+), 23 deletions(-) create mode 100644 boat-scaffold/README.md diff --git a/boat-scaffold/README.md b/boat-scaffold/README.md new file mode 100644 index 000000000..85b6059a4 --- /dev/null +++ b/boat-scaffold/README.md @@ -0,0 +1,26 @@ +# Boat OpenAPI generator + +The Boat OpenAPI generator is based on the official Open API Generator, version 4.0.3 and it provides several fixes and additional features. +The `boat` plugin has multiple goals: + +## Spring Code Generator + +| Option | Default | Description | +|-|-| +| `addBindingResult` | `false` | Adds BindingResult to Api method definitions' request bodies if UseBeanValidation true, for this to be effective you must configure UseBeanValidation, this is not done automatically | +| `addServletRequest` | `false` | Adds ServletRequest objects to API method definitions | +| `useClassLevelBeanValidation` | `false` | Adds @Validated annotation to API interfaces | +| `useLombokAnnotations` | `false` | Use Lombok annotations to generate properties accessors and `hashCode`/`equals`/`toString` methods | +| `useSetForUniqueItems` | `false` | Use `java.util.Set` for arrays that has the attribute `uniqueItems` to `true` | +| `openApiNullable` | `true` | Whether to use the `jackson-databind-nullable` library | +| `useWithModifiers` | `false` | Generates bean `with` modifiers for fluent style | + +## Java Code Generator + +| Option | Default | Description | +|-|-| +| `createApiComponent` | `true` | Whether to generate the client as a Spring component (`resttemplate` only) | +| `restTemplateBeanName` | `none` | The qualifier of the `RestTemplate` used by the `ApiClient` (`resttemplate` only) | +| `useClassLevelBeanValidation` | `false` | Adds @Validated annotation to API interfaces | +| `useJacksonConversion` | `false` | Use Jackson to convert query parameters (`resttemplate` only) | +| `useSetForUniqueItems` | `false` | Use `java.util.Set` for arrays that has the attribute `uniqueItems` to `true` | diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java index 29d2ef909..6e84f2d84 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java @@ -22,6 +22,7 @@ public class BoatJavaCodeGen extends JavaClientCodegen { public static final String USE_DEFAULT_API_CLIENT = "useDefaultApiClient"; public static final String REST_TEMPLATE_BEAN_NAME = "restTemplateBeanName"; + public static final String CREATE_API_COMPONENT = "createApiComponent"; private static final String JAVA_UTIL_SET_NEW = "new " + "java.util.LinkedHashSet<>()"; private static final String JAVA_UTIL_SET = "java.util.Set"; @@ -45,6 +46,9 @@ public class BoatJavaCodeGen extends JavaClientCodegen { @Getter @Setter protected String restTemplateBeanName; + @Getter + @Setter + protected boolean createApiComponent = true; public BoatJavaCodeGen() { this.embeddedTemplateDir = this.templateDir = NAME; @@ -61,6 +65,8 @@ public BoatJavaCodeGen() { "Whether to use a default ApiClient with a builtin template", this.useDefaultApiClient)); this.cliOptions.add(CliOption.newString(REST_TEMPLATE_BEAN_NAME, "An optional RestTemplate bean name")); + this.cliOptions.add(CliOption.newString(CREATE_API_COMPONENT, + "Whether to generate the client as a Spring component")); } @Override @@ -113,6 +119,11 @@ public void processOpts() { writePropertyBack(USE_DEFAULT_API_CLIENT, this.useDefaultApiClient); this.restTemplateBeanName = (String) this.additionalProperties.get(REST_TEMPLATE_BEAN_NAME); + + if (this.additionalProperties.containsKey(CREATE_API_COMPONENT)) { + this.createApiComponent = convertPropertyToBoolean(CREATE_API_COMPONENT); + } + writePropertyBack(CREATE_API_COMPONENT, this.createApiComponent); } if (!getLibrary().startsWith("jersey")) { @@ -142,11 +153,11 @@ public void postProcessParameter(CodegenParameter p) { if (p.isContainer && this.useSetForUniqueItems && p.getUniqueItems()) { // XXX the model set baseType to the container type, why is this different? - p.baseType = p.dataType.replaceAll("^([^<]+)<.+>$", "$1"); - p.baseType = JAVA_UTIL_SET; - p.dataType = format(JAVA_UTIL_SET_GEN, p.items.dataType); - p.datatypeWithEnum = format(JAVA_UTIL_SET_GEN, p.items.datatypeWithEnum); - p.defaultValue = JAVA_UTIL_SET_NEW; + p.baseType = p.dataType.replaceAll("^([^<]+)<.+>$", "$1"); + p.baseType = JAVA_UTIL_SET; + p.dataType = format(JAVA_UTIL_SET_GEN, p.items.dataType); + p.datatypeWithEnum = format(JAVA_UTIL_SET_GEN, p.items.datatypeWithEnum); + p.defaultValue = JAVA_UTIL_SET_NEW; } } diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java index 3b38a1b9c..d16bc50ac 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java @@ -30,7 +30,7 @@ public class BoatSpringCodeGen extends SpringCodegen { public static final String USE_SET_FOR_UNIQUE_ITEMS = "useSetForUniqueItems"; public static final String OPENAPI_NULLABLE = "openApiNullable"; public static final String USE_WITH_MODIFIERS = "useWithModifiers"; - public static final String BASE_TYPE = "java.util.Set"; + public static final String UNIQUE_BASE_TYPE = "java.util.Set"; static class NewLineIndent implements Mustache.Lambda { @@ -223,9 +223,9 @@ public void processOpts() { writePropertyBack(USE_WITH_MODIFIERS, this.useWithModifiers); if (this.useSetForUniqueItems) { - this.typeMapping.put("set", BASE_TYPE); + this.typeMapping.put("set", UNIQUE_BASE_TYPE); - this.importMapping.put("Set", BASE_TYPE); + this.importMapping.put("Set", UNIQUE_BASE_TYPE); this.importMapping.put("LinkedHashSet", "java.util.LinkedHashSet"); } @@ -241,9 +241,9 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty p) { if (p.isContainer && this.useSetForUniqueItems && p.getUniqueItems()) { p.containerType = "set"; - p.baseType = BASE_TYPE; - p.dataType = BASE_TYPE + "<" + p.items.dataType + ">"; - p.datatypeWithEnum = BASE_TYPE + "<" + p.items.datatypeWithEnum + ">"; + p.baseType = UNIQUE_BASE_TYPE; + p.dataType = UNIQUE_BASE_TYPE + "<" + p.items.dataType + ">"; + p.datatypeWithEnum = UNIQUE_BASE_TYPE + "<" + p.items.datatypeWithEnum + ">"; p.defaultValue = "new " + "java.util.LinkedHashSet<>()"; } } @@ -258,9 +258,9 @@ public void postProcessParameter(CodegenParameter p) { } if (this.useSetForUniqueItems && p.getUniqueItems()) { - p.baseType = BASE_TYPE; - p.dataType = BASE_TYPE + "<" + p.items.dataType + ">"; - p.datatypeWithEnum = BASE_TYPE + "<" + p.items.datatypeWithEnum + ">"; + p.baseType = UNIQUE_BASE_TYPE; + p.dataType = UNIQUE_BASE_TYPE + "<" + p.items.dataType + ">"; + p.datatypeWithEnum = UNIQUE_BASE_TYPE + "<" + p.items.datatypeWithEnum + ">"; p.defaultValue = "new " + "java.util.LinkedHashSet<>()"; } } diff --git a/boat-scaffold/src/main/templates/boat-java/libraries/resttemplate/api.mustache b/boat-scaffold/src/main/templates/boat-java/libraries/resttemplate/api.mustache index 99bb9075a..ab0b95a62 100644 --- a/boat-scaffold/src/main/templates/boat-java/libraries/resttemplate/api.mustache +++ b/boat-scaffold/src/main/templates/boat-java/libraries/resttemplate/api.mustache @@ -12,8 +12,9 @@ import java.util.List; import java.util.Locale; import java.util.Map;{{/fullJavaUtil}} -import org.springframework.beans.factory.annotation.Autowired; +{{#createApiComponent}}import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +{{/createApiComponent}} import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClientException; @@ -33,15 +34,15 @@ import org.springframework.validation.annotation.Validated; {{/useBeanValidation}} {{>generatedAnnotation}} -@Component("{{package}}.{{classname}}") -{{#operations}} -{{#useBeanValidation}}{{! +{{#createApiComponent}}@Component("{{package}}.{{classname}}") +{{/createApiComponent}}{{! +}}{{#useBeanValidation}}{{! }}{{#useClassLevelBeanValidation}}{{! }}@Validated {{/useClassLevelBeanValidation}}{{! }}{{/useBeanValidation}} public class {{classname}} { - private {{^useDefaultApiClient}}final {{/useDefaultApiClient}}ApiClient apiClient; + private {{#useDefaultApiClient}}final {{/useDefaultApiClient}}ApiClient apiClient; {{^useDefaultApiClient}} public {{classname}}() { @@ -49,8 +50,8 @@ public class {{classname}} { } {{/useDefaultApiClient}} - @Autowired - public {{classname}}(ApiClient apiClient) { +{{#createApiComponent}} @Autowired +{{/createApiComponent}} public {{classname}}(ApiClient apiClient) { this.apiClient = apiClient; } @@ -64,6 +65,7 @@ public class {{classname}} { } {{/useDefaultApiClient}} +{{#operations}} {{#operation}} /** * {{summary}} @@ -162,5 +164,5 @@ public class {{classname}} { return apiClient.invokeAPI(localVarPath, HttpMethod.{{httpMethod}}, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAccept, localVarContentType, localVarAuthNames, localVarReturnType); } {{/operation}} -} {{/operations}} +} diff --git a/boat-scaffold/src/main/templates/boat-java/pojo.mustache b/boat-scaffold/src/main/templates/boat-java/pojo.mustache index ab2219159..00f21a04d 100644 --- a/boat-scaffold/src/main/templates/boat-java/pojo.mustache +++ b/boat-scaffold/src/main/templates/boat-java/pojo.mustache @@ -10,7 +10,7 @@ }) {{/jackson}} {{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{>xmlAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorExtensions.x-implements}}{{#-first}}implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{ +public {{#vendorExtensions.x-abstract}}abstract {{/vendorExtensions.x-abstract}} class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorExtensions.x-implements}}{{#-first}}implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{ {{#serializableModel}} private static final long serialVersionUID = 1L; From 5db3acea6832b59d53030363299a877265ec9c40 Mon Sep 17 00:00:00 2001 From: pappy Date: Wed, 5 May 2021 17:33:19 +0200 Subject: [PATCH 2/4] Added "useProtectedFields" configuration --- boat-scaffold/README.md | 6 ++++-- .../backbase/oss/codegen/java/BoatJavaCodeGen.java | 8 ++++++++ .../backbase/oss/codegen/java/BoatSpringCodeGen.java | 11 ++++++++++- .../src/main/templates/boat-java/pojo.mustache | 8 ++++---- .../src/main/templates/boat-spring/pojo.mustache | 8 ++++---- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/boat-scaffold/README.md b/boat-scaffold/README.md index 85b6059a4..b786d5550 100644 --- a/boat-scaffold/README.md +++ b/boat-scaffold/README.md @@ -6,7 +6,7 @@ The `boat` plugin has multiple goals: ## Spring Code Generator | Option | Default | Description | -|-|-| +|-|-|-| | `addBindingResult` | `false` | Adds BindingResult to Api method definitions' request bodies if UseBeanValidation true, for this to be effective you must configure UseBeanValidation, this is not done automatically | | `addServletRequest` | `false` | Adds ServletRequest objects to API method definitions | | `useClassLevelBeanValidation` | `false` | Adds @Validated annotation to API interfaces | @@ -14,13 +14,15 @@ The `boat` plugin has multiple goals: | `useSetForUniqueItems` | `false` | Use `java.util.Set` for arrays that has the attribute `uniqueItems` to `true` | | `openApiNullable` | `true` | Whether to use the `jackson-databind-nullable` library | | `useWithModifiers` | `false` | Generates bean `with` modifiers for fluent style | +| `useProtectedFields` | `false` | Whether to use protected visibility for model fields | ## Java Code Generator | Option | Default | Description | -|-|-| +|-|-|-| | `createApiComponent` | `true` | Whether to generate the client as a Spring component (`resttemplate` only) | | `restTemplateBeanName` | `none` | The qualifier of the `RestTemplate` used by the `ApiClient` (`resttemplate` only) | | `useClassLevelBeanValidation` | `false` | Adds @Validated annotation to API interfaces | | `useJacksonConversion` | `false` | Use Jackson to convert query parameters (`resttemplate` only) | | `useSetForUniqueItems` | `false` | Use `java.util.Set` for arrays that has the attribute `uniqueItems` to `true` | +| `useProtectedFields` | `false` | "Whether to use protected visibility for model fields | diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java index 6e84f2d84..48fec14e6 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatJavaCodeGen.java @@ -23,6 +23,7 @@ public class BoatJavaCodeGen extends JavaClientCodegen { public static final String USE_DEFAULT_API_CLIENT = "useDefaultApiClient"; public static final String REST_TEMPLATE_BEAN_NAME = "restTemplateBeanName"; public static final String CREATE_API_COMPONENT = "createApiComponent"; + public static final String USE_PROTECTED_FIELDS = "useProtectedFields"; private static final String JAVA_UTIL_SET_NEW = "new " + "java.util.LinkedHashSet<>()"; private static final String JAVA_UTIL_SET = "java.util.Set"; @@ -67,6 +68,8 @@ public BoatJavaCodeGen() { "An optional RestTemplate bean name")); this.cliOptions.add(CliOption.newString(CREATE_API_COMPONENT, "Whether to generate the client as a Spring component")); + this.cliOptions.add(CliOption.newString(USE_PROTECTED_FIELDS, + "Whether to use protected visibility for model fields")); } @Override @@ -125,6 +128,11 @@ public void processOpts() { } writePropertyBack(CREATE_API_COMPONENT, this.createApiComponent); } + if (this.additionalProperties.containsKey(USE_PROTECTED_FIELDS)) { + this.additionalProperties.put("modelFieldsVisibility", "protected"); + } else { + this.additionalProperties.put("modelFieldsVisibility", "private"); + } if (!getLibrary().startsWith("jersey")) { this.supportingFiles.removeIf(f -> f.templateFile.equals("ServerConfiguration.mustache")); diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java index d16bc50ac..ff0e5cb9c 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java @@ -30,6 +30,7 @@ public class BoatSpringCodeGen extends SpringCodegen { public static final String USE_SET_FOR_UNIQUE_ITEMS = "useSetForUniqueItems"; public static final String OPENAPI_NULLABLE = "openApiNullable"; public static final String USE_WITH_MODIFIERS = "useWithModifiers"; + public static final String USE_PROTECTED_FIELDS = "useProtectedFields"; public static final String UNIQUE_BASE_TYPE = "java.util.Set"; static class NewLineIndent implements Mustache.Lambda { @@ -136,7 +137,8 @@ public BoatSpringCodeGen() { this.cliOptions.add(CliOption.newBoolean(ADD_SERVLET_REQUEST, "Adds a HttpServletRequest object to the API definition method.", this.addServletRequest)); this.cliOptions.add(CliOption.newBoolean(ADD_BINDING_RESULT, - "Adds a Binding result as method perimeter. Only implemented if @validate is being used.", this.addBindingResult)); + "Adds a Binding result as method perimeter. Only implemented if @validate is being used.", + this.addBindingResult)); this.cliOptions.add(CliOption.newBoolean(USE_LOMBOK_ANNOTATIONS, "Add Lombok to class-level Api models. Defaults to false.", this.useLombokAnnotations)); this.cliOptions.add(CliOption.newBoolean(USE_SET_FOR_UNIQUE_ITEMS, @@ -145,6 +147,8 @@ public BoatSpringCodeGen() { "Enable OpenAPI Jackson Nullable library.", this.openApiNullable)); this.cliOptions.add(CliOption.newBoolean(USE_WITH_MODIFIERS, "Whether to use \"with\" prefix for POJO modifiers.", this.useWithModifiers)); + this.cliOptions.add(CliOption.newString(USE_PROTECTED_FIELDS, + "Whether to use protected visibility for model fields")); this.apiNameSuffix = "Api"; } @@ -213,6 +217,11 @@ public void processOpts() { if (this.additionalProperties.containsKey(USE_WITH_MODIFIERS)) { this.useWithModifiers = convertPropertyToBoolean(USE_WITH_MODIFIERS); } + if (this.additionalProperties.containsKey(USE_PROTECTED_FIELDS)) { + this.additionalProperties.put("modelFieldsVisibility", "protected"); + } else { + this.additionalProperties.put("modelFieldsVisibility", "private"); + } writePropertyBack(USE_CLASS_LEVEL_BEAN_VALIDATION, this.useClassLevelBeanValidation); writePropertyBack(ADD_SERVLET_REQUEST, this.addServletRequest); diff --git a/boat-scaffold/src/main/templates/boat-java/pojo.mustache b/boat-scaffold/src/main/templates/boat-java/pojo.mustache index 00f21a04d..5029536a7 100644 --- a/boat-scaffold/src/main/templates/boat-java/pojo.mustache +++ b/boat-scaffold/src/main/templates/boat-java/pojo.mustache @@ -58,18 +58,18 @@ public {{#vendorExtensions.x-abstract}}abstract {{/vendorExtensions.x-abstract}} {{/gson}} {{#vendorExtensions.x-is-jackson-optional-nullable}} {{#isContainer}} - private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>undefined(); + {{modelFieldsVisibility}} JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>undefined(); {{/isContainer}} {{^isContainer}} - private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}}; + {{modelFieldsVisibility}} JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}}; {{/isContainer}} {{/vendorExtensions.x-is-jackson-optional-nullable}} {{^vendorExtensions.x-is-jackson-optional-nullable}} {{#isContainer}} - private {{{datatypeWithEnum}}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}{{^required}} = null{{/required}}; + {{modelFieldsVisibility}} {{{datatypeWithEnum}}} {{name}}{{#required}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/required}}{{^required}} = null{{/required}}; {{/isContainer}} {{^isContainer}} - {{#isDiscriminator}}protected{{/isDiscriminator}}{{^isDiscriminator}}private{{/isDiscriminator}} {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}; + {{#isDiscriminator}}protected{{/isDiscriminator}}{{^isDiscriminator}}{{modelFieldsVisibility}}{{/isDiscriminator}} {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/isContainer}} {{/vendorExtensions.x-is-jackson-optional-nullable}} diff --git a/boat-scaffold/src/main/templates/boat-spring/pojo.mustache b/boat-scaffold/src/main/templates/boat-spring/pojo.mustache index 90fef2e93..63c5f882b 100644 --- a/boat-scaffold/src/main/templates/boat-spring/pojo.mustache +++ b/boat-scaffold/src/main/templates/boat-spring/pojo.mustache @@ -46,10 +46,10 @@ public {{#vendorExtensions.x-abstract}}abstract {{/vendorExtensions.x-abstract}} {{/useLombokAnnotations}} {{#isContainer}} {{#openApiNullable}} - private {{>nullableDataType}} {{name}} = {{#isNullable}}JsonNullable.undefined(){{/isNullable}}{{^isNullable}}{{#required}}{{{defaultValue}}}{{/required}}{{^required}}null{{/required}}{{/isNullable}}; + {{modelFieldsVisibility}} {{>nullableDataType}} {{name}} = {{#isNullable}}JsonNullable.undefined(){{/isNullable}}{{^isNullable}}{{#required}}{{{defaultValue}}}{{/required}}{{^required}}null{{/required}}{{/isNullable}}; {{/openApiNullable}} {{^openApiNullable}} - private {{>nullableDataType}} {{name}} = {{#required}}{{{defaultValue}}}{{/required}}{{^required}}null{{/required}}; + {{modelFieldsVisibility}} {{>nullableDataType}} {{name}} = {{#required}}{{{defaultValue}}}{{/required}}{{^required}}null{{/required}}; {{/openApiNullable}} {{/isContainer}} {{^isContainer}} @@ -60,10 +60,10 @@ public {{#vendorExtensions.x-abstract}}abstract {{/vendorExtensions.x-abstract}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME) {{/isDateTime}} {{#openApiNullable}} - private {{>nullableDataType}} {{name}}{{#isNullable}} = JsonNullable.undefined(){{/isNullable}}{{^isNullable}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/isNullable}}; + {{modelFieldsVisibility}} {{>nullableDataType}} {{name}}{{#isNullable}} = JsonNullable.undefined(){{/isNullable}}{{^isNullable}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/isNullable}}; {{/openApiNullable}} {{^openApiNullable}} - private {{>nullableDataType}} {{name}}{{#isNullable}} = null{{/isNullable}}{{^isNullable}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/isNullable}}; + {{modelFieldsVisibility}} {{>nullableDataType}} {{name}}{{#isNullable}} = null{{/isNullable}}{{^isNullable}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}{{/isNullable}}; {{/openApiNullable}} {{/isContainer}} From 0d663678ca16098e8445ec8cb066a192ea578cc4 Mon Sep 17 00:00:00 2001 From: pappy Date: Fri, 7 May 2021 16:55:48 +0200 Subject: [PATCH 3/4] Log multiple input specs --- .../src/main/java/com/backbase/oss/boat/GenerateMojo.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/boat-maven-plugin/src/main/java/com/backbase/oss/boat/GenerateMojo.java b/boat-maven-plugin/src/main/java/com/backbase/oss/boat/GenerateMojo.java index cecab8539..d3193be90 100644 --- a/boat-maven-plugin/src/main/java/com/backbase/oss/boat/GenerateMojo.java +++ b/boat-maven-plugin/src/main/java/com/backbase/oss/boat/GenerateMojo.java @@ -31,6 +31,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; +import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.maven.plugin.MojoExecutionException; @@ -506,6 +507,11 @@ public void execute() throws MojoExecutionException, MojoFailureException { break; default: + String message = format("Input spec %s matches more than one single file", inputSpec); + getLog().error(message); + Stream.of(files).forEach(f -> { + getLog().error(format(" %s", f)); + }); throw new MojoExecutionException( format("Input spec %s matches more than one single file", inputSpec)); } From 6f008607bd08b2554fe7408f6db45ee995c71f65 Mon Sep 17 00:00:00 2001 From: pappy Date: Mon, 10 May 2021 14:30:54 +0300 Subject: [PATCH 4/4] Updated tests --- .../codegen/java/BoatJavaCodeGenTests.java | 27 +++++++++++++++ .../codegen/java/BoatSpringCodeGenTests.java | 33 ++++++++++++++----- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatJavaCodeGenTests.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatJavaCodeGenTests.java index 90a4be757..80e4d762e 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatJavaCodeGenTests.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatJavaCodeGenTests.java @@ -4,6 +4,7 @@ import java.util.Map; import static java.util.stream.Collectors.groupingBy; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -89,6 +90,31 @@ void processOptsWithoutRestTemplate() { assertThat(gen.restTemplateBeanName, is(nullValue())); } + @Test + void processOptsCreateApiComponent() { + final BoatJavaCodeGen gen = new BoatJavaCodeGen(); + final Map options = gen.additionalProperties(); + + options.put(CREATE_API_COMPONENT, "false"); + + gen.setLibrary("resttemplate"); + gen.processOpts(); + + assertThat(gen.createApiComponent, is(false)); + } + + @Test + void processOptsUseProtectedFields() { + final BoatJavaCodeGen gen = new BoatJavaCodeGen(); + final Map options = gen.additionalProperties(); + + options.put(USE_PROTECTED_FIELDS, "true"); + + gen.processOpts(); + + assertThat(gen.additionalProperties(), hasEntry("modelFieldsVisibility", "protected")); + } + @Test void uniquePropertyToSet() { final BoatJavaCodeGen gen = new BoatJavaCodeGen(); @@ -127,4 +153,5 @@ void uniqueParameterToSet() { assertThat(param.baseType, is("java.util.Set")); assertThat(param.dataType, is("java.util.Set")); } + } diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java index 85b85466e..105234f1c 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java @@ -1,23 +1,26 @@ package com.backbase.oss.codegen.java; +import static com.backbase.oss.codegen.java.BoatSpringCodeGen.USE_PROTECTED_FIELDS; +import static java.util.stream.Collectors.groupingBy; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import com.backbase.oss.codegen.java.BoatSpringCodeGen.NewLineIndent; import com.samskivert.mustache.Template.Fragment; import java.io.IOException; import java.io.StringWriter; +import java.util.Map; import org.junit.jupiter.api.Test; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenParameter; import org.openapitools.codegen.CodegenProperty; -import static java.util.stream.Collectors.groupingBy; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - class BoatSpringCodeGenTests { @@ -27,7 +30,7 @@ void clientOptsUnicity() { gen.cliOptions() .stream() .collect(groupingBy(CliOption::getOpt)) - .forEach((k, v) -> assertEquals( 1,v.size(), k + " is described multiple times")); + .forEach((k, v) -> assertEquals(1, v.size(), k + " is described multiple times")); } @Test @@ -69,6 +72,18 @@ void uniqueParameterToSet() { assertThat(param.dataType, is("java.util.Set")); } + @Test + void processOptsUseProtectedFields() { + final BoatJavaCodeGen gen = new BoatJavaCodeGen(); + final Map options = gen.additionalProperties(); + + options.put(USE_PROTECTED_FIELDS, "true"); + + gen.processOpts(); + + assertThat(gen.additionalProperties(), hasEntry("modelFieldsVisibility", "protected")); + } + @Test void newLineIndent() throws IOException {