Skip to content

Commit 66dcca9

Browse files
authored
Merge pull request #1166 from swagger-api/micronaut-3
Micronaut 3 update.
2 parents 07d2077 + 1c5d5f0 commit 66dcca9

26 files changed

+256
-201
lines changed

src/main/java/io/swagger/codegen/v3/generators/java/MicronautCodegen.java

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.codegen.v3.generators.java;
22

3+
import com.github.jknack.handlebars.Handlebars;
34
import com.github.jknack.handlebars.Lambda;
45
import com.google.common.collect.ImmutableMap;
56
import io.swagger.codegen.v3.*;
@@ -30,10 +31,18 @@
3031
public class MicronautCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures {
3132

3233
private static Logger LOGGER = LoggerFactory.getLogger(MicronautCodegen.class);
34+
private static final String DEFAULT_LIBRARY = "rxjava3";
35+
private static final String RXJAVA3_LIBRARY = "rxjava3";
36+
private static final String RXJAVA2_LIBRARY = "rxjava2";
37+
private static final String REACTOR_LIBRARY = "reactor";
3338
private static final String TITLE = "title";
3439
private static final String CONFIG_PACKAGE = "configPackage";
3540
private static final String BASE_PACKAGE = "basePackage";
3641
private static final String USE_TAGS = "useTags";
42+
private static final String USE_RXJAVA = "useRxJava";
43+
private static final String USE_RXJAVA2 = "useRxJava2";
44+
private static final String USE_RXJAVA3 = "useRxJava3";
45+
private static final String USE_REACTOR = "useReactor";
3746
private static final String IMPLICIT_HEADERS = "implicitHeaders";
3847
private static final String SKIP_SUPPORT_FILES = "skipSupportFiles";
3948

@@ -69,16 +78,21 @@ private void init() {
6978
cliOptions.add(new CliOption(BASE_PACKAGE, "base package (invokerPackage) for generated code"));
7079
cliOptions.add(new CliOption(SKIP_SUPPORT_FILES, "skip support files such as pom.xml, mvnw, etc from code generation."));
7180
cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames"));
72-
cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations"));
81+
82+
CliOption useBeanValidation = CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations");
83+
useBeanValidation.setDefault("true");
84+
cliOptions.add(useBeanValidation);
85+
7386
cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers."));
7487
cliOptions.add(CliOption.newBoolean(USE_OPTIONAL,
7588
"Use Optional container for optional parameters"));
7689

77-
supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application.");
90+
supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application with RxJava3 reactive streams implementation");
91+
supportedLibraries.put(USE_RXJAVA2, "Java Micronaut Server application with RxJava2 reactive streams implementation");
92+
supportedLibraries.put(REACTOR_LIBRARY, "Java Micronaut Server application with Project Reactor reactive streams implementation");
7893
setLibrary(DEFAULT_LIBRARY);
7994

8095
CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use");
81-
library.setDefault(DEFAULT_LIBRARY);
8296
library.setEnum(supportedLibraries);
8397
library.setDefault(DEFAULT_LIBRARY);
8498
cliOptions.add(library);
@@ -138,8 +152,8 @@ public void processOpts() {
138152
this.setBasePackage((String) additionalProperties.get(BASE_PACKAGE));
139153
}
140154

141-
if (additionalProperties.containsKey(USE_TAGS)) {
142-
this.setUseTags(Boolean.valueOf(additionalProperties.get(USE_TAGS).toString()));
155+
if (additionalProperties.get(USE_TAGS) != null) {
156+
this.setUseTags(Boolean.parseBoolean(additionalProperties.get(USE_TAGS).toString()));
143157
}
144158

145159
if (additionalProperties.containsKey(USE_BEANVALIDATION)) {
@@ -151,21 +165,23 @@ public void processOpts() {
151165
}
152166

153167
boolean skipSupportFiles = false;
154-
if (additionalProperties.containsKey(SKIP_SUPPORT_FILES)) {
155-
skipSupportFiles = Boolean.valueOf(additionalProperties.get(SKIP_SUPPORT_FILES).toString());
168+
if (additionalProperties.get(SKIP_SUPPORT_FILES) != null) {
169+
skipSupportFiles = Boolean.parseBoolean(additionalProperties.get(SKIP_SUPPORT_FILES).toString());
156170
}
157171

158-
if (useBeanValidation) {
159-
writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
160-
}
172+
writePropertyBack(USE_BEANVALIDATION, useBeanValidation);
161173

162-
if (additionalProperties.containsKey(IMPLICIT_HEADERS)) {
163-
this.setImplicitHeaders(Boolean.valueOf(additionalProperties.get(IMPLICIT_HEADERS).toString()));
174+
if (additionalProperties.get(IMPLICIT_HEADERS) != null) {
175+
this.setImplicitHeaders(Boolean.parseBoolean(additionalProperties.get(IMPLICIT_HEADERS).toString()));
164176
}
165177

166-
if (useOptional) {
167-
writePropertyBack(USE_OPTIONAL, useOptional);
178+
writePropertyBack(USE_OPTIONAL, useOptional);
179+
if (isRxJava2Library()) {
180+
additionalProperties.put(USE_RXJAVA2, true);
181+
} else {
182+
additionalProperties.put(USE_RXJAVA3, isRxJava3Library());
168183
}
184+
additionalProperties.put(USE_REACTOR, isReactorLibrary());
169185

170186
if (!skipSupportFiles) {
171187
supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml"));
@@ -174,7 +190,8 @@ public void processOpts() {
174190
supportingFiles.add(new SupportingFile("mvnw.cmd", "", "mvnw.cmd"));
175191
supportingFiles.add(new SupportingFile("unsupportedOperationExceptionHandler.mustache",
176192
(sourceFolder + File.separator + configPackage).replace(".", File.separator), "UnsupportedOperationExceptionHandler.java"));
177-
supportingFiles.add(new SupportingFile("mainApplication.mustache", (sourceFolder + File.separator).replace(".", File.separator), "MainApplication.java"));
193+
supportingFiles.add(new SupportingFile("mainApplication.mustache", (sourceFolder + File.separator + basePackage).replace(".", File.separator), "MainApplication.java"));
194+
apiTemplateFiles.put("apiController.mustache", "Controller.java");
178195
}
179196
addHandlebarsLambdas(additionalProperties);
180197
}
@@ -529,4 +546,22 @@ public void setUseBeanValidation(boolean useBeanValidation) {
529546
public void setUseOptional(boolean useOptional) {
530547
this.useOptional = useOptional;
531548
}
549+
550+
@Override
551+
public void addHandlebarHelpers(Handlebars handlebars) {
552+
handlebars.setInfiniteLoops(true);
553+
super.addHandlebarHelpers(handlebars);
554+
}
555+
556+
private boolean isRxJava2Library() {
557+
return library.equals(RXJAVA2_LIBRARY);
558+
}
559+
560+
private boolean isRxJava3Library() {
561+
return library.equals(RXJAVA3_LIBRARY);
562+
}
563+
564+
private boolean isReactorLibrary() {
565+
return library.equals(REACTOR_LIBRARY);
566+
}
532567
}

src/main/resources/handlebars/JavaMicronaut/api.mustache

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,20 @@ package {{package}};
1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import io.micronaut.http.*;
1212
import io.micronaut.http.annotation.*;
13+
{{#useRxJava3}}
14+
import io.reactivex.rxjava3.core.Single;
15+
{{/useRxJava3}}
16+
{{^useRxJava3}}
17+
{{#useRxJava2}}
1318
import io.reactivex.Single;
19+
{{/useRxJava2}}
20+
{{/useRxJava3}}
1421
import io.swagger.v3.oas.annotations.*;
1522
import io.swagger.v3.oas.annotations.responses.*;
16-
import org.slf4j.Logger;
17-
import org.slf4j.LoggerFactory;
23+
{{#useReactor}}
24+
import org.reactivestreams.Publisher;
25+
import reactor.core.publisher.Mono;
26+
{{/useReactor}}
1827

1928
{{#useBeanValidation}}
2029
{{#jakarta}}
@@ -31,11 +40,12 @@ import javax.validation.constraints.*;
3140
import java.io.IOException;
3241
import java.util.List;
3342
import java.util.Map;
43+
{{#useOptional}}
3444
import java.util.Optional;
45+
{{/useOptional}}
3546

3647
{{>generatedAnnotation}}
3748
{{#operations}}
38-
@Controller
3949
public interface {{classname}} {
4050
4151
{{#operation}}
@@ -53,8 +63,8 @@ public interface {{classname}} {
5363
})
5464
{{/implicitHeaders}}
5565
@{{#lambda.capitalise}}{{httpMethod}}{{/lambda.capitalise}}(value = "{{{path}}}"{{#hasProduces}}, produces = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }{{/hasProduces}}{{#hasConsumes}}, consumes = {{braces "left"}}{{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}}{{braces "right"}}{{/hasConsumes}})
56-
default Single<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) {
57-
return Single.fromCallable(() -> {
66+
default Single<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>cookieParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) {
67+
return {{^useReactor}}Single{{/useReactor}}{{#useReactor}}Mono{{/useReactor}}.fromCallable(() -> {
5868
throw new UnsupportedOperationException();
5969
});
6070
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package {{package}};
2+
3+
{{#imports}}
4+
import {{import}};
5+
6+
{{/imports}}
7+
import io.micronaut.http.annotation.Controller;
8+
import io.micronaut.http.HttpResponse;
9+
{{#useRxJava3}}
10+
import io.reactivex.rxjava3.core.Single;
11+
{{/useRxJava3}}
12+
{{^useRxJava3}}
13+
{{#useRxJava2}}
14+
import io.reactivex.Single;
15+
{{/useRxJava2}}
16+
{{/useRxJava3}}
17+
{{#useReactor}}
18+
import org.reactivestreams.Publisher;
19+
import reactor.core.publisher.Mono;
20+
{{/useReactor}}
21+
22+
{{#useBeanValidation}}
23+
import javax.annotation.Nullable;
24+
import javax.validation.Valid;
25+
import javax.validation.constraints.*;
26+
{{/useBeanValidation}}
27+
import java.util.List;
28+
import java.util.Map;
29+
{{#useOptional}}
30+
import java.util.Optional;
31+
{{/useOptional}}
32+
33+
{{#operations}}
34+
@Controller
35+
public class {{classname}}Controller implements {{classname}} {
36+
{{#operation}}
37+
{{#contents}}
38+
39+
@Override
40+
public Single<HttpResponse<{{>returnTypes}}>> {{operationId}}({{#parameters}}{{#useBeanValidation}}{{!
41+
Bean validation spec for path parameters (PathParam is always required)
42+
}}{{#isPathParam}}{{>beanValidationParams}}{{/isPathParam}}{{!
43+
Bean validation spec for any other parameters
44+
}}{{^isPathParam}}{{>nullableBeanValidationParams}}{{/isPathParam}}{{/useBeanValidation}}{{!
45+
Method argument type and name
46+
}}{{>optionalDataType}} {{paramName}}{{!
47+
Arguments separator, if required
48+
}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) {
49+
// TODO: Implement me
50+
return {{classname}}.super.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}});
51+
}
52+
{{/contents}}
53+
{{/operation}}
54+
}
55+
{{/operations}}

src/main/resources/handlebars/JavaMicronaut/api_test.mustache

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@ package {{package}};
55

66
import io.micronaut.http.HttpResponse;
77
import io.micronaut.http.HttpStatus;
8-
import io.micronaut.test.annotation.MicronautTest;
8+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
99
import org.junit.jupiter.api.Test;
10-
11-
{{#jakarta}}
10+
{{#useReactor}}
11+
import reactor.core.publisher.Mono;
12+
{{/useReactor}}
1213
import jakarta.inject.Inject;
13-
{{/jakarta}}
14-
{{^jakarta}}
15-
import javax.inject.Inject;
16-
{{/jakarta}}
1714

1815
import java.util.*;
1916

@@ -28,18 +25,20 @@ class {{classname}}ControllerTest {
2825
{{#operations}}
2926
{{#operation}}
3027
{{#contents}}
28+
{{#@first}}
3129
@Test
32-
void {{operationId}}{{#isForm}}WithForm{{/isForm}}Test() {
30+
void {{operationId}}{{#isForm}}Form{{/isForm}}Test() {
3331
{{#parameters}}
34-
{{{dataType}}} {{paramName}} = {{{example}}};
32+
{{{dataType}}} {{paramName}} = null;
3533
{{/parameters}}
3634
try {
37-
api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}).blockingGet();
35+
//TODO: {{#useReactor}}Mono.from({{/useReactor}}api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}){{#useReactor}}){{/useReactor}}{{^useReactor}}.blockingGet();{{/useReactor}}{{#useReactor}}.block();{{/useReactor}}
3836
} catch (UnsupportedOperationException e) {
3937
assumeTrue(false, "API is not yet implemented");
4038
}
4139
}
4240

41+
{{/@first}}
4342
{{/contents}}
4443
{{/operation}}
4544
{{/operations}}

src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
{{/required}}{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}
44
@Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{#isNotContainer}}{{^isPrimitiveType}}
55
@Valid{{/isPrimitiveType}}{{/isNotContainer}}
6-
{{>beanValidationCore}}
6+
{{>beanValidationCore}}

src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{#useBeanValidation}}{{>beanValidationParamsInner}}{{>beanValidationCore}}{{/useBeanValidation}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{{^isPrimitiveType}}{{^isEnum}}{{!
2+
Non-container
3+
}}{{^isContainer}}@Valid {{/isContainer}}{{!
4+
Container
5+
}}{{#isContainer}}{{#items}}{{>beanValidationParamsInner}}{{/items}}{{/isContainer}}{{/isEnum}}{{/isPrimitiveType}}

src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)