Skip to content

Commit 80bef2f

Browse files
Update Vert.x Web template to Vert.x 4 (#7364)
* Update Vert.x Web template to Vert.x 4 Signed-off-by: Francesco Guardiani <[email protected]> * Bad pom Signed-off-by: Francesco Guardiani <[email protected]> * Bad pom 2 Signed-off-by: Francesco Guardiani <[email protected]> * Stick to Java 8 Signed-off-by: Francesco Guardiani <[email protected]> * Latest vert.x 4 Signed-off-by: Francesco Guardiani <[email protected]>
1 parent ea559b5 commit 80bef2f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1221
-1453
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
generatorName: java-vertx-web
2-
outputDir: samples/server/petstore/java-vertx-web/rx
2+
outputDir: samples/server/petstore/java-vertx-web
33
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
44
templateDir: modules/openapi-generator/src/main/resources/JavaVertXWebServer
55
additionalProperties:
66
hideGenerationTimestamp: "true"
7-
artifactId: java-vertx-web-rx-server
7+
artifactId: java-vertx-web-server

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,14 @@
1717
package org.openapitools.codegen.languages;
1818

1919
import io.swagger.v3.oas.models.media.Schema;
20-
import org.openapitools.codegen.CodegenConstants;
21-
import org.openapitools.codegen.CodegenModel;
22-
import org.openapitools.codegen.CodegenOperation;
23-
import org.openapitools.codegen.CodegenProperty;
24-
import org.openapitools.codegen.CodegenType;
20+
import org.openapitools.codegen.*;
2521
import org.openapitools.codegen.meta.GeneratorMetadata;
2622
import org.openapitools.codegen.meta.Stability;
27-
import org.openapitools.codegen.SupportingFile;
2823

2924
import java.io.File;
30-
import java.util.List;
31-
import java.util.Locale;
32-
import java.util.Map;
25+
import java.util.*;
26+
import java.util.stream.Collectors;
27+
import java.util.stream.Stream;
3328

3429
public class JavaVertXWebServerCodegen extends AbstractJavaCodegen {
3530

@@ -69,7 +64,7 @@ public JavaVertXWebServerCodegen() {
6964
updateOption(CodegenConstants.API_PACKAGE, apiPackage);
7065
updateOption(CodegenConstants.MODEL_PACKAGE, modelPackage);
7166
updateOption(CodegenConstants.INVOKER_PACKAGE, invokerPackage);
72-
updateOption(this.DATE_LIBRARY, this.getDateLibrary());
67+
updateOption(DATE_LIBRARY, this.getDateLibrary());
7368

7469
// Override type mapping
7570
typeMapping.put("file", "FileUpload");
@@ -99,6 +94,7 @@ public void processOpts() {
9994
importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty");
10095
importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue");
10196
importMapping.put("FileUpload", "io.vertx.ext.web.FileUpload");
97+
importMapping.put("JsonObject", "io.vertx.core.json.JsonObject");
10298

10399
modelDocTemplateFiles.clear();
104100
apiDocTemplateFiles.clear();
@@ -107,10 +103,7 @@ public void processOpts() {
107103
supportingFiles.clear();
108104
supportingFiles.add(new SupportingFile("supportFiles/openapi.mustache", resourceFolder, "openapi.yaml"));
109105
supportingFiles.add(new SupportingFile("supportFiles/HttpServerVerticle.mustache", sourcePackageFolder, "HttpServerVerticle.java"));
110-
supportingFiles.add(new SupportingFile("supportFiles/MainVerticle.mustache", sourcePackageFolder, "MainVerticle.java"));
111106
supportingFiles.add(new SupportingFile("supportFiles/ApiResponse.mustache", sourcePackageFolder, "ApiResponse.java"));
112-
supportingFiles.add(new SupportingFile("supportFiles/ApiException.mustache", sourcePackageFolder, "ApiException.java"));
113-
supportingFiles.add(new SupportingFile("supportFiles/ParameterCast.mustache", sourcePackageFolder, "ParameterCast.java"));
114107
supportingFiles.add(new SupportingFile("supportFiles/pom.mustache", "", "pom.xml"));
115108

116109
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")
@@ -129,6 +122,7 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
129122
}
130123
}
131124

125+
@SuppressWarnings("unchecked")
132126
@Override
133127
public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) {
134128
Map<String, Object> newObjs = super.postProcessOperationsWithModels(objs, allModels);
@@ -141,11 +135,39 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
141135
if (operation.returnType == null) {
142136
operation.returnType = "Void";
143137
}
138+
if (operation.allParams.stream().anyMatch(p -> p.isFormParam && p.isFile)) {
139+
// If there is a file upload, exclude other form params since it's not clear how the user should access to these
140+
operation.allParams = operation
141+
.allParams
142+
.stream()
143+
.filter(p -> !p.isFormParam || p.isFile)
144+
.collect(Collectors.toList());
145+
} else if (operation.allParams.stream().anyMatch(p -> p.isFormParam)) {
146+
// In Vert.x 4 Web OpenAPI the forms are handled as single json object
147+
// We create a dummy param here and remove the other ones
148+
CodegenParameter dummyParam = new CodegenParameter();
149+
dummyParam.isFormParam = true;
150+
dummyParam.isFile = false;
151+
dummyParam.dataType = "JsonObject";
152+
dummyParam.paramName = "formBody";
153+
operation.allParams = Stream.concat(
154+
operation.allParams.stream().filter(p -> !p.isFormParam),
155+
Stream.of(dummyParam)
156+
).collect(Collectors.toList());
157+
}
144158
}
145159
}
146160
return newObjs;
147161
}
148162

163+
@Override
164+
public void postProcessParameter(CodegenParameter parameter) {
165+
super.postProcessParameter(parameter);
166+
if (parameter.isUuid || parameter.isDate || parameter.isDateTime) {
167+
parameter.dataType = "String";
168+
}
169+
}
170+
149171
@Override
150172
public Map<String, Object> postProcessSupportingFileData(Map<String, Object> objs) {
151173
generateYAMLSpecFile(objs);

modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@ Project generated on : {{generatedDate}}
77
This document assumes you have maven available.
88

99
To build the project using maven, run:
10+
11+
```bash
12+
mvn package
13+
```
14+
15+
To run the project, run the jar or use maven exec plugin:
16+
1017
```bash
11-
mvn package && java -jar target/target/java-vertx-web-rx-server-{{artifactVersion}}-fat.jar
18+
mvn exec:java
1219
```
1320

1421
If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/)

modules/openapi-generator/src/main/resources/JavaVertXWebServer/api.mustache

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ package {{package}};
55

66
import {{invokerPackage}}.ApiResponse;
77

8-
import io.reactivex.Single;
8+
import io.vertx.core.Future;
9+
import io.vertx.core.json.JsonObject;
910

1011
import java.util.List;
1112
import java.util.Map;
1213

1314
public interface {{classname}} {
1415
{{#operations}}
1516
{{#operation}}
16-
Single<ApiResponse<{{{returnType}}}>> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}});
17+
Future<ApiResponse<{{{returnType}}}>> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
1718
{{/operation}}
1819
{{/operations}}
1920
}

modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,66 +3,61 @@ package {{package}};
33
{{#imports}}import {{import}};
44
{{/imports}}
55

6-
import {{invokerPackage}}.ParameterCast;
7-
import {{invokerPackage}}.ApiException;
8-
96
import com.fasterxml.jackson.core.type.TypeReference;
10-
import io.vertx.core.json.Json;
11-
import io.vertx.core.Handler;
12-
import io.vertx.core.http.HttpServerResponse;
7+
import io.vertx.core.json.jackson.DatabindCodec;
8+
import io.vertx.ext.web.openapi.RouterFactory;
9+
import io.vertx.ext.web.validation.RequestParameters;
10+
import io.vertx.ext.web.validation.RequestParameter;
11+
import io.vertx.ext.web.validation.ValidationHandler;
1312
import io.vertx.ext.web.RoutingContext;
13+
import io.vertx.core.json.JsonObject;
1414
import org.slf4j.Logger;
1515
import org.slf4j.LoggerFactory;
1616

17-
import io.reactivex.Single;
18-
1917
import java.util.List;
2018
import java.util.Map;
2119

2220
public class {{classname}}Handler {
2321
2422
private static final Logger logger = LoggerFactory.getLogger({{classname}}Handler.class);
25-
private {{classname}} apiImpl = new {{classname}}Impl();
2623

27-
public {{classname}}Handler(Map<String, Handler<RoutingContext>> operationHandlers) {
24+
private final {{classname}} apiImpl;
25+
26+
public {{classname}}Handler() {
27+
this.apiImpl = new {{classname}}Impl();
28+
}
29+
30+
public void mount(RouterFactory factory) {
2831
{{#operations}}
2932
{{#operation}}
30-
operationHandlers.put("{{operationId}}", this::{{operationId}});
33+
factory.operation("{{operationId}}").handler(this::{{operationId}});
3134
{{/operation}}
3235
{{/operations}}
3336
}
37+
3438
{{#operations}}
3539
{{#operation}}
36-
3740
private void {{operationId}}(RoutingContext routingContext) {
3841
logger.info("{{operationId}}()");
39-
HttpServerResponse response = routingContext.response();
4042
41-
{{#returnType}}Single{{/returnType}}{{^returnType}}Completable{{/returnType}}.defer( () -> {
42-
{{#allParams}}{{^isBodyParam}}{{>headerParams}}{{>pathParams}}{{>queryParams}}{{>formParams}}{{/isBodyParam}}{{/allParams}}
43-
{{#allParams}}
44-
{{#isBodyParam}}
45-
String jsonString = routingContext.getBodyAsString();
46-
{{{dataType}}} {{paramName}} = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference<{{{dataType}}}>(){});
47-
{{/isBodyParam}}
48-
{{/allParams}}
43+
// Param extraction
44+
RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY);
45+
46+
{{#allParams}}{{>headerParams}}{{>pathParams}}{{>queryParams}}{{>formParams}}{{>bodyParams}}{{/allParams}}
4947
{{#allParams}}
50-
logger.info("Parameter {{paramName}} is {}", {{paramName}});
48+
logger.debug("Parameter {{paramName}} is {}", {{paramName}});
5149
{{/allParams}}
52-
return apiImpl.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
53-
})
54-
.subscribe(
55-
apiResponse -> {
56-
response.setStatusCode(apiResponse.getStatusCode())
57-
.end(Json.encodePrettily(apiResponse.getData()));
58-
}, error -> {
59-
if (error instanceof ApiException) {
60-
ApiException apiException = (ApiException) error;
61-
response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage());
50+
51+
apiImpl.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
52+
.onSuccess(apiResponse -> {
53+
routingContext.response().setStatusCode(apiResponse.getStatusCode());
54+
if (apiResponse.hasData()) {
55+
routingContext.json(apiResponse.getData());
6256
} else {
63-
response.setStatusCode(500).end(error.getMessage());
57+
routingContext.response().end();
6458
}
65-
}).dispose();
59+
})
60+
.onFailure(routingContext::fail);
6661
}
6762

6863
{{/operation}}

modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiImpl.mustache

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ package {{package}};
44
{{/imports}}
55

66
import {{invokerPackage}}.ApiResponse;
7-
import {{invokerPackage}}.ApiException;
87

9-
import io.reactivex.Single;
8+
import io.vertx.core.Future;
9+
import io.vertx.core.json.JsonObject;
10+
import io.vertx.ext.web.handler.impl.HttpStatusException;
1011

1112
import java.util.List;
1213
import java.util.Map;
@@ -16,8 +17,8 @@ import java.util.Map;
1617
public class {{classname}}Impl implements {{classname}} {
1718
{{#operations}}
1819
{{#operation}}
19-
public Single<ApiResponse<{{{returnType}}}>> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}}) {
20-
return Single.error(new ApiException("Not Implemented").setStatusCode(501));
20+
public Future<ApiResponse<{{{returnType}}}>> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {
21+
return Future.failedFuture(new HttpStatusException(501));
2122
}
2223

2324
{{/operation}}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{{#isBodyParam}}
2+
RequestParameter body = requestParameters.body();
3+
{{{dataType}}} {{paramName}} = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference<{{{dataType}}}>(){}) : null;
4+
{{/isBodyParam}}
Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
{{#isFormParam}}
2-
{{^isListContainer}}
32
{{^isFile}}
4-
{{#isModel}}
5-
{{{dataType}}} {{paramName}} = ParameterCast.toObject(routingContext.request().getFormAttribute("{{baseName}}"), {{dataType}}.class);
6-
{{/isModel}}
7-
{{^isModel}}
8-
{{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.request().getFormAttribute("{{baseName}}"));
9-
{{/isModel}}
3+
RequestParameter body = requestParameters.body();
4+
JsonObject {{paramName}} = body != null ? body.getJsonObject() : null;
105
{{/isFile}}
116
{{#isFile}}
12-
{{{dataType}}} {{paramName}} = routingContext.fileUploads().iterator().next();
7+
{{{dataType}}} {{paramName}} = routingContext.fileUploads().iterator().next();
138
{{/isFile}}
14-
{{/isListContainer}}
15-
{{#isListContainer}}
16-
{{{dataType}}} {{paramName}} = routingContext.request().params().getAll("{{baseName}}");
17-
{{/isListContainer}}
18-
{{/isFormParam}}
9+
{{/isFormParam}}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{{#isHeaderParam}}
22
{{^isListContainer}}
33
{{#isModel}}
4-
{{{dataType}}} {{paramName}} = ParameterCast.toObject(routingContext.request().getHeader("{{baseName}}"), {{dataType}}.class);
4+
{{{dataType}}} {{paramName}} = requestParameters.headerParameter("{{baseName}}") != null ? DatabindCodec.mapper().convertValue(requestParameters.headerParameter("{{baseName}}").get(), new TypeReference<{{{dataType}}}>(){}) : null;
55
{{/isModel}}
66
{{^isModel}}
7-
{{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.request().getHeader("{{baseName}}"));
7+
{{{dataType}}} {{paramName}} = requestParameters.headerParameter("{{baseName}}") != null ? requestParameters.headerParameter("{{baseName}}").get{{dataType}}() : null;
88
{{/isModel}}
99
{{/isListContainer}}
1010
{{#isListContainer}}
11-
{{{dataType}}} {{paramName}} = routingContext.request().params().getAll("{{baseName}}");
11+
{{{dataType}}} {{paramName}} = requestParameters.headerParameter("{{baseName}}") != null ? DatabindCodec.mapper().convertValue(requestParameters.headerParameter("{{baseName}}").get(), new TypeReference<{{{dataType}}}>(){}) : null;
1212
{{/isListContainer}}
13-
{{/isHeaderParam}}
13+
{{/isHeaderParam}}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{{#isPathParam}}
22
{{^isListContainer}}
33
{{#isModel}}
4-
{{{dataType}}} {{paramName}} = ParameterCast.toObject(routingContext.pathParams().get("{{baseName}}"), {{dataType}}.class);
4+
{{{dataType}}} {{paramName}} = requestParameters.pathParameter("{{baseName}}") != null ? DatabindCodec.mapper().convertValue(requestParameters.pathParameter("{{baseName}}").get(), new TypeReference<{{{dataType}}}>(){}) : null;
55
{{/isModel}}
66
{{^isModel}}
7-
{{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.pathParams().get("{{baseName}}"));
7+
{{{dataType}}} {{paramName}} = requestParameters.pathParameter("{{baseName}}") != null ? requestParameters.pathParameter("{{baseName}}").get{{dataType}}() : null;
88
{{/isModel}}
99
{{/isListContainer}}
1010
{{#isListContainer}}
11-
{{{dataType}}} {{paramName}} = routingContext.request().params().getAll("{{baseName}}");
11+
{{{dataType}}} {{paramName}} = requestParameters.pathParameter("{{baseName}}") != null ? DatabindCodec.mapper().convertValue(requestParameters.pathParameter("{{baseName}}").get(), new TypeReference<{{{dataType}}}>(){}) : null;
1212
{{/isListContainer}}
13-
{{/isPathParam}}
13+
{{/isPathParam}}

0 commit comments

Comments
 (0)