From 0f2272d9a4c462ec2d9e097ca1192bba3362e3c7 Mon Sep 17 00:00:00 2001 From: lwlee2608 Date: Mon, 28 Oct 2019 14:08:21 +0800 Subject: [PATCH] Implement Server Stub Code for Vert.x Web #115 (#4286) * InlineResolver to flatten callback operations Signed-off-by: lwlee2608 * clone from VertxServerCodegen, to new VertxWebServerCodegen * fix compilation error in VertxWebCodegn * Start working on VertxWebServerCodegen, adding support files * add server api handler * add server api and fix yaml spec file generation * link api to apiHandler * convert vertx parameters into API model * add support to multipart/form-data upload files * ability to set http status code from ApiImpl * replace rootPackage with invokerPackage * add readme and sample * fix circleCi error * override file to FileUpload in typeMapping, no need to override from fromOperation(). Also remove unused annotation import from model * remove smartBear software copyright * use {{artifactVersion}} instead of hardcode version in readme * add -t flag in generation script * add generated vertx-web server to master pom for testing --- bin/java-vertx-web-rx-petstore-server.sh | 37 + docs/generators.md | 1 + docs/generators/java-vertx-web.md | 42 + .../languages/JavaVertXWebServerCodegen.java | 155 ++++ .../JavaVertXWebServer/README.mustache | 14 + .../resources/JavaVertXWebServer/api.mustache | 19 + .../JavaVertXWebServer/apiHandler.mustache | 95 ++ .../JavaVertXWebServer/apiImpl.mustache | 25 + .../JavaVertXWebServer/enumClass.mustache | 17 + .../enumOuterClass.mustache | 36 + .../JavaVertXWebServer/model.mustache | 12 + .../JavaVertXWebServer/pojo.mustache | 71 ++ .../supportFiles/ApiException.mustache | 24 + .../supportFiles/ApiResponse.mustache | 29 + .../supportFiles/HttpServerVerticle.mustache | 66 ++ .../supportFiles/MainVerticle.mustache | 27 + .../supportFiles/ParameterCast.mustache | 88 ++ .../supportFiles/openapi.mustache | 1 + .../supportFiles/pom.mustache | 102 +++ .../org.openapitools.codegen.CodegenConfig | 1 + pom.xml | 1 + .../rx/.openapi-generator-ignore | 23 + .../rx/.openapi-generator/VERSION | 1 + .../petstore/java-vertx-web/rx/README.md | 11 + .../server/petstore/java-vertx-web/rx/pom.xml | 102 +++ .../vertxweb/server/ApiException.java | 24 + .../vertxweb/server/ApiResponse.java | 29 + .../vertxweb/server/HttpServerVerticle.java | 70 ++ .../vertxweb/server/MainVerticle.java | 27 + .../vertxweb/server/ParameterCast.java | 88 ++ .../vertxweb/server/api/PetApi.java | 23 + .../vertxweb/server/api/PetApiHandler.java | 242 +++++ .../vertxweb/server/api/PetApiImpl.java | 50 ++ .../vertxweb/server/api/StoreApi.java | 17 + .../vertxweb/server/api/StoreApiHandler.java | 127 +++ .../vertxweb/server/api/StoreApiImpl.java | 32 + .../vertxweb/server/api/UserApi.java | 21 + .../vertxweb/server/api/UserApiHandler.java | 234 +++++ .../vertxweb/server/api/UserApiImpl.java | 48 + .../vertxweb/server/model/Category.java | 83 ++ .../vertxweb/server/model/InlineObject.java | 80 ++ .../vertxweb/server/model/InlineObject1.java | 81 ++ .../server/model/ModelApiResponse.java | 96 ++ .../vertxweb/server/model/Order.java | 157 ++++ .../vertxweb/server/model/Pet.java | 160 ++++ .../vertxweb/server/model/Tag.java | 83 ++ .../vertxweb/server/model/User.java | 161 ++++ .../rx/src/main/resources/openapi.yaml | 837 ++++++++++++++++++ 48 files changed, 3770 insertions(+) create mode 100755 bin/java-vertx-web-rx-petstore-server.sh create mode 100644 docs/generators/java-vertx-web.md create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/api.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiImpl.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumClass.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumOuterClass.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/pojo.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiException.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiResponse.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/HttpServerVerticle.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/MainVerticle.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ParameterCast.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/openapi.mustache create mode 100644 modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache create mode 100644 samples/server/petstore/java-vertx-web/rx/.openapi-generator-ignore create mode 100644 samples/server/petstore/java-vertx-web/rx/.openapi-generator/VERSION create mode 100644 samples/server/petstore/java-vertx-web/rx/README.md create mode 100644 samples/server/petstore/java-vertx-web/rx/pom.xml create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiException.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/HttpServerVerticle.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/MainVerticle.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ParameterCast.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiImpl.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiImpl.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiImpl.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Category.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject1.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Order.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Pet.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Tag.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/User.java create mode 100644 samples/server/petstore/java-vertx-web/rx/src/main/resources/openapi.yaml diff --git a/bin/java-vertx-web-rx-petstore-server.sh b/bin/java-vertx-web-rx-petstore-server.sh new file mode 100755 index 00000000000..16a9b48ed18 --- /dev/null +++ b/bin/java-vertx-web-rx-petstore-server.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +SPEC="modules/openapi-generator/src/test/resources/3_0/petstore.yaml" +GENERATOR="java-vertx-web" +TEMPLATE="modules/openapi-generator/src/main/resources/JavaVertXWebServer" +STUB_DIR="samples/server/petstore/java-vertx-web/rx" + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate -i $SPEC -t $TEMPLATE -g $GENERATOR --artifact-id java-vertx-web-rx-server -o $STUB_DIR --additional-properties hideGenerationTimestamp=true $@" + +java $JAVA_OPTS -jar $executable $ags diff --git a/docs/generators.md b/docs/generators.md index 604c6ed302d..4769e7ba8af 100644 --- a/docs/generators.md +++ b/docs/generators.md @@ -88,6 +88,7 @@ The following generators are available: * [java-play-framework](generators/java-play-framework.md) * [java-undertow-server](generators/java-undertow-server.md) * [java-vertx](generators/java-vertx.md) +* [java-vertx-web](generators/java-vertx-web.md) * [jaxrs-cxf](generators/jaxrs-cxf.md) * [jaxrs-cxf-cdi](generators/jaxrs-cxf-cdi.md) * [jaxrs-cxf-extended](generators/jaxrs-cxf-extended.md) diff --git a/docs/generators/java-vertx-web.md b/docs/generators/java-vertx-web.md new file mode 100644 index 00000000000..059acc0a2a0 --- /dev/null +++ b/docs/generators/java-vertx-web.md @@ -0,0 +1,42 @@ +--- +title: Config Options for java-vertx-web +sidebar_label: java-vertx-web +--- + +| Option | Description | Values | Default | +| ------ | ----------- | ------ | ------- | +|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| +|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| +|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| +|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| +|modelPackage|package for generated models| |org.openapitools.vertxweb.server.model| +|apiPackage|package for generated api classes| |org.openapitools.vertxweb.server.api| +|invokerPackage|root package for generated code| |org.openapitools.vertxweb.server| +|groupId|groupId in generated pom.xml| |org.openapitools| +|artifactId|artifactId in generated pom.xml. This also becomes part of the generated library's filename| |openapi-java-vertx-web-server| +|artifactVersion|artifact version in generated pom.xml. This also becomes part of the generated library's filename| |1.0.0-SNAPSHOT| +|artifactUrl|artifact URL in generated pom.xml| |https://github.com/openapitools/openapi-generator| +|artifactDescription|artifact description in generated pom.xml| |OpenAPI Java| +|scmConnection|SCM connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git| +|scmDeveloperConnection|SCM developer connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git| +|scmUrl|SCM URL in generated pom.xml| |https://github.com/openapitools/openapi-generator| +|developerName|developer name in generated pom.xml| |OpenAPI-Generator Contributors| +|developerEmail|developer email in generated pom.xml| |team@openapitools.org| +|developerOrganization|developer organization in generated pom.xml| |OpenAPITools.org| +|developerOrganizationUrl|developer organization URL in generated pom.xml| |http://openapitools.org| +|licenseName|The name of the license| |Unlicense| +|licenseUrl|The URL of the license| |http://unlicense.org| +|sourceFolder|source folder for generated code| |src/main/java| +|serializableModel|boolean - toggle "implements Serializable" for generated models| |false| +|bigDecimalAsString|Treat BigDecimal values as Strings to avoid precision loss.| |false| +|fullJavaUtil|whether to use fully qualified name for classes under java.util. This option only works for Java API client| |false| +|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |false| +|withXml|whether to include support for application/xml content type and include XML annotations in the model (works with libraries that provide support for JSON and XML)| |false| +|dateLibrary|Option. Date library to use|
**joda**
Joda (for legacy app only)
**legacy**
Legacy java.util.Date (if you really have a good reason not to use threetenbp
**java8-localdatetime**
Java 8 using LocalDateTime (for legacy app only)
**java8**
Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true
**threetenbp**
Backport of JSR310 (preferred for jdk < 1.8)
|java8| +|java8|Option. Use Java8 classes instead of third party equivalents|
**true**
Use Java 8 classes such as Base64
**false**
Various third party libraries as needed
|false| +|disableHtmlEscaping|Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields)| |false| +|booleanGetterPrefix|Set booleanGetterPrefix| |get| +|parentGroupId|parent groupId in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null| +|parentArtifactId|parent artifactId in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null| +|parentVersion|parent version in generated pom N.B. parentGroupId, parentArtifactId and parentVersion must all be specified for any of them to take effect| |null| +|snapshotVersion|Uses a SNAPSHOT version.|
**true**
Use a SnapShot Version
**false**
Use a Release Version
|null| 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 new file mode 100644 index 00000000000..7dbb966b141 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaVertXWebServerCodegen.java @@ -0,0 +1,155 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openapitools.codegen.languages; + +import io.swagger.v3.oas.models.media.Schema; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.CodegenModel; +import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.CodegenType; +import org.openapitools.codegen.SupportingFile; + +import java.io.File; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class JavaVertXWebServerCodegen extends AbstractJavaCodegen { + + protected String resourceFolder = "src/main/resources"; + protected String apiVersion = "1.0.0-SNAPSHOT"; + + public JavaVertXWebServerCodegen() { + super(); + + // set the output folder here + outputFolder = "generated-code" + File.separator + "javaVertXServer"; + + 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"; + apiPackage = invokerPackage + ".api"; + modelPackage = invokerPackage + ".model"; + artifactId = "openapi-java-vertx-web-server"; + artifactVersion = apiVersion; + this.setDateLibrary("java8"); + + // clioOptions default redifinition need to be updated + updateOption(CodegenConstants.ARTIFACT_ID, this.getArtifactId()); + updateOption(CodegenConstants.ARTIFACT_VERSION, this.getArtifactVersion()); + updateOption(CodegenConstants.API_PACKAGE, apiPackage); + updateOption(CodegenConstants.MODEL_PACKAGE, modelPackage); + updateOption(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + updateOption(this.DATE_LIBRARY, this.getDateLibrary()); + + // Override type mapping + typeMapping.put("file", "FileUpload"); + } + + public CodegenType getTag() { + return CodegenType.SERVER; + } + + public String getName() { + return "java-vertx-web"; + } + + public String getHelp() { + return "Generates a Java Vert.x-Web Server."; + } + + @Override + public void processOpts() { + super.processOpts(); + + apiTestTemplateFiles.clear(); + + importMapping.remove("JsonCreator"); + importMapping.remove("com.fasterxml.jackson.annotation.JsonProperty"); + importMapping.put("JsonInclude", "com.fasterxml.jackson.annotation.JsonInclude"); + importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); + importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue"); + importMapping.put("FileUpload", "io.vertx.ext.web.FileUpload"); + + modelDocTemplateFiles.clear(); + apiDocTemplateFiles.clear(); + + 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")); + supportingFiles.add(new SupportingFile("supportFiles/MainVerticle.mustache", sourcePackageFolder, "MainVerticle.java")); + supportingFiles.add(new SupportingFile("supportFiles/ApiResponse.mustache", sourcePackageFolder, "ApiResponse.java")); + supportingFiles.add(new SupportingFile("supportFiles/ApiException.mustache", sourcePackageFolder, "ApiException.java")); + supportingFiles.add(new SupportingFile("supportFiles/ParameterCast.mustache", sourcePackageFolder, "ParameterCast.java")); + supportingFiles.add(new SupportingFile("supportFiles/pom.mustache", "", "pom.xml")); + + writeOptional(outputFolder, new SupportingFile("README.mustache", "", "README.md")); + } + + @Override + public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { + super.postProcessModelProperty(model, property); + if (!model.isEnum) { + model.imports.add("JsonInclude"); + model.imports.add("JsonProperty"); + if (model.hasEnums) { + model.imports.add("JsonValue"); + } + } + } + + @Override + public Map postProcessOperationsWithModels(Map objs, List allModels) { + Map newObjs = super.postProcessOperationsWithModels(objs, allModels); + Map operations = (Map) newObjs.get("operations"); + if (operations != null) { + List ops = (List) operations.get("operation"); + for (CodegenOperation operation : ops) { + operation.httpMethod = operation.httpMethod.toLowerCase(Locale.ROOT); + + if (operation.returnType == null) { + operation.returnType = "Void"; + } + } + } + return newObjs; + } + + @Override + public Map postProcessSupportingFileData(Map objs) { + generateYAMLSpecFile(objs); + return super.postProcessSupportingFileData(objs); + } + + @Override + public CodegenModel fromModel(String name, Schema model) { + CodegenModel codegenModel = super.fromModel(name, model); + codegenModel.imports.remove("ApiModel"); + codegenModel.imports.remove("ApiModelProperty"); + return codegenModel; + } +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache new file mode 100644 index 00000000000..4ed2314c893 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/README.mustache @@ -0,0 +1,14 @@ +{{^hideGenerationTimestamp}} +Project generated on : {{generatedDate}} +{{/hideGenerationTimestamp}} + +## Getting Started + +This document assumes you have maven available. + +To build the project using maven, run: +```bash +mvn package && java -jar target/target/java-vertx-web-rx-server-{{artifactVersion}}-fat.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/api.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/api.mustache new file mode 100644 index 00000000000..b43d443c00f --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/api.mustache @@ -0,0 +1,19 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import {{invokerPackage}}.ApiResponse; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public interface {{classname}} { +{{#operations}} +{{#operation}} + Single> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}}); +{{/operation}} +{{/operations}} +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache new file mode 100644 index 00000000000..594ef7f2759 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiHandler.mustache @@ -0,0 +1,95 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import {{invokerPackage}}.ParameterCast; +import {{invokerPackage}}.ApiException; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.RoutingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public class {{classname}}Handler { + + private static final Logger logger = LoggerFactory.getLogger({{classname}}Handler.class); + private {{classname}} apiImpl = new {{classname}}Impl(); + + public {{classname}}Handler(Map> operationHandlers) { +{{#operations}} +{{#operation}} + operationHandlers.put("{{operationId}}", this::{{operationId}}); +{{/operation}} +{{/operations}} + } +{{#operations}} +{{#operation}} + + private void {{operationId}}(RoutingContext routingContext) { + logger.info("{{operationId}}()"); + HttpServerResponse response = routingContext.response(); + + {{#returnType}}Single{{/returnType}}{{^returnType}}Completable{{/returnType}}.defer( () -> { +{{#allParams}} +{{^isBodyParam}} +{{^isListContainer}} +{{#isHeaderParam}} + {{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.request().getHeader("{{baseName}}")); +{{/isHeaderParam}} +{{#isPathParam}} + {{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.pathParams().get("{{baseName}}")); +{{/isPathParam}} +{{#isQueryParam}} + {{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.queryParams().get("{{baseName}}")); +{{/isQueryParam}} +{{#isFormParam}} +{{^isFile}} + {{{dataType}}} {{paramName}} = ParameterCast.to{{dataType}}(routingContext.request().getFormAttribute("{{baseName}}")); +{{/isFile}} +{{#isFile}} + {{{dataType}}} {{paramName}} = routingContext.fileUploads().iterator().next(); +{{/isFile}} +{{/isFormParam}} +{{/isListContainer}} +{{#isListContainer}} + {{{dataType}}} {{paramName}} = routingContext.request().params().getAll("{{baseName}}"); +{{/isListContainer}} +{{/isBodyParam}} +{{/allParams}} +{{#allParams}} +{{#isBodyParam}} + String jsonString = routingContext.getBodyAsString(); + {{{dataType}}} {{paramName}} = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference<{{{dataType}}}>(){}); +{{/isBodyParam}} +{{/allParams}} +{{#allParams}} + logger.info("Parameter {{paramName}} is {}", {{paramName}}); +{{/allParams}} + return apiImpl.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + +{{/operation}} +{{/operations}} +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiImpl.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiImpl.mustache new file mode 100644 index 00000000000..86f61eb0f6c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/apiImpl.mustache @@ -0,0 +1,25 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import {{invokerPackage}}.ApiResponse; +import {{invokerPackage}}.ApiException; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +// Implement this class + +public class {{classname}}Impl implements {{classname}} { +{{#operations}} +{{#operation}} + public Single> {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}}) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + +{{/operation}} +{{/operations}} +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumClass.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumClass.mustache new file mode 100644 index 00000000000..0867107d993 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumClass.mustache @@ -0,0 +1,17 @@ + + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}({{{value}}}){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumOuterClass.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumOuterClass.mustache new file mode 100644 index 00000000000..97d8170d5f8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/enumOuterClass.mustache @@ -0,0 +1,36 @@ +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} + */ +public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { + {{#allowableValues}}{{#enumVars}} + {{{name}}}({{{value}}}){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private {{{dataType}}} value; + + {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) { + this.value = value; + } + + @JsonValue + public {{{dataType}}} getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) { + for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) { + if (b.value.equals(value)) { + return b; + } + } + {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/useNullForUnknownEnumValue}} + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/model.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/model.mustache new file mode 100644 index 00000000000..46f9f77357d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/model.mustache @@ -0,0 +1,12 @@ +package {{package}}; + +import java.util.Objects; +{{#imports}}import {{import}}; +{{/imports}} +{{#serializableModel}}import java.io.Serializable; +{{/serializableModel}}{{#models}}{{#model}}{{#description}} +/** + * {{description}} + **/ +{{/description}}{{^description}} +{{/description}}{{#isEnum}}{{>enumOuterClass}}{{/isEnum}}{{^isEnum}}{{>pojo}}{{/isEnum}}{{/model}}{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/pojo.mustache new file mode 100644 index 00000000000..014ba3e2b43 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/pojo.mustache @@ -0,0 +1,71 @@ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}}{{^isContainer}} + +{{>enumClass}}{{/isContainer}}{{#isContainer}}{{#mostInnerItems}} + +{{>enumClass}}{{/mostInnerItems}}{{/isContainer}}{{/isEnum}} + private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};{{/vars}} + + public {{classname}} () { + + } + + public {{classname}} ({{#vars}}{{{datatypeWithEnum}}} {{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}) { + {{#vars}} + this.{{name}} = {{name}}; + {{/vars}} + } + + {{#vars}} + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiException.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiException.mustache new file mode 100644 index 00000000000..4262b43dacf --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiException.mustache @@ -0,0 +1,24 @@ +package {{invokerPackage}}; + +public class ApiException extends RuntimeException { + private final String message; + private Integer statusCode; + + public ApiException(String message) { + this.message = message; + } + + @Override + public String getMessage() { + return message; + } + + public ApiException setStatusCode(Integer statusCode) { + this.statusCode = statusCode; + return this; + } + + public Integer getStatusCode() { + return statusCode; + } +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiResponse.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiResponse.mustache new file mode 100644 index 00000000000..03d1392de10 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ApiResponse.mustache @@ -0,0 +1,29 @@ +package {{invokerPackage}}; + +public class ApiResponse { + private final T data; + private Integer statusCode; + + public ApiResponse(T data) { + this.data = data; + } + + public ApiResponse() { + this.data = null; + } + + public T getData() { + return data; + } + + public ApiResponse setStatusCode(Integer statusCode) { + this.statusCode = statusCode; + return this; + } + + public Integer getStatusCode() { + return statusCode; + } +} + + diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/HttpServerVerticle.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/HttpServerVerticle.mustache new file mode 100644 index 00000000000..e155157f840 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/HttpServerVerticle.mustache @@ -0,0 +1,66 @@ +package {{invokerPackage}}; + +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerOptions; +import io.vertx.ext.web.RoutingContext; +import io.vertx.ext.web.api.contract.RouterFactoryOptions; +import io.vertx.reactivex.core.AbstractVerticle; +import io.vertx.reactivex.ext.web.api.contract.openapi3.OpenAPI3RouterFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; +{{#apiInfo}}{{#apis}} +import {{apiPackage}}.{{classname}}Handler;{{/apis}}{{/apiInfo}} + +public class HttpServerVerticle extends AbstractVerticle { + + private static final Logger logger = LoggerFactory.getLogger(HttpServerVerticle.class); + + private static String specFile = "src/main/resources/openapi.yaml"; + + private Map> operationHandlers = new HashMap<>(); + + @Override + public void start(Future fut) { + {{#apiInfo}}{{#apis}} + new {{classname}}Handler(operationHandlers);{{/apis}}{{/apiInfo}} + + OpenAPI3RouterFactory.rxCreate(vertx, specFile) + .doOnSuccess(factory -> { + factory.setOptions(new RouterFactoryOptions() + .setRequireSecurityHandlers(false) + .setMountNotImplementedHandler(false)); + factory.setValidationFailureHandler(this::validationFailureHandler); + operationHandlers.forEach(factory.getDelegate()::addHandlerByOperationId); + }) + .map(OpenAPI3RouterFactory::getRouter) + .doOnSuccess(router -> router.route().last().handler(this::methodNotFoundHandler)) + .map(router -> + vertx.createHttpServer(new HttpServerOptions() + .setPort(8080) + .setHost("localhost")) + .requestHandler(router) + .listen() + ) + .subscribe( httpServer -> { + logger.info("Http verticle deployed successful"); + fut.complete(); + }, error -> { + logger.info("Http verticle failed to deployed", error); + fut.fail(error.getCause()); + }); + } + + private void validationFailureHandler(io.vertx.reactivex.ext.web.RoutingContext rc) { + rc.response().setStatusCode(400) + .end("Bad Request : " + rc.failure().getMessage()); + } + + private void methodNotFoundHandler(io.vertx.reactivex.ext.web.RoutingContext rc) { + rc.response().setStatusCode(404) + .end("Method '" + rc.request().path() + "' Not Found"); + } +} diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/MainVerticle.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/MainVerticle.mustache new file mode 100644 index 00000000000..fd93c46ad92 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/MainVerticle.mustache @@ -0,0 +1,27 @@ +package {{invokerPackage}}; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Future; +import io.vertx.reactivex.core.AbstractVerticle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MainVerticle extends AbstractVerticle { + + private static final Logger logger = LoggerFactory.getLogger(MainVerticle.class); + + @Override + public void start(Future future) { + + DeploymentOptions options = new DeploymentOptions(); + options.setInstances(Runtime.getRuntime().availableProcessors()); + + vertx.deployVerticle(HttpServerVerticle.class.getName(), options, res -> { + if (!res.succeeded()) { + logger.error("Deployment fail reason: ", res.cause()); + } + }); + } +} + + diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ParameterCast.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ParameterCast.mustache new file mode 100644 index 00000000000..ba274ac31be --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/ParameterCast.mustache @@ -0,0 +1,88 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; + +import java.util.UUID; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +public class ParameterCast { + + public static Boolean toBoolean(String str) { + if (str != null) { + return Boolean.parseBoolean(str); + } else { + return null; + } + } + + public static UUID toUUID(String str) { + if (str != null) { + return UUID.fromString(str); + } else { + return null; + } + } + + public static Integer toInteger(String str) { + if (str != null) { + return Integer.parseInt(str); + } else { + return null; + } + } + + public static Long toLong(String str) { + if (str != null) { + return Long.parseLong(str); + } else { + return null; + } + } + + public static Double toDouble(String str) { + if (str != null){ + return Double.parseDouble(str); + } else { + return null; + } + } + + public static Float toFloat(String str) { + if (str != null){ + return Float.parseFloat(str); + } else { + return null; + } + } + + public static OffsetDateTime toOffsetDateTime(String str) { + if (str != null) { + return OffsetDateTime.parse(str, + DateTimeFormatter.ISO_OFFSET_DATE_TIME); + } else { + return null; + } + } + + public static String toString(String str) { + return str; + } + + public static T toObject(String str) { + if (str != null) { + return Json.decodeValue(str, new TypeReference(){}); + } else { + return null; + } + } + + public static T toObject(String str, Class classz) { + if (str != null) { + return Json.decodeValue(str, classz); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/openapi.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/openapi.mustache new file mode 100644 index 00000000000..51ebafb0187 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/openapi.mustache @@ -0,0 +1 @@ +{{{openapi-yaml}}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache new file mode 100644 index 00000000000..dbe1de73426 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaVertXWebServer/supportFiles/pom.mustache @@ -0,0 +1,102 @@ + + 4.0.0 + + {{groupId}} + {{artifactId}} + {{artifactVersion}} + jar + + {{appName}} + + + 3.6.3 + 1.7.26 + 4.12 + + + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + io.vertx + vertx-core + ${vertx.version} + + + io.vertx + vertx-web + ${vertx.version} + + + io.vertx + vertx-web-api-contract + ${vertx.version} + + + io.vertx + vertx-rx-java2 + ${vertx.version} + + + io.reactivex.rxjava2 + rxjava + 2.2.0 + + + + junit + junit + ${junit.version} + test + + + io.vertx + vertx-unit + ${vertx.version} + test + + + + + + + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + + + + io.vertx.core.Starter + {{invokerPackage}}.MainVerticle + + + + + ${project.build.directory}/${project.artifactId}-${project.version}-fat.jar + + + + + + + \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index 057b3c72e05..dcaf574f35f 100644 --- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -51,6 +51,7 @@ org.openapitools.codegen.languages.JavaPKMSTServerCodegen org.openapitools.codegen.languages.JavaPlayFrameworkCodegen org.openapitools.codegen.languages.JavaUndertowServerCodegen org.openapitools.codegen.languages.JavaVertXServerCodegen +org.openapitools.codegen.languages.JavaVertXWebServerCodegen org.openapitools.codegen.languages.JavaCXFServerCodegen org.openapitools.codegen.languages.JavaCXFExtServerCodegen org.openapitools.codegen.languages.JavaJAXRSCXFCDIServerCodegen diff --git a/pom.xml b/pom.xml index a8ebcd2a554..76812078fff 100644 --- a/pom.xml +++ b/pom.xml @@ -1167,6 +1167,7 @@ samples/server/petstore/scala-lagom-server samples/server/petstore/scala-play-server samples/server/petstore/scalatra + samples/server/petstore/java-vertx-web/rx samples/server/petstore/scala-finch samples/server/petstore/kotlin/vertx samples/server/petstore/kotlin-springboot diff --git a/samples/server/petstore/java-vertx-web/rx/.openapi-generator-ignore b/samples/server/petstore/java-vertx-web/rx/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/.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/rx/.openapi-generator/VERSION b/samples/server/petstore/java-vertx-web/rx/.openapi-generator/VERSION new file mode 100644 index 00000000000..c3a2c7076fa --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/.openapi-generator/VERSION @@ -0,0 +1 @@ +4.2.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/java-vertx-web/rx/README.md b/samples/server/petstore/java-vertx-web/rx/README.md new file mode 100644 index 00000000000..9bb8dfd4a23 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/README.md @@ -0,0 +1,11 @@ + +## Getting Started + +This document assumes you have maven available. + +To build the project using maven, run: +```bash +mvn package && java -jar target/target/java-vertx-web-rx-server-1.0.0-SNAPSHOT-fat.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/java-vertx-web/rx/pom.xml b/samples/server/petstore/java-vertx-web/rx/pom.xml new file mode 100644 index 00000000000..3417b239e17 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/pom.xml @@ -0,0 +1,102 @@ + + 4.0.0 + + org.openapitools + java-vertx-web-rx-server + 1.0.0-SNAPSHOT + jar + + OpenAPI Petstore + + + 3.6.3 + 1.7.26 + 4.12 + + + + + org.slf4j + slf4j-simple + ${slf4j.version} + + + io.vertx + vertx-core + ${vertx.version} + + + io.vertx + vertx-web + ${vertx.version} + + + io.vertx + vertx-web-api-contract + ${vertx.version} + + + io.vertx + vertx-rx-java2 + ${vertx.version} + + + io.reactivex.rxjava2 + rxjava + 2.2.0 + + + + junit + junit + ${junit.version} + test + + + io.vertx + vertx-unit + ${vertx.version} + test + + + + + + + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + + + + io.vertx.core.Starter + org.openapitools.vertxweb.server.MainVerticle + + + + + ${project.build.directory}/${project.artifactId}-${project.version}-fat.jar + + + + + + + \ No newline at end of file diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiException.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiException.java new file mode 100644 index 00000000000..e8f774793af --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiException.java @@ -0,0 +1,24 @@ +package org.openapitools.vertxweb.server; + +public class ApiException extends RuntimeException { + private final String message; + private Integer statusCode; + + public ApiException(String message) { + this.message = message; + } + + @Override + public String getMessage() { + return message; + } + + public ApiException setStatusCode(Integer statusCode) { + this.statusCode = statusCode; + return this; + } + + public Integer getStatusCode() { + return statusCode; + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java new file mode 100644 index 00000000000..9bac119c1d3 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ApiResponse.java @@ -0,0 +1,29 @@ +package org.openapitools.vertxweb.server; + +public class ApiResponse { + private final T data; + private Integer statusCode; + + public ApiResponse(T data) { + this.data = data; + } + + public ApiResponse() { + this.data = null; + } + + public T getData() { + return data; + } + + public ApiResponse setStatusCode(Integer statusCode) { + this.statusCode = statusCode; + return this; + } + + public Integer getStatusCode() { + return statusCode; + } +} + + diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/HttpServerVerticle.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/HttpServerVerticle.java new file mode 100644 index 00000000000..796bd14855a --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/HttpServerVerticle.java @@ -0,0 +1,70 @@ +package org.openapitools.vertxweb.server; + +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerOptions; +import io.vertx.ext.web.RoutingContext; +import io.vertx.ext.web.api.contract.RouterFactoryOptions; +import io.vertx.reactivex.core.AbstractVerticle; +import io.vertx.reactivex.ext.web.api.contract.openapi3.OpenAPI3RouterFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; + +import org.openapitools.vertxweb.server.api.PetApiHandler; +import org.openapitools.vertxweb.server.api.StoreApiHandler; +import org.openapitools.vertxweb.server.api.UserApiHandler; + +public class HttpServerVerticle extends AbstractVerticle { + + private static final Logger logger = LoggerFactory.getLogger(HttpServerVerticle.class); + + private static String specFile = "src/main/resources/openapi.yaml"; + + private Map> operationHandlers = new HashMap<>(); + + @Override + public void start(Future fut) { + + new PetApiHandler(operationHandlers); + new StoreApiHandler(operationHandlers); + new UserApiHandler(operationHandlers); + + OpenAPI3RouterFactory.rxCreate(vertx, specFile) + .doOnSuccess(factory -> { + factory.setOptions(new RouterFactoryOptions() + .setRequireSecurityHandlers(false) + .setMountNotImplementedHandler(false)); + factory.setValidationFailureHandler(this::validationFailureHandler); + operationHandlers.forEach(factory.getDelegate()::addHandlerByOperationId); + }) + .map(OpenAPI3RouterFactory::getRouter) + .doOnSuccess(router -> router.route().last().handler(this::methodNotFoundHandler)) + .map(router -> + vertx.createHttpServer(new HttpServerOptions() + .setPort(8080) + .setHost("localhost")) + .requestHandler(router) + .listen() + ) + .subscribe( httpServer -> { + logger.info("Http verticle deployed successful"); + fut.complete(); + }, error -> { + logger.info("Http verticle failed to deployed", error); + fut.fail(error.getCause()); + }); + } + + private void validationFailureHandler(io.vertx.reactivex.ext.web.RoutingContext rc) { + rc.response().setStatusCode(400) + .end("Bad Request : " + rc.failure().getMessage()); + } + + private void methodNotFoundHandler(io.vertx.reactivex.ext.web.RoutingContext rc) { + rc.response().setStatusCode(404) + .end("Method '" + rc.request().path() + "' Not Found"); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/MainVerticle.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/MainVerticle.java new file mode 100644 index 00000000000..b2aa995e38e --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/MainVerticle.java @@ -0,0 +1,27 @@ +package org.openapitools.vertxweb.server; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Future; +import io.vertx.reactivex.core.AbstractVerticle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MainVerticle extends AbstractVerticle { + + private static final Logger logger = LoggerFactory.getLogger(MainVerticle.class); + + @Override + public void start(Future future) { + + DeploymentOptions options = new DeploymentOptions(); + options.setInstances(Runtime.getRuntime().availableProcessors()); + + vertx.deployVerticle(HttpServerVerticle.class.getName(), options, res -> { + if (!res.succeeded()) { + logger.error("Deployment fail reason: ", res.cause()); + } + }); + } +} + + diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ParameterCast.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ParameterCast.java new file mode 100644 index 00000000000..471678d32f9 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/ParameterCast.java @@ -0,0 +1,88 @@ +package org.openapitools.vertxweb.server; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; + +import java.util.UUID; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; + +public class ParameterCast { + + public static Boolean toBoolean(String str) { + if (str != null) { + return Boolean.parseBoolean(str); + } else { + return null; + } + } + + public static UUID toUUID(String str) { + if (str != null) { + return UUID.fromString(str); + } else { + return null; + } + } + + public static Integer toInteger(String str) { + if (str != null) { + return Integer.parseInt(str); + } else { + return null; + } + } + + public static Long toLong(String str) { + if (str != null) { + return Long.parseLong(str); + } else { + return null; + } + } + + public static Double toDouble(String str) { + if (str != null){ + return Double.parseDouble(str); + } else { + return null; + } + } + + public static Float toFloat(String str) { + if (str != null){ + return Float.parseFloat(str); + } else { + return null; + } + } + + public static OffsetDateTime toOffsetDateTime(String str) { + if (str != null) { + return OffsetDateTime.parse(str, + DateTimeFormatter.ISO_OFFSET_DATE_TIME); + } else { + return null; + } + } + + public static String toString(String str) { + return str; + } + + public static T toObject(String str) { + if (str != null) { + return Json.decodeValue(str, new TypeReference(){}); + } else { + return null; + } + } + + public static T toObject(String str, Class classz) { + if (str != null) { + return Json.decodeValue(str, classz); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java new file mode 100644 index 00000000000..e7b397dc8ff --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApi.java @@ -0,0 +1,23 @@ +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.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public interface PetApi { + Single> addPet(Pet pet); + Single> deletePet(Long petId,String apiKey); + Single>> findPetsByStatus(List status); + Single>> findPetsByTags(List tags); + Single> getPetById(Long petId); + Single> updatePet(Pet pet); + Single> updatePetWithForm(Long petId,String name,String status); + Single> uploadFile(Long petId,String additionalMetadata,FileUpload file); +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java new file mode 100644 index 00000000000..e6e5f140a09 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiHandler.java @@ -0,0 +1,242 @@ +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.ParameterCast; +import org.openapitools.vertxweb.server.ApiException; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.RoutingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public class PetApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(PetApiHandler.class); + private PetApi apiImpl = new PetApiImpl(); + + public PetApiHandler(Map> operationHandlers) { + operationHandlers.put("addPet", this::addPet); + operationHandlers.put("deletePet", this::deletePet); + operationHandlers.put("findPetsByStatus", this::findPetsByStatus); + operationHandlers.put("findPetsByTags", this::findPetsByTags); + operationHandlers.put("getPetById", this::getPetById); + operationHandlers.put("updatePet", this::updatePet); + operationHandlers.put("updatePetWithForm", this::updatePetWithForm); + operationHandlers.put("uploadFile", this::uploadFile); + } + + private void addPet(RoutingContext routingContext) { + logger.info("addPet()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + Pet pet = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference(){}); + logger.info("Parameter pet is {}", pet); + return apiImpl.addPet(pet); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void deletePet(RoutingContext routingContext) { + logger.info("deletePet()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + Long petId = ParameterCast.toLong(routingContext.pathParams().get("petId")); + String apiKey = ParameterCast.toString(routingContext.request().getHeader("api_key")); + logger.info("Parameter petId is {}", petId); + logger.info("Parameter apiKey is {}", apiKey); + return apiImpl.deletePet(petId, apiKey); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void findPetsByStatus(RoutingContext routingContext) { + logger.info("findPetsByStatus()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + List status = routingContext.request().params().getAll("status"); + logger.info("Parameter status is {}", status); + return apiImpl.findPetsByStatus(status); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void findPetsByTags(RoutingContext routingContext) { + logger.info("findPetsByTags()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + List tags = routingContext.request().params().getAll("tags"); + logger.info("Parameter tags is {}", tags); + return apiImpl.findPetsByTags(tags); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void getPetById(RoutingContext routingContext) { + logger.info("getPetById()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + Long petId = ParameterCast.toLong(routingContext.pathParams().get("petId")); + logger.info("Parameter petId is {}", petId); + return apiImpl.getPetById(petId); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void updatePet(RoutingContext routingContext) { + logger.info("updatePet()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + Pet pet = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference(){}); + logger.info("Parameter pet is {}", pet); + return apiImpl.updatePet(pet); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void updatePetWithForm(RoutingContext routingContext) { + logger.info("updatePetWithForm()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + Long petId = ParameterCast.toLong(routingContext.pathParams().get("petId")); + String name = ParameterCast.toString(routingContext.request().getFormAttribute("name")); + String status = ParameterCast.toString(routingContext.request().getFormAttribute("status")); + logger.info("Parameter petId is {}", petId); + logger.info("Parameter name is {}", name); + logger.info("Parameter status is {}", status); + return apiImpl.updatePetWithForm(petId, name, status); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void uploadFile(RoutingContext routingContext) { + logger.info("uploadFile()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + Long petId = ParameterCast.toLong(routingContext.pathParams().get("petId")); + String additionalMetadata = ParameterCast.toString(routingContext.request().getFormAttribute("additionalMetadata")); + FileUpload file = routingContext.fileUploads().iterator().next(); + logger.info("Parameter petId is {}", petId); + logger.info("Parameter additionalMetadata is {}", additionalMetadata); + logger.info("Parameter file is {}", file); + return apiImpl.uploadFile(petId, additionalMetadata, file); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiImpl.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiImpl.java new file mode 100644 index 00000000000..d39237914ce --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/PetApiImpl.java @@ -0,0 +1,50 @@ +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 org.openapitools.vertxweb.server.ApiException; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +// Implement this class + +public class PetApiImpl implements PetApi { + public Single> addPet(Pet pet) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> deletePet(Long petId,String apiKey) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single>> findPetsByStatus(List status) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single>> findPetsByTags(List tags) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> getPetById(Long petId) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> updatePet(Pet pet) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> updatePetWithForm(Long petId,String name,String status) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> uploadFile(Long petId,String additionalMetadata,FileUpload file) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java new file mode 100644 index 00000000000..74219f9a90f --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApi.java @@ -0,0 +1,17 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.Order; + +import org.openapitools.vertxweb.server.ApiResponse; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public interface StoreApi { + Single> deleteOrder(String orderId); + Single>> getInventory(); + Single> getOrderById(Long orderId); + Single> placeOrder(Order order); +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java new file mode 100644 index 00000000000..b108bfc3953 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiHandler.java @@ -0,0 +1,127 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.Order; + +import org.openapitools.vertxweb.server.ParameterCast; +import org.openapitools.vertxweb.server.ApiException; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.RoutingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public class StoreApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(StoreApiHandler.class); + private StoreApi apiImpl = new StoreApiImpl(); + + public StoreApiHandler(Map> operationHandlers) { + operationHandlers.put("deleteOrder", this::deleteOrder); + operationHandlers.put("getInventory", this::getInventory); + operationHandlers.put("getOrderById", this::getOrderById); + operationHandlers.put("placeOrder", this::placeOrder); + } + + private void deleteOrder(RoutingContext routingContext) { + logger.info("deleteOrder()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String orderId = ParameterCast.toString(routingContext.pathParams().get("orderId")); + logger.info("Parameter orderId is {}", orderId); + return apiImpl.deleteOrder(orderId); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void getInventory(RoutingContext routingContext) { + logger.info("getInventory()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + return apiImpl.getInventory(); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void getOrderById(RoutingContext routingContext) { + logger.info("getOrderById()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + Long orderId = ParameterCast.toLong(routingContext.pathParams().get("orderId")); + logger.info("Parameter orderId is {}", orderId); + return apiImpl.getOrderById(orderId); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void placeOrder(RoutingContext routingContext) { + logger.info("placeOrder()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + Order order = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference(){}); + logger.info("Parameter order is {}", order); + return apiImpl.placeOrder(order); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiImpl.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiImpl.java new file mode 100644 index 00000000000..98a2ff13c65 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/StoreApiImpl.java @@ -0,0 +1,32 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.Order; + +import org.openapitools.vertxweb.server.ApiResponse; +import org.openapitools.vertxweb.server.ApiException; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +// Implement this class + +public class StoreApiImpl implements StoreApi { + public Single> deleteOrder(String orderId) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single>> getInventory() { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> getOrderById(Long orderId) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> placeOrder(Order order) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java new file mode 100644 index 00000000000..a2b84529d3b --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApi.java @@ -0,0 +1,21 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.User; + +import org.openapitools.vertxweb.server.ApiResponse; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public interface UserApi { + Single> createUser(User user); + Single> createUsersWithArrayInput(List user); + Single> createUsersWithListInput(List user); + Single> deleteUser(String username); + Single> getUserByName(String username); + Single> loginUser(String username,String password); + Single> logoutUser(); + Single> updateUser(String username,User user); +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java new file mode 100644 index 00000000000..825e42954e0 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiHandler.java @@ -0,0 +1,234 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.User; + +import org.openapitools.vertxweb.server.ParameterCast; +import org.openapitools.vertxweb.server.ApiException; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.vertx.core.json.Json; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.RoutingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +public class UserApiHandler { + + private static final Logger logger = LoggerFactory.getLogger(UserApiHandler.class); + private UserApi apiImpl = new UserApiImpl(); + + public UserApiHandler(Map> operationHandlers) { + operationHandlers.put("createUser", this::createUser); + operationHandlers.put("createUsersWithArrayInput", this::createUsersWithArrayInput); + operationHandlers.put("createUsersWithListInput", this::createUsersWithListInput); + operationHandlers.put("deleteUser", this::deleteUser); + operationHandlers.put("getUserByName", this::getUserByName); + operationHandlers.put("loginUser", this::loginUser); + operationHandlers.put("logoutUser", this::logoutUser); + operationHandlers.put("updateUser", this::updateUser); + } + + private void createUser(RoutingContext routingContext) { + logger.info("createUser()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + User user = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference(){}); + logger.info("Parameter user is {}", user); + return apiImpl.createUser(user); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void createUsersWithArrayInput(RoutingContext routingContext) { + logger.info("createUsersWithArrayInput()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + List user = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference>(){}); + logger.info("Parameter user is {}", user); + return apiImpl.createUsersWithArrayInput(user); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void createUsersWithListInput(RoutingContext routingContext) { + logger.info("createUsersWithListInput()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String jsonString = routingContext.getBodyAsString(); + List user = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference>(){}); + logger.info("Parameter user is {}", user); + return apiImpl.createUsersWithListInput(user); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void deleteUser(RoutingContext routingContext) { + logger.info("deleteUser()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String username = ParameterCast.toString(routingContext.pathParams().get("username")); + logger.info("Parameter username is {}", username); + return apiImpl.deleteUser(username); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void getUserByName(RoutingContext routingContext) { + logger.info("getUserByName()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String username = ParameterCast.toString(routingContext.pathParams().get("username")); + logger.info("Parameter username is {}", username); + return apiImpl.getUserByName(username); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void loginUser(RoutingContext routingContext) { + logger.info("loginUser()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String username = ParameterCast.toString(routingContext.queryParams().get("username")); + String password = ParameterCast.toString(routingContext.queryParams().get("password")); + logger.info("Parameter username is {}", username); + logger.info("Parameter password is {}", password); + return apiImpl.loginUser(username, password); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void logoutUser(RoutingContext routingContext) { + logger.info("logoutUser()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + return apiImpl.logoutUser(); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + + + private void updateUser(RoutingContext routingContext) { + logger.info("updateUser()"); + HttpServerResponse response = routingContext.response(); + + Single.defer( () -> { + String username = ParameterCast.toString(routingContext.pathParams().get("username")); + String jsonString = routingContext.getBodyAsString(); + User user = jsonString == null ? null : Json.decodeValue(jsonString, new TypeReference(){}); + logger.info("Parameter username is {}", username); + logger.info("Parameter user is {}", user); + return apiImpl.updateUser(username, user); + }) + .subscribe( + apiResponse -> { + response.setStatusCode(apiResponse.getStatusCode()) + .end(Json.encodePrettily(apiResponse.getData())); + }, error -> { + if (error instanceof ApiException) { + ApiException apiException = (ApiException) error; + response.setStatusCode(apiException.getStatusCode()).end(apiException.getMessage()); + } else { + response.setStatusCode(500).end(error.getMessage()); + } + }).dispose(); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiImpl.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiImpl.java new file mode 100644 index 00000000000..ea4ab28a116 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/api/UserApiImpl.java @@ -0,0 +1,48 @@ +package org.openapitools.vertxweb.server.api; + +import org.openapitools.vertxweb.server.model.User; + +import org.openapitools.vertxweb.server.ApiResponse; +import org.openapitools.vertxweb.server.ApiException; + +import io.reactivex.Single; + +import java.util.List; +import java.util.Map; + +// Implement this class + +public class UserApiImpl implements UserApi { + public Single> createUser(User user) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> createUsersWithArrayInput(List user) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> createUsersWithListInput(List user) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> deleteUser(String username) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> getUserByName(String username) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> loginUser(String username,String password) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> logoutUser() { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + + public Single> updateUser(String username,User user) { + return Single.error(new ApiException("Not Implemented").setStatusCode(501)); + } + +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Category.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Category.java new file mode 100644 index 00000000000..b880122ba95 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Category.java @@ -0,0 +1,83 @@ +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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject.java new file mode 100644 index 00000000000..c7a35a888b9 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject.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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class InlineObject { + + private String name; + private String status; + + public InlineObject () { + + } + + public InlineObject (String name, String status) { + this.name = name; + this.status = status; + } + + + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @JsonProperty("status") + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InlineObject inlineObject = (InlineObject) o; + return Objects.equals(name, inlineObject.name) && + Objects.equals(status, inlineObject.status); + } + + @Override + public int hashCode() { + return Objects.hash(name, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InlineObject {\n"); + + sb.append(" name: ").append(toIndentedString(name)).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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject1.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject1.java new file mode 100644 index 00000000000..14268dda3c5 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/InlineObject1.java @@ -0,0 +1,81 @@ +package org.openapitools.vertxweb.server.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.vertx.ext.web.FileUpload; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class InlineObject1 { + + private String additionalMetadata; + private FileUpload file; + + public InlineObject1 () { + + } + + public InlineObject1 (String additionalMetadata, FileUpload file) { + this.additionalMetadata = additionalMetadata; + this.file = file; + } + + + @JsonProperty("additionalMetadata") + public String getAdditionalMetadata() { + return additionalMetadata; + } + public void setAdditionalMetadata(String additionalMetadata) { + this.additionalMetadata = additionalMetadata; + } + + + @JsonProperty("file") + public FileUpload getFile() { + return file; + } + public void setFile(FileUpload file) { + this.file = file; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + InlineObject1 inlineObject1 = (InlineObject1) o; + return Objects.equals(additionalMetadata, inlineObject1.additionalMetadata) && + Objects.equals(file, inlineObject1.file); + } + + @Override + public int hashCode() { + return Objects.hash(additionalMetadata, file); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class InlineObject1 {\n"); + + sb.append(" additionalMetadata: ").append(toIndentedString(additionalMetadata)).append("\n"); + sb.append(" file: ").append(toIndentedString(file)).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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java new file mode 100644 index 00000000000..0113640b485 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/ModelApiResponse.java @@ -0,0 +1,96 @@ +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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Order.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Order.java new file mode 100644 index 00000000000..f9f5906416c --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Order.java @@ -0,0 +1,157 @@ +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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Pet.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Pet.java new file mode 100644 index 00000000000..d4bf37886cd --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Pet.java @@ -0,0 +1,160 @@ +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.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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Tag.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Tag.java new file mode 100644 index 00000000000..46ee7f830ad --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/Tag.java @@ -0,0 +1,83 @@ +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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/User.java b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/User.java new file mode 100644 index 00000000000..0f9fcdfd4e8 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/java/org/openapitools/vertxweb/server/model/User.java @@ -0,0 +1,161 @@ +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) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/server/petstore/java-vertx-web/rx/src/main/resources/openapi.yaml b/samples/server/petstore/java-vertx-web/rx/src/main/resources/openapi.yaml new file mode 100644 index 00000000000..fd6a6764be4 --- /dev/null +++ b/samples/server/petstore/java-vertx-web/rx/src/main/resources/openapi.yaml @@ -0,0 +1,837 @@ +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: http://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: + operationId: addPet + requestBody: + $ref: '#/components/requestBodies/Pet' + responses: + 405: + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet + x-contentType: application/json + x-accepts: application/json + put: + operationId: updatePet + requestBody: + $ref: '#/components/requestBodies/Pet' + responses: + 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-contentType: application/json + x-accepts: application/json + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - 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 + /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 + /pet/{petId}: + delete: + 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 + post: + 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: + $ref: '#/components/requestBodies/inline_object' + content: + application/x-www-form-urlencoded: + schema: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + type: object + 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-contentType: application/x-www-form-urlencoded + x-accepts: application/json + /pet/{petId}/uploadImage: + post: + 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: + $ref: '#/components/requestBodies/inline_object_1' + content: + multipart/form-data: + schema: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + format: binary + type: string + type: object + 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-contentType: 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: + 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-contentType: application/json + x-accepts: application/json + /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 generated 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 + /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: + - auth_cookie: [] + summary: Create user + tags: + - user + x-contentType: application/json + x-accepts: application/json + /user/createWithArray: + post: + operationId: createUsersWithArrayInput + requestBody: + $ref: '#/components/requestBodies/UserArray' + responses: + default: + description: successful operation + security: + - auth_cookie: [] + summary: Creates list of users with given input array + tags: + - user + x-contentType: application/json + x-accepts: application/json + /user/createWithList: + post: + operationId: createUsersWithListInput + requestBody: + $ref: '#/components/requestBodies/UserArray' + responses: + default: + description: successful operation + security: + - auth_cookie: [] + summary: Creates list of users with given input array + tags: + - user + x-contentType: application/json + x-accepts: application/json + /user/login: + get: + 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 `auth_cookie` + 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 toekn 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 + /user/logout: + get: + operationId: logoutUser + responses: + default: + description: successful operation + security: + - auth_cookie: [] + 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: + - auth_cookie: [] + summary: Delete user + tags: + - user + x-accepts: application/json + get: + 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 + 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: + - auth_cookie: [] + summary: Updated user + tags: + - user + x-contentType: 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 + inline_object: + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/inline_object' + inline_object_1: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/inline_object_1' + schemas: + Order: + description: An order for a pets from the pet store + example: + petId: 6 + quantity: 1 + id: 0 + shipDate: 2000-01-23T04:56:07.000+00:00 + complete: false + status: placed + 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: + name: name + id: 6 + 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: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username + 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: + name: name + id: 1 + 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: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 0 + category: + name: name + id: 6 + tags: + - name: name + id: 1 + - name: name + id: 1 + 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: + 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 + inline_object: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + type: object + inline_object_1: + 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 + auth_cookie: + in: cookie + name: AUTH_KEY + type: apiKey