From e3fe12eacf2a72c6870ccd876692b686d46e718f Mon Sep 17 00:00:00 2001 From: Thibault Duperron Date: Fri, 21 Jun 2019 16:13:19 +0200 Subject: [PATCH] Merge java8 doc for spring (#3122) fix #3117 --- docs/generators/spring.md | 3 +-- .../codegen/languages/AbstractJavaCodegen.java | 2 +- .../codegen/languages/SpringCodegen.java | 10 ++++++++-- .../codegen/java/spring/SpringCodegenTest.java | 15 +++++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/generators/spring.md b/docs/generators/spring.md index 93bff4469ad..eed7875d227 100644 --- a/docs/generators/spring.md +++ b/docs/generators/spring.md @@ -35,7 +35,7 @@ sidebar_label: spring |hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |false| |withXml|whether to include support for application/xml content type and include XML annotations in the model (works with libraries that provide support for JSON and XML)| |false| |dateLibrary|Option. Date library to use|
**joda**
Joda (for legacy app only)
**legacy**
Legacy java.util.Date (if you really have a good reason not to use threetenbp
**java8-localdatetime**
Java 8 using LocalDateTime (for legacy app only)
**java8**
Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true
**threetenbp**
Backport of JSR310 (preferred for jdk < 1.8)
|threetenbp| -|java8|Option. Use Java8 classes instead of third party equivalents|
**true**
Use Java 8 classes such as Base64
**false**
Various third party libraries as needed
|false| +|java8|Option. Use Java8 classes instead of third party equivalents|
**true**
Use Java 8 classes such as Base64. Use java8 default interface when a responseWrapper is used
**false**
Various third party libraries as needed
|false| |disableHtmlEscaping|Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)| |false| |booleanGetterPrefix|Set booleanGetterPrefix| |get| |parentGroupId|parent groupId in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null| @@ -48,7 +48,6 @@ sidebar_label: spring |interfaceOnly|Whether to generate only API interface stubs without the server files.| |false| |delegatePattern|Whether to generate the server files using the delegate pattern| |false| |singleContentTypes|Whether to select only one produces/consumes content-type by operation.| |false| -|java8|use java8 default interface| |true| |async|use async Callable controllers| |false| |reactive|wrap responses in Mono/Flux Reactor types (spring-boot only)| |false| |responseWrapper|wrap the responses in given type (Future,Callable,CompletableFuture,ListenableFuture,DeferredResult,HystrixCommand,RxObservable,RxSingle or fully qualified type)| |null| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 0ef33cf0480..882fccb4a21 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -175,7 +175,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code dateLibrary.setEnum(dateOptions); cliOptions.add(dateLibrary); - CliOption java8Mode = new CliOption(JAVA8_MODE, "Option. Use Java8 classes instead of third party equivalents").defaultValue(String.valueOf(this.java8Mode)); + CliOption java8Mode = CliOption.newBoolean(JAVA8_MODE, "Option. Use Java8 classes instead of third party equivalents", this.java8Mode); Map java8ModeOptions = new HashMap<>(); java8ModeOptions.put("true", "Use Java 8 classes such as Base64"); java8ModeOptions.put("false", "Various third party libraries as needed"); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index fdaa2bce4e5..4e2c694fd8b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -21,7 +21,6 @@ import com.samskivert.mustache.Mustache; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.openapitools.codegen.*; import org.openapitools.codegen.languages.features.BeanValidationFeatures; @@ -117,7 +116,7 @@ public class SpringCodegen extends AbstractJavaCodegen cliOptions.add(CliOption.newBoolean(INTERFACE_ONLY, "Whether to generate only API interface stubs without the server files.", interfaceOnly)); cliOptions.add(CliOption.newBoolean(DELEGATE_PATTERN, "Whether to generate the server files using the delegate pattern", delegatePattern)); cliOptions.add(CliOption.newBoolean(SINGLE_CONTENT_TYPES, "Whether to select only one produces/consumes content-type by operation.", singleContentTypes)); - cliOptions.add(CliOption.newBoolean(JAVA_8, "use java8 default interface", java8)); + updateJava8CliOptions(); cliOptions.add(CliOption.newBoolean(ASYNC, "use async Callable controllers", async)); cliOptions.add(CliOption.newBoolean(REACTIVE, "wrap responses in Mono/Flux Reactor types (spring-boot only)", reactive)); cliOptions.add(new CliOption(RESPONSE_WRAPPER, "wrap the responses in given type (Future,Callable,CompletableFuture,ListenableFuture,DeferredResult,HystrixCommand,RxObservable,RxSingle or fully qualified type)")); @@ -142,6 +141,13 @@ public class SpringCodegen extends AbstractJavaCodegen } + private void updateJava8CliOptions() { + CliOption option = cliOptions.stream().filter(o -> JAVA_8.equals(o.getOpt())).findFirst() + .orElseThrow(() -> new RuntimeException("Missing java8 option")); + Map java8ModeOptions = option.getEnum(); + java8ModeOptions.put("true", "Use Java 8 classes such as Base64. Use java8 default interface when a responseWrapper is used"); + } + @Override public CodegenType getTag() { return CodegenType.SERVER; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index 9a95e857d8a..f9dec31da46 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -22,6 +22,7 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.core.models.ParseOptions; +import org.openapitools.codegen.CliOption; import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.ClientOpts; import org.openapitools.codegen.CodegenConstants; @@ -35,11 +36,12 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; +import static java.util.stream.Collectors.groupingBy; +import static org.openapitools.codegen.languages.SpringCodegen.RESPONSE_WRAPPER; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; -import static org.openapitools.codegen.languages.SpringCodegen.RESPONSE_WRAPPER; - public class SpringCodegenTest { @Test @@ -168,4 +170,13 @@ public class SpringCodegenTest { for (String line : lines) assertFalse(file.contains(line)); } + + @Test + public void clientOptsUnicity() { + SpringCodegen codegen = new SpringCodegen(); + codegen.cliOptions() + .stream() + .collect(groupingBy(CliOption::getOpt)) + .forEach((k,v) -> assertEquals(v.size(), 1, k + " is described multiple times")); + } }