diff --git a/bin/configs/java-vertx-web-server-interface-only.yaml b/bin/configs/java-vertx-web-server-interface-only.yaml new file mode 100644 index 000000000000..0dec31967a09 --- /dev/null +++ b/bin/configs/java-vertx-web-server-interface-only.yaml @@ -0,0 +1,8 @@ +generatorName: java-vertx-web +outputDir: samples/server/petstore/java-vertx-web-interface-only +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +templateDir: modules/openapi-generator/src/main/resources/JavaVertXWebServer +additionalProperties: + hideGenerationTimestamp: "true" + artifactId: java-vertx-web-server-interface-only + interfaceOnly: "true" diff --git a/bin/generate-samples.sh b/bin/generate-samples.sh index f2bcd570cb68..ad6de3d0f5e1 100755 --- a/bin/generate-samples.sh +++ b/bin/generate-samples.sh @@ -7,7 +7,7 @@ declare root="$(cd "$cwd" && cd ../ && pwd)" declare executable="${root}/modules/openapi-generator-cli/target/openapi-generator-cli.jar" if [ ! -f "$executable" ]; then - (cd "${root}" && mvn -B --no-snapshot-updates clean package -DskipTests=true -Dmaven.javadoc.skip=true -Djacoco.skip=true) + (cd "${root}" && ./mvnw -B --no-snapshot-updates clean package -DskipTests=true -Dmaven.javadoc.skip=true -Djacoco.skip=true) fi export JAVA_OPTS="${JAVA_OPTS} -ea -server -Duser.timezone=UTC" diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java index fdd9a16a1e7f..9f3e315689fa 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java @@ -39,6 +39,9 @@ public class JavaVertXWebServerCodegen extends AbstractJavaCodegen { protected String resourceFolder = "src/main/resources"; protected String apiVersion = "1.0.0-SNAPSHOT"; + public static final String INTERFACE_ONLY = "interfaceOnly"; + protected boolean interfaceOnly = false; + public JavaVertXWebServerCodegen() { super(); @@ -52,11 +55,6 @@ public JavaVertXWebServerCodegen() { modelTemplateFiles.clear(); modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.clear(); - apiTemplateFiles.put("api.mustache", ".java"); - apiTemplateFiles.put("apiImpl.mustache", "Impl.java"); - apiTemplateFiles.put("apiHandler.mustache", "Handler.java"); - embeddedTemplateDir = templateDir = "JavaVertXWebServer"; invokerPackage = "org.openapitools.vertxweb.server"; @@ -73,6 +71,8 @@ public JavaVertXWebServerCodegen() { updateOption(CodegenConstants.MODEL_PACKAGE, modelPackage); updateOption(CodegenConstants.INVOKER_PACKAGE, invokerPackage); updateOption(DATE_LIBRARY, this.getDateLibrary()); + + cliOptions.add(CliOption.newBoolean(INTERFACE_ONLY, "Whether to generate only API interface stubs without the server files.")); // Override type mapping typeMapping.put("file", "FileUpload"); @@ -100,6 +100,18 @@ public String getHelp() { public void processOpts() { super.processOpts(); + if (additionalProperties.containsKey(INTERFACE_ONLY)) { + interfaceOnly = Boolean.parseBoolean(additionalProperties.get(INTERFACE_ONLY).toString()); + } + additionalProperties.put(INTERFACE_ONLY, interfaceOnly); + + apiTemplateFiles.clear(); + apiTemplateFiles.put("api.mustache", ".java"); + apiTemplateFiles.put("apiHandler.mustache", "Handler.java"); + if (!interfaceOnly) { + apiTemplateFiles.put("apiImpl.mustache", "Impl.java"); + } + apiTestTemplateFiles.clear(); importMapping.remove("JsonCreator"); @@ -116,7 +128,9 @@ public void processOpts() { String sourcePackageFolder = sourceFolder + File.separator + invokerPackage.replace(".", File.separator); supportingFiles.clear(); supportingFiles.add(new SupportingFile("supportFiles/openapi.mustache", resourceFolder, "openapi.yaml")); - supportingFiles.add(new SupportingFile("supportFiles/HttpServerVerticle.mustache", sourcePackageFolder, "HttpServerVerticle.java")); + if (!interfaceOnly) { + supportingFiles.add(new SupportingFile("supportFiles/HttpServerVerticle.mustache", sourcePackageFolder, "HttpServerVerticle.java")); + } supportingFiles.add(new SupportingFile("supportFiles/ApiResponse.mustache", sourcePackageFolder, "ApiResponse.java")); supportingFiles.add(new SupportingFile("supportFiles/pom.mustache", "", "pom.xml")); diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache index b4d9d6af0945..dd7c8c5213fd 100644 --- a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache @@ -13,6 +13,7 @@ To build the project using maven, run: mvn package ``` +{{^interfaceOnly}} To run the project, run the jar or use maven exec plugin: ```bash @@ -20,3 +21,4 @@ mvn exec:java ``` If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) +{{/interfaceOnly}} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache index 807f60e5b44d..9ff1af9b508d 100644 --- a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache @@ -27,10 +27,12 @@ public class {{classname}}Handler { this.api = api; } +{{^interfaceOnly}} @Deprecated public {{classname}}Handler() { this(new {{classname}}Impl()); } +{{/interfaceOnly}} public void mount(RouterBuilder builder) { {{#operations}} @@ -50,7 +52,17 @@ public class {{classname}}Handler { {{#allParams}}{{>headerParams}}{{>pathParams}}{{>queryParams}}{{>formParams}}{{>bodyParams}}{{/allParams}} {{#allParams}} +{{#isPassword}} + logger.debug("Parameter {{paramName}} is (redacted)"); +{{/isPassword}} +{{^isPassword}} +{{#isBodyParam}} + logger.debug("Parameter {{paramName}} is (body omitted)"); +{{/isBodyParam}} +{{^isBodyParam}} logger.debug("Parameter {{paramName}} is {}", {{paramName}}); +{{/isBodyParam}} +{{/isPassword}} {{/allParams}} api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/formParams.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/formParams.mustache index de70de4226d3..ec507a8704b7 100644 --- a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/formParams.mustache +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/formParams.mustache @@ -4,6 +4,14 @@ JsonObject {{paramName}} = body != null ? body.getJsonObject() : null; {{/isFile}} {{#isFile}} - {{{dataType}}} {{paramName}} = routingContext.fileUploads().iterator().next(); + {{{dataType}}} {{paramName}} = null; + if (routingContext.fileUploads().isEmpty()) { +{{#required}} + routingContext.fail(400); + return; +{{/required}} + } else { + {{paramName}} = routingContext.fileUploads().iterator().next(); + } {{/isFile}} {{/isFormParam}} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache index b505f5bd09cf..6573406eda15 100644 --- a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache @@ -22,7 +22,9 @@ 1.7.30 2.18.9 +{{^interfaceOnly}} {{invokerPackage}}.HttpServerVerticle +{{/interfaceOnly}} @@ -86,6 +88,7 @@ 1.8 +{{^interfaceOnly}} maven-shade-plugin ${maven-shade-plugin.version} @@ -117,10 +120,12 @@ +{{/interfaceOnly}} maven-surefire-plugin ${maven-surefire-plugin.version} +{{^interfaceOnly}} org.codehaus.mojo exec-maven-plugin @@ -133,6 +138,7 @@ +{{/interfaceOnly}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/vertx/JavaVertXWebServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/vertx/JavaVertXWebServerCodegenTest.java new file mode 100644 index 000000000000..8a02d0e93bcb --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/vertx/JavaVertXWebServerCodegenTest.java @@ -0,0 +1,91 @@ +package org.openapitools.codegen.java.vertx; + +import io.swagger.v3.oas.models.OpenAPI; +import org.openapitools.codegen.ClientOptInput; +import org.openapitools.codegen.DefaultGenerator; +import org.openapitools.codegen.TestUtils; +import org.openapitools.codegen.languages.JavaVertXWebServerCodegen; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class JavaVertXWebServerCodegenTest { + + private JavaVertXWebServerCodegen underTest; + + @BeforeMethod + public void setup() { + this.underTest = new JavaVertXWebServerCodegen(); + } + + @Test + public void itShouldSetTheDefaultTemplateKeys() { + underTest.processOpts(); + + Assert.assertTrue(underTest.apiTemplateFiles().containsKey("api.mustache")); + Assert.assertTrue(underTest.apiTemplateFiles().containsKey("apiHandler.mustache")); + Assert.assertTrue(underTest.apiTemplateFiles().containsKey("apiImpl.mustache")); + } + + @Test + public void itShouldNotSetApiImplMustacheKeyWhenInterfaceOnlyIsTrue() { + underTest.additionalProperties().put(JavaVertXWebServerCodegen.INTERFACE_ONLY, "true"); + underTest.processOpts(); + + Assert.assertFalse(underTest.apiTemplateFiles().containsKey("apiImpl.mustache")); + } + + @Test + public void itShouldRedactCredentialsInBodyParams() throws IOException { + Map files = generatePetstoreServer(); + String apiHandlerPath = files.keySet().stream() + .filter(path -> path.endsWith("UserApiHandler.java")) + .findFirst() + .orElseThrow(() -> new AssertionError("UserApiHandler.java not found")); + + File userApiHandler = files.get(apiHandlerPath); + + TestUtils.assertFileContains(userApiHandler.toPath(), "logger.debug(\"Parameter user is (body omitted)\");"); + } + + @Test + public void itShouldCheckFileUploadEmptiness() throws IOException { + Map files = generatePetstoreServer(); + String apiHandlerPath = files.keySet().stream() + .filter(path -> path.endsWith("PetApiHandler.java")) + .findFirst() + .orElseThrow(() -> new AssertionError("PetApiHandler.java not found")); + + File petApiHandler = files.get(apiHandlerPath); + + TestUtils.assertFileContains(petApiHandler.toPath(), "if (routingContext.fileUploads().isEmpty()) {"); + TestUtils.assertFileContains(petApiHandler.toPath(), "} else {"); + TestUtils.assertFileContains(petApiHandler.toPath(), "_file = routingContext.fileUploads().iterator().next();"); + } + + private Map generatePetstoreServer() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/petstore.yaml"); + DefaultGenerator defaultGenerator = new DefaultGenerator(); + ClientOptInput clientOptInput = new ClientOptInput(); + clientOptInput.openAPI(openAPI); + + JavaVertXWebServerCodegen codegen = new JavaVertXWebServerCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + + clientOptInput.config(codegen); + defaultGenerator.opts(clientOptInput); + + return defaultGenerator.generate().stream() + .collect(Collectors.toMap(File::getPath, Function.identity())); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator-ignore b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/FILES b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/FILES new file mode 100644 index 000000000000..42a4804d571b --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/FILES @@ -0,0 +1,16 @@ +README.md +pom.xml +src/main/java/org/openapitools/vertxweb/server/ApiResponse.java +src/main/java/org/openapitools/vertxweb/server/api/PetApi.java +src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java +src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java +src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java +src/main/java/org/openapitools/vertxweb/server/api/UserApi.java +src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java +src/main/java/org/openapitools/vertxweb/server/model/Category.java +src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java +src/main/java/org/openapitools/vertxweb/server/model/Order.java +src/main/java/org/openapitools/vertxweb/server/model/Pet.java +src/main/java/org/openapitools/vertxweb/server/model/Tag.java +src/main/java/org/openapitools/vertxweb/server/model/User.java +src/main/resources/openapi.yaml diff --git a/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/VERSION b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/VERSION new file mode 100644 index 000000000000..8fc8df61083a --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.25.0-SNAPSHOT diff --git a/samples/server/petstore/java-vertx-web-interface-only/README.md b/samples/server/petstore/java-vertx-web-interface-only/README.md new file mode 100644 index 000000000000..41b3433cfe26 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/README.md @@ -0,0 +1,12 @@ +Generator version: 7.25.0-SNAPSHOT + +## Getting Started + +This document assumes you have maven available. + +To build the project using maven, run: + +```bash +mvn package +``` + diff --git a/samples/server/petstore/java-vertx-web-interface-only/pom.xml b/samples/server/petstore/java-vertx-web-interface-only/pom.xml new file mode 100644 index 000000000000..88f42714d282 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/pom.xml @@ -0,0 +1,94 @@ + + 4.0.0 + + org.openapitools + java-vertx-web-server-interface-only + 1.0.0-SNAPSHOT + jar + + OpenAPI Petstore + + + UTF-8 + + 3.8.1 + 2.4.3 + 2.22.2 + 1.5.0 + + 4.2.4 + 5.10.0 + 1.7.30 + 2.18.9 + + + + + + + + io.vertx + vertx-stack-depchain + ${vertx.version} + pom + import + + + + + + + io.vertx + vertx-core + + + io.vertx + vertx-web + + + io.vertx + vertx-web-openapi + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + + + io.vertx + vertx-junit5 + test + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java new file mode 100644 index 000000000000..6e43aa3d74cd --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java @@ -0,0 +1,35 @@ +package org.openapitools.vertxweb.server; + +public class ApiResponse { + private final T data; + private final int statusCode; + + public ApiResponse() { + this(200, null); + } + + public ApiResponse(T data) { + this(200, data); + } + + public ApiResponse(int statusCode) { + this(statusCode, null); + } + + public ApiResponse(int statusCode, T data) { + this.statusCode = statusCode; + this.data = data; + } + + public boolean hasData() { + return data != null; + } + + public T getData() { + return data; + } + + public int getStatusCode() { + return statusCode; + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java new file mode 100644 index 000000000000..75bcc071e26f --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java @@ -0,0 +1,24 @@ +package org.openapitools.vertxweb.server.api; + +import io.vertx.ext.web.FileUpload; +import org.openapitools.vertxweb.server.model.ModelApiResponse; +import org.openapitools.vertxweb.server.model.Pet; + +import org.openapitools.vertxweb.server.ApiResponse; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; + +import java.util.List; +import java.util.Map; + +public interface PetApi { + Future> addPet(Pet pet); + Future> deletePet(Long petId, String apiKey); + Future>> findPetsByStatus(List status); + Future>> findPetsByTags(List tags); + Future> getPetById(Long petId); + Future> updatePet(Pet pet); + Future> updatePetWithForm(Long petId, JsonObject formBody); + Future> uploadFile(Long petId, FileUpload _file); +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java new file mode 100644 index 000000000000..f8d7fa69c76d --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java @@ -0,0 +1,232 @@ +package org.openapitools.vertxweb.server.api; + +import io.vertx.ext.web.FileUpload; +import org.openapitools.vertxweb.server.model.ModelApiResponse; +import org.openapitools.vertxweb.server.model.Pet; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.jackson.DatabindCodec; +import io.vertx.ext.web.openapi.RouterBuilder; +import io.vertx.ext.web.validation.RequestParameters; +import io.vertx.ext.web.validation.RequestParameter; +import io.vertx.ext.web.validation.ValidationHandler; +import io.vertx.ext.web.RoutingContext; +import io.vertx.core.json.JsonObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +public class PetApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(PetApiHandler.class); + + private final PetApi api; + + public PetApiHandler(PetApi api) { + this.api = api; + } + + + public void mount(RouterBuilder builder) { + builder.operation("addPet").handler(this::addPet); + builder.operation("deletePet").handler(this::deletePet); + builder.operation("findPetsByStatus").handler(this::findPetsByStatus); + builder.operation("findPetsByTags").handler(this::findPetsByTags); + builder.operation("getPetById").handler(this::getPetById); + builder.operation("updatePet").handler(this::updatePet); + builder.operation("updatePetWithForm").handler(this::updatePetWithForm); + builder.operation("uploadFile").handler(this::uploadFile); + } + + private void addPet(RoutingContext routingContext) { + logger.info("addPet()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + Pet pet = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; + + logger.debug("Parameter pet is (body omitted)"); + + api.addPet(pet) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void deletePet(RoutingContext routingContext) { + logger.info("deletePet()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + Long petId = requestParameters.pathParameter("petId") != null ? requestParameters.pathParameter("petId").getLong() : null; + String apiKey = requestParameters.headerParameter("api_key") != null ? requestParameters.headerParameter("api_key").getString() : null; + + logger.debug("Parameter petId is {}", petId); + logger.debug("Parameter apiKey is {}", apiKey); + + api.deletePet(petId, apiKey) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void findPetsByStatus(RoutingContext routingContext) { + logger.info("findPetsByStatus()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + List status = requestParameters.queryParameter("status") != null ? DatabindCodec.mapper().convertValue(requestParameters.queryParameter("status").get(), new TypeReference>(){}) : null; + + logger.debug("Parameter status is {}", status); + + api.findPetsByStatus(status) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void findPetsByTags(RoutingContext routingContext) { + logger.info("findPetsByTags()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + List tags = requestParameters.queryParameter("tags") != null ? DatabindCodec.mapper().convertValue(requestParameters.queryParameter("tags").get(), new TypeReference>(){}) : null; + + logger.debug("Parameter tags is {}", tags); + + api.findPetsByTags(tags) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void getPetById(RoutingContext routingContext) { + logger.info("getPetById()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + Long petId = requestParameters.pathParameter("petId") != null ? requestParameters.pathParameter("petId").getLong() : null; + + logger.debug("Parameter petId is {}", petId); + + api.getPetById(petId) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void updatePet(RoutingContext routingContext) { + logger.info("updatePet()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + Pet pet = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; + + logger.debug("Parameter pet is (body omitted)"); + + api.updatePet(pet) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void updatePetWithForm(RoutingContext routingContext) { + logger.info("updatePetWithForm()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + Long petId = requestParameters.pathParameter("petId") != null ? requestParameters.pathParameter("petId").getLong() : null; + RequestParameter body = requestParameters.body(); + JsonObject formBody = body != null ? body.getJsonObject() : null; + + logger.debug("Parameter petId is {}", petId); + logger.debug("Parameter formBody is {}", formBody); + + api.updatePetWithForm(petId, formBody) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void uploadFile(RoutingContext routingContext) { + logger.info("uploadFile()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + Long petId = requestParameters.pathParameter("petId") != null ? requestParameters.pathParameter("petId").getLong() : null; + FileUpload _file = null; + if (routingContext.fileUploads().isEmpty()) { + } else { + _file = routingContext.fileUploads().iterator().next(); + } + + logger.debug("Parameter petId is {}", petId); + logger.debug("Parameter _file is {}", _file); + + api.uploadFile(petId, _file) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java new file mode 100644 index 000000000000..35f915bf77cf --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java @@ -0,0 +1,18 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.Order; + +import org.openapitools.vertxweb.server.ApiResponse; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; + +import java.util.List; +import java.util.Map; + +public interface StoreApi { + Future> deleteOrder(String orderId); + Future>> getInventory(); + Future> getOrderById(Long orderId); + Future> placeOrder(Order order); +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java new file mode 100644 index 000000000000..338cfb2fc497 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java @@ -0,0 +1,124 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.Order; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.jackson.DatabindCodec; +import io.vertx.ext.web.openapi.RouterBuilder; +import io.vertx.ext.web.validation.RequestParameters; +import io.vertx.ext.web.validation.RequestParameter; +import io.vertx.ext.web.validation.ValidationHandler; +import io.vertx.ext.web.RoutingContext; +import io.vertx.core.json.JsonObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +public class StoreApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(StoreApiHandler.class); + + private final StoreApi api; + + public StoreApiHandler(StoreApi api) { + this.api = api; + } + + + public void mount(RouterBuilder builder) { + builder.operation("deleteOrder").handler(this::deleteOrder); + builder.operation("getInventory").handler(this::getInventory); + builder.operation("getOrderById").handler(this::getOrderById); + builder.operation("placeOrder").handler(this::placeOrder); + } + + private void deleteOrder(RoutingContext routingContext) { + logger.info("deleteOrder()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + String orderId = requestParameters.pathParameter("orderId") != null ? requestParameters.pathParameter("orderId").getString() : null; + + logger.debug("Parameter orderId is {}", orderId); + + api.deleteOrder(orderId) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void getInventory(RoutingContext routingContext) { + logger.info("getInventory()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + + + api.getInventory() + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void getOrderById(RoutingContext routingContext) { + logger.info("getOrderById()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + Long orderId = requestParameters.pathParameter("orderId") != null ? requestParameters.pathParameter("orderId").getLong() : null; + + logger.debug("Parameter orderId is {}", orderId); + + api.getOrderById(orderId) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void placeOrder(RoutingContext routingContext) { + logger.info("placeOrder()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + Order order = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; + + logger.debug("Parameter order is (body omitted)"); + + api.placeOrder(order) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java new file mode 100644 index 000000000000..a68768f7179e --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java @@ -0,0 +1,23 @@ +package org.openapitools.vertxweb.server.api; + +import java.time.OffsetDateTime; +import org.openapitools.vertxweb.server.model.User; + +import org.openapitools.vertxweb.server.ApiResponse; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; + +import java.util.List; +import java.util.Map; + +public interface UserApi { + Future> createUser(User user); + Future> createUsersWithArrayInput(List user); + Future> createUsersWithListInput(List user); + Future> deleteUser(String username); + Future> getUserByName(String username); + Future> loginUser(String username, String password); + Future> logoutUser(); + Future> updateUser(String username, User user); +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java new file mode 100644 index 000000000000..846804bc24f8 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java @@ -0,0 +1,224 @@ +package org.openapitools.vertxweb.server.api; + +import java.time.OffsetDateTime; +import org.openapitools.vertxweb.server.model.User; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.jackson.DatabindCodec; +import io.vertx.ext.web.openapi.RouterBuilder; +import io.vertx.ext.web.validation.RequestParameters; +import io.vertx.ext.web.validation.RequestParameter; +import io.vertx.ext.web.validation.ValidationHandler; +import io.vertx.ext.web.RoutingContext; +import io.vertx.core.json.JsonObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +public class UserApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(UserApiHandler.class); + + private final UserApi api; + + public UserApiHandler(UserApi api) { + this.api = api; + } + + + public void mount(RouterBuilder builder) { + builder.operation("createUser").handler(this::createUser); + builder.operation("createUsersWithArrayInput").handler(this::createUsersWithArrayInput); + builder.operation("createUsersWithListInput").handler(this::createUsersWithListInput); + builder.operation("deleteUser").handler(this::deleteUser); + builder.operation("getUserByName").handler(this::getUserByName); + builder.operation("loginUser").handler(this::loginUser); + builder.operation("logoutUser").handler(this::logoutUser); + builder.operation("updateUser").handler(this::updateUser); + } + + private void createUser(RoutingContext routingContext) { + logger.info("createUser()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + User user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; + + logger.debug("Parameter user is (body omitted)"); + + api.createUser(user) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void createUsersWithArrayInput(RoutingContext routingContext) { + logger.info("createUsersWithArrayInput()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + List user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference>(){}) : null; + + logger.debug("Parameter user is (body omitted)"); + + api.createUsersWithArrayInput(user) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void createUsersWithListInput(RoutingContext routingContext) { + logger.info("createUsersWithListInput()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + RequestParameter body = requestParameters.body(); + List user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference>(){}) : null; + + logger.debug("Parameter user is (body omitted)"); + + api.createUsersWithListInput(user) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void deleteUser(RoutingContext routingContext) { + logger.info("deleteUser()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + String username = requestParameters.pathParameter("username") != null ? requestParameters.pathParameter("username").getString() : null; + + logger.debug("Parameter username is {}", username); + + api.deleteUser(username) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void getUserByName(RoutingContext routingContext) { + logger.info("getUserByName()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + String username = requestParameters.pathParameter("username") != null ? requestParameters.pathParameter("username").getString() : null; + + logger.debug("Parameter username is {}", username); + + api.getUserByName(username) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void loginUser(RoutingContext routingContext) { + logger.info("loginUser()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + String username = requestParameters.queryParameter("username") != null ? requestParameters.queryParameter("username").getString() : null; + String password = requestParameters.queryParameter("password") != null ? requestParameters.queryParameter("password").getString() : null; + + logger.debug("Parameter username is {}", username); + logger.debug("Parameter password is {}", password); + + api.loginUser(username, password) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void logoutUser(RoutingContext routingContext) { + logger.info("logoutUser()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + + + api.logoutUser() + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + + private void updateUser(RoutingContext routingContext) { + logger.info("updateUser()"); + + // Param extraction + RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); + + String username = requestParameters.pathParameter("username") != null ? requestParameters.pathParameter("username").getString() : null; + RequestParameter body = requestParameters.body(); + User user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; + + logger.debug("Parameter username is {}", username); + logger.debug("Parameter user is (body omitted)"); + + api.updateUser(username, user) + .onSuccess(apiResponse -> { + routingContext.response().setStatusCode(apiResponse.getStatusCode()); + if (apiResponse.hasData()) { + routingContext.json(apiResponse.getData()); + } else { + routingContext.response().end(); + } + }) + .onFailure(routingContext::fail); + } + +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Category.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Category.java new file mode 100644 index 000000000000..3c72d58af212 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Category.java @@ -0,0 +1,80 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * A category for a pet + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Category { + + private Long id; + private String name; + + public Category () { + + } + + public Category (Long id, String name) { + this.id = id; + this.name = name; + } + + + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java new file mode 100644 index 000000000000..d1ca04dd7061 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java @@ -0,0 +1,93 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Describes the result of uploading an image resource + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ModelApiResponse { + + private Integer code; + private String type; + private String message; + + public ModelApiResponse () { + + } + + public ModelApiResponse (Integer code, String type, String message) { + this.code = code; + this.type = type; + this.message = message; + } + + + @JsonProperty("code") + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + + + @JsonProperty("type") + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + + + @JsonProperty("message") + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelApiResponse _apiResponse = (ModelApiResponse) o; + return Objects.equals(code, _apiResponse.code) && + Objects.equals(type, _apiResponse.type) && + Objects.equals(message, _apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelApiResponse {\n"); + + sb.append(" code: ").append(toIndentedString(code)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Order.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Order.java new file mode 100644 index 000000000000..74185a950f2e --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Order.java @@ -0,0 +1,154 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; +import java.time.OffsetDateTime; + +/** + * An order for a pets from the pet store + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Order { + + private Long id; + private Long petId; + private Integer quantity; + private OffsetDateTime shipDate; + + + public enum StatusEnum { + PLACED("placed"), + APPROVED("approved"), + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } + + private StatusEnum status; + private Boolean complete = false; + + public Order () { + + } + + public Order (Long id, Long petId, Integer quantity, OffsetDateTime shipDate, StatusEnum status, Boolean complete) { + this.id = id; + this.petId = petId; + this.quantity = quantity; + this.shipDate = shipDate; + this.status = status; + this.complete = complete; + } + + + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @JsonProperty("petId") + public Long getPetId() { + return petId; + } + public void setPetId(Long petId) { + this.petId = petId; + } + + + @JsonProperty("quantity") + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + @JsonProperty("shipDate") + public OffsetDateTime getShipDate() { + return shipDate; + } + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @JsonProperty("complete") + public Boolean getComplete() { + return complete; + } + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Pet.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Pet.java new file mode 100644 index 000000000000..02db025385b4 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Pet.java @@ -0,0 +1,158 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.openapitools.vertxweb.server.model.Category; +import org.openapitools.vertxweb.server.model.Tag; + +/** + * A pet for sale in the pet store + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Pet { + + private Long id; + private Category category; + private String name; + private List photoUrls = new ArrayList<>(); + private List tags = new ArrayList<>(); + + + public enum StatusEnum { + AVAILABLE("available"), + PENDING("pending"), + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } + + private StatusEnum status; + + public Pet () { + + } + + public Pet (Long id, Category category, String name, List photoUrls, List tags, StatusEnum status) { + this.id = id; + this.category = category; + this.name = name; + this.photoUrls = photoUrls; + this.tags = tags; + this.status = status; + } + + + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @JsonProperty("category") + public Category getCategory() { + return category; + } + public void setCategory(Category category) { + this.category = category; + } + + + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @JsonProperty("photoUrls") + public List getPhotoUrls() { + return photoUrls; + } + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + @JsonProperty("tags") + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Tag.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Tag.java new file mode 100644 index 000000000000..8c8fdbd1bda0 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/Tag.java @@ -0,0 +1,80 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * A tag for a pet + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Tag { + + private Long id; + private String name; + + public Tag () { + + } + + public Tag (Long id, String name) { + this.id = id; + this.name = name; + } + + + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/User.java b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/User.java new file mode 100644 index 000000000000..0d62571820ed --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/java/org/openapitools/vertxweb/server/model/User.java @@ -0,0 +1,158 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * A User who is purchasing from the pet store + **/ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class User { + + private Long id; + private String username; + private String firstName; + private String lastName; + private String email; + private String password; + private String phone; + private Integer userStatus; + + public User () { + + } + + public User (Long id, String username, String firstName, String lastName, String email, String password, String phone, Integer userStatus) { + this.id = id; + this.username = username; + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + this.password = password; + this.phone = phone; + this.userStatus = userStatus; + } + + + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @JsonProperty("username") + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + @JsonProperty("firstName") + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + @JsonProperty("lastName") + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + @JsonProperty("email") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + @JsonProperty("password") + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + + @JsonProperty("phone") + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + + + @JsonProperty("userStatus") + public Integer getUserStatus() { + return userStatus; + } + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + return o == null ? "null" : o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web-interface-only/src/main/resources/openapi.yaml b/samples/server/petstore/java-vertx-web-interface-only/src/main/resources/openapi.yaml new file mode 100644 index 000000000000..97e827e4e3c0 --- /dev/null +++ b/samples/server/petstore/java-vertx-web-interface-only/src/main/resources/openapi.yaml @@ -0,0 +1,869 @@ +openapi: 3.0.0 +info: + description: "This is a sample server Petstore server. For this sample, you can\ + \ use the api key `special-key` to test the authorization filters." + license: + name: Apache-2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore + version: 1.0.0 +externalDocs: + description: Find out more about Swagger + url: http://swagger.io +servers: +- url: http://petstore.swagger.io/v2 +tags: +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user +paths: + /pet: + post: + description: "" + operationId: addPet + requestBody: + $ref: "#/components/requestBodies/Pet" + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "405": + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet + x-content-type: application/json + x-accepts: + - application/json + - application/xml + put: + description: "" + externalDocs: + description: API documentation for the updatePet operation + url: http://petstore.swagger.io/v2/doc/updatePet + operationId: updatePet + requestBody: + $ref: "#/components/requestBodies/Pet" + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + description: Invalid ID supplied + "404": + description: Pet not found + "405": + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + summary: Update an existing pet + tags: + - pet + x-content-type: application/json + x-accepts: + - application/json + - application/xml + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - deprecated: true + description: Status values that need to be considered for filter + explode: false + in: query + name: status + required: true + schema: + items: + default: available + enum: + - available + - pending + - sold + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + description: Invalid status value + security: + - petstore_auth: + - read:pets + summary: Finds Pets by status + tags: + - pet + x-accepts: + - application/json + - application/xml + /pet/findByTags: + get: + deprecated: true + description: "Multiple tags can be provided with comma separated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: findPetsByTags + parameters: + - description: Tags to filter by + explode: false + in: query + name: tags + required: true + schema: + items: + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + description: Invalid tag value + security: + - petstore_auth: + - read:pets + summary: Finds Pets by tags + tags: + - pet + x-accepts: + - application/json + - application/xml + /pet/{petId}: + delete: + description: "" + operationId: deletePet + parameters: + - explode: false + in: header + name: api_key + required: false + schema: + type: string + style: simple + - description: Pet id to delete + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "400": + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Deletes a pet + tags: + - pet + x-accepts: + - application/json + get: + description: Returns a single pet + operationId: getPetById + parameters: + - description: ID of pet to return + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + description: Invalid ID supplied + "404": + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet + x-accepts: + - application/json + - application/xml + post: + description: "" + operationId: updatePetWithForm + parameters: + - description: ID of pet that needs to be updated + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/updatePetWithForm_request" + responses: + "405": + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Updates a pet in the store with form data + tags: + - pet + x-content-type: application/x-www-form-urlencoded + x-accepts: + - application/json + /pet/{petId}/uploadImage: + post: + description: "" + operationId: uploadFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet + x-content-type: multipart/form-data + x-accepts: + - application/json + /store/inventory: + get: + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + "200": + content: + application/json: + schema: + additionalProperties: + format: int32 + type: integer + type: object + description: successful operation + security: + - api_key: [] + summary: Returns pet inventories by status + tags: + - store + x-accepts: + - application/json + /store/order: + post: + description: "" + operationId: placeOrder + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Order" + description: order placed for purchasing the pet + required: true + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + description: Invalid Order + summary: Place an order for a pet + tags: + - store + x-content-type: application/json + x-accepts: + - application/json + - application/xml + /store/order/{orderId}: + delete: + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - description: ID of the order that needs to be deleted + explode: false + in: path + name: orderId + required: true + schema: + type: string + style: simple + responses: + "400": + description: Invalid ID supplied + "404": + description: Order not found + summary: Delete purchase order by ID + tags: + - store + x-accepts: + - application/json + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generate exceptions + operationId: getOrderById + parameters: + - description: ID of pet that needs to be fetched + explode: false + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + description: Invalid ID supplied + "404": + description: Order not found + summary: Find purchase order by ID + tags: + - store + x-accepts: + - application/json + - application/xml + /user: + post: + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: Created user object + required: true + responses: + default: + description: successful operation + security: + - api_key: [] + summary: Create user + tags: + - user + x-content-type: application/json + x-accepts: + - application/json + /user/createWithArray: + post: + description: "" + operationId: createUsersWithArrayInput + requestBody: + $ref: "#/components/requestBodies/UserArray" + responses: + default: + description: successful operation + security: + - api_key: [] + summary: Creates list of users with given input array + tags: + - user + x-content-type: application/json + x-accepts: + - application/json + /user/createWithList: + post: + description: "" + operationId: createUsersWithListInput + requestBody: + $ref: "#/components/requestBodies/UserArray" + responses: + default: + description: successful operation + security: + - api_key: [] + summary: Creates list of users with given input array + tags: + - user + x-content-type: application/json + x-accepts: + - application/json + /user/login: + get: + description: "" + operationId: loginUser + parameters: + - description: The user name for login + explode: true + in: query + name: username + required: true + schema: + pattern: "^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$" + type: string + style: form + - description: The password for login in clear text + explode: true + in: query + name: password + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + description: successful operation + headers: + Set-Cookie: + description: Cookie authentication key for use with the `api_key` apiKey + authentication. + explode: false + schema: + example: AUTH_KEY=abcde12345; Path=/; HttpOnly + type: string + style: simple + X-Rate-Limit: + description: calls per hour allowed by the user + explode: false + schema: + format: int32 + type: integer + style: simple + X-Expires-After: + description: date in UTC when token expires + explode: false + schema: + format: date-time + type: string + style: simple + "400": + description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user + x-accepts: + - application/json + - application/xml + /user/logout: + get: + description: "" + operationId: logoutUser + responses: + default: + description: successful operation + security: + - api_key: [] + summary: Logs out current logged in user session + tags: + - user + x-accepts: + - application/json + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - description: The name that needs to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "400": + description: Invalid username supplied + "404": + description: User not found + security: + - api_key: [] + summary: Delete user + tags: + - user + x-accepts: + - application/json + get: + description: "" + operationId: getUserByName + parameters: + - description: The name that needs to be fetched. Use user1 for testing. + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/User" + application/json: + schema: + $ref: "#/components/schemas/User" + description: successful operation + "400": + description: Invalid username supplied + "404": + description: User not found + summary: Get user by user name + tags: + - user + x-accepts: + - application/json + - application/xml + put: + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - description: name that need to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/User" + description: Updated user object + required: true + responses: + "400": + description: Invalid user supplied + "404": + description: User not found + security: + - api_key: [] + summary: Updated user + tags: + - user + x-content-type: application/json + x-accepts: + - application/json +components: + requestBodies: + UserArray: + content: + application/json: + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + Pet: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + schemas: + Order: + description: An order for a pets from the pet store + example: + id: 0 + petId: 6 + quantity: 1 + shipDate: 2000-01-23T04:56:07.000+00:00 + status: placed + complete: false + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object + xml: + name: Order + Category: + description: A category for a pet + example: + id: 6 + name: name + properties: + id: + format: int64 + type: integer + name: + pattern: "^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$" + type: string + title: Pet category + type: object + xml: + name: Category + User: + description: A User who is purchasing from the pet store + example: + id: 0 + username: username + firstName: firstName + lastName: lastName + email: email + password: password + phone: phone + userStatus: 6 + properties: + id: + format: int64 + type: integer + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + description: User Status + format: int32 + type: integer + title: a User + type: object + xml: + name: User + Tag: + description: A tag for a pet + example: + id: 1 + name: name + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object + xml: + name: Tag + Pet: + description: A pet for sale in the pet store + example: + id: 0 + category: + id: 6 + name: name + name: doggie + photoUrls: + - photoUrls + - photoUrls + tags: + - id: 1 + name: name + - id: 1 + name: name + status: available + properties: + id: + format: int64 + type: integer + category: + $ref: "#/components/schemas/Category" + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: "#/components/schemas/Tag" + type: array + xml: + name: tag + wrapped: true + status: + deprecated: true + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object + xml: + name: Pet + ApiResponse: + description: Describes the result of uploading an image resource + example: + code: 0 + type: type + message: message + properties: + code: + format: int32 + type: integer + type: + type: string + message: + type: string + title: An uploaded response + type: object + updatePetWithForm_request: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + type: object + uploadFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + format: binary + type: string + type: object + securitySchemes: + petstore_auth: + flows: + implicit: + authorizationUrl: http://petstore.swagger.io/api/oauth/dialog + scopes: + write:pets: modify pets in your account + read:pets: read your pets + type: oauth2 + api_key: + in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java index 6262ce1cb3fa..42f28449c0d5 100644 --- a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java +++ b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java @@ -53,7 +53,7 @@ private void addPet(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); Pet pet = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; - logger.debug("Parameter pet is {}", pet); + logger.debug("Parameter pet is (body omitted)"); api.addPet(pet) .onSuccess(apiResponse -> { @@ -166,7 +166,7 @@ private void updatePet(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); Pet pet = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; - logger.debug("Parameter pet is {}", pet); + logger.debug("Parameter pet is (body omitted)"); api.updatePet(pet) .onSuccess(apiResponse -> { @@ -212,7 +212,11 @@ private void uploadFile(RoutingContext routingContext) { RequestParameters requestParameters = routingContext.get(ValidationHandler.REQUEST_CONTEXT_KEY); Long petId = requestParameters.pathParameter("petId") != null ? requestParameters.pathParameter("petId").getLong() : null; - FileUpload _file = routingContext.fileUploads().iterator().next(); + FileUpload _file = null; + if (routingContext.fileUploads().isEmpty()) { + } else { + _file = routingContext.fileUploads().iterator().next(); + } logger.debug("Parameter petId is {}", petId); logger.debug("Parameter _file is {}", _file); diff --git a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java index 6abff2c93378..972c2923a63f 100644 --- a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java +++ b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java @@ -111,7 +111,7 @@ private void placeOrder(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); Order order = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; - logger.debug("Parameter order is {}", order); + logger.debug("Parameter order is (body omitted)"); api.placeOrder(order) .onSuccess(apiResponse -> { diff --git a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java index f32f94a006f9..94c5d404a697 100644 --- a/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java +++ b/samples/server/petstore/java-vertx-web/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java @@ -52,7 +52,7 @@ private void createUser(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); User user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; - logger.debug("Parameter user is {}", user); + logger.debug("Parameter user is (body omitted)"); api.createUser(user) .onSuccess(apiResponse -> { @@ -75,7 +75,7 @@ private void createUsersWithArrayInput(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); List user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference>(){}) : null; - logger.debug("Parameter user is {}", user); + logger.debug("Parameter user is (body omitted)"); api.createUsersWithArrayInput(user) .onSuccess(apiResponse -> { @@ -98,7 +98,7 @@ private void createUsersWithListInput(RoutingContext routingContext) { RequestParameter body = requestParameters.body(); List user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference>(){}) : null; - logger.debug("Parameter user is {}", user); + logger.debug("Parameter user is (body omitted)"); api.createUsersWithListInput(user) .onSuccess(apiResponse -> { @@ -211,7 +211,7 @@ private void updateUser(RoutingContext routingContext) { User user = body != null ? DatabindCodec.mapper().convertValue(body.get(), new TypeReference(){}) : null; logger.debug("Parameter username is {}", username); - logger.debug("Parameter user is {}", user); + logger.debug("Parameter user is (body omitted)"); api.updateUser(username, user) .onSuccess(apiResponse -> {