This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new d1470dd CXF-7957: Swagger2Feature Doesn't Work With Swagger Versions
Above 1.… (#507)
d1470dd is described below
commit d1470dd0e14aa001dde1227bfb456a8b4cf0061e
Author: James Carman <[email protected]>
AuthorDate: Wed Jan 30 16:45:53 2019 -0500
CXF-7957: Swagger2Feature Doesn't Work With Swagger Versions Above 1.…
(#507)
* CXF-7957: Swagger2Feature Doesn't Work With Swagger Versions Above 1.5.17
* Adding entity type check to make it compatible with 1.5.17
* Removing comment for bug fixed by this PR.
* Fixing checkstyle errors.
---
parent/pom.xml | 2 +-
.../apache/cxf/jaxrs/swagger/Swagger2Feature.java | 3 +
.../openapi/SwaggerToOpenApiConversionFilter.java | 5 +-
.../cxf/jaxrs/swagger/parse/SwaggerParseUtils.java | 68 +-
.../jaxrs/swagger/parse/SwaggerParseUtilsTest.java | 6 +
.../swagger2petShopWithNullOperations.json | 742 +++++++++++++++++++++
6 files changed, 790 insertions(+), 36 deletions(-)
diff --git a/parent/pom.xml b/parent/pom.xml
index c221ada..867e785 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -164,7 +164,7 @@
<cxf.spring.osgi.version>1.2.1</cxf.spring.osgi.version>
<cxf.spring.ldap.version>2.3.2.RELEASE</cxf.spring.ldap.version>
<cxf.spring.mock>spring-test</cxf.spring.mock>
- <cxf.swagger2.version>1.5.17</cxf.swagger2.version><!-- updating to
1.5.18 will cause systest failures -->
+ <cxf.swagger2.version>1.5.21</cxf.swagger2.version>
<cxf.swagger.v3.version>2.0.6</cxf.swagger.v3.version>
<cxf.swagger.ui.version>3.20.5</cxf.swagger.ui.version>
<cxf.tomcat.version>8.5.37</cxf.tomcat.version>
diff --git
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
index d164e54..9bb7fd0 100644
---
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
+++
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/Swagger2Feature.java
@@ -63,6 +63,7 @@ import io.swagger.jaxrs.config.DefaultReaderConfig;
import io.swagger.jaxrs.config.ReaderConfig;
import io.swagger.jaxrs.config.SwaggerContextService;
import io.swagger.jaxrs.listing.ApiListingResource;
+import io.swagger.jaxrs.listing.SwaggerSerializers;
import io.swagger.models.Swagger;
import io.swagger.models.auth.SecuritySchemeDefinition;
@@ -151,6 +152,8 @@ public class Swagger2Feature extends AbstractSwaggerFeature
implements SwaggerUi
swaggerResources.add(apiListingResource);
List<Object> providers = new ArrayList<>();
+ providers.add(new SwaggerSerializers());
+
if (isRunAsFilter()) {
providers.add(new SwaggerContainerRequestFilter(appInfo == null ?
null : appInfo.getProvider(),
customizer));
diff --git
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
index 4faa803..3aa7c97 100644
---
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
+++
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/openapi/SwaggerToOpenApiConversionFilter.java
@@ -31,6 +31,8 @@ import javax.ws.rs.ext.Provider;
import org.apache.cxf.jaxrs.ext.MessageContext;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
+import io.swagger.util.Json;
+
@Provider
@PreMatching
public final class SwaggerToOpenApiConversionFilter implements
ContainerRequestFilter, ContainerResponseFilter {
@@ -55,7 +57,8 @@ public final class SwaggerToOpenApiConversionFilter
implements ContainerRequestF
@Override
public void filter(ContainerRequestContext reqCtx,
ContainerResponseContext respCtx) throws IOException {
if (Boolean.TRUE == reqCtx.getProperty(OPEN_API_PROPERTY)) {
- String swaggerJson = (String)respCtx.getEntity();
+ String swaggerJson = respCtx.getEntity() instanceof String ?
(String)respCtx.getEntity()
+ : Json.pretty(respCtx.getEntity());
String openApiJson =
SwaggerToOpenApiConversionUtils.getOpenApiFromSwaggerJson(
createMessageContext(), swaggerJson, openApiConfig);
respCtx.setEntity(openApiJson);
diff --git
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtils.java
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtils.java
index 19c8530..50284c1 100644
---
a/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtils.java
+++
b/rt/rs/description-swagger/src/main/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtils.java
@@ -131,41 +131,41 @@ public final class SwaggerParseUtils {
userOp.setVerb(operEntry.getKey().toUpperCase());
Map<String, Object> oper = CastUtils.cast((Map<?,
?>)operEntry.getValue());
-
- userOp.setPath(operPath);
-
- userOp.setName((String)oper.get("operationId"));
- List<String> opProduces =
CastUtils.cast((List<?>)oper.get("produces"));
- userOp.setProduces(listToString(opProduces));
-
- List<String> opConsumes =
CastUtils.cast((List<?>)oper.get("consumes"));
- userOp.setConsumes(listToString(opConsumes));
-
- List<Parameter> userOpParams = new LinkedList<>();
- List<Map<String, Object>> params =
CastUtils.cast((List<?>)oper.get("parameters"));
- for (Map<String, Object> param : params) {
- String name = (String)param.get("name");
- //"query", "header", "path", "formData" or "body"
- String paramType = (String)param.get("in");
- ParameterType pType = "body".equals(paramType) ?
ParameterType.REQUEST_BODY
- : "formData".equals(paramType)
- ? ParameterType.FORM :
ParameterType.valueOf(paramType.toUpperCase());
- Parameter userParam = new Parameter(pType, name);
-
- setJavaType(userParam, (String)param.get("type"));
- userOpParams.add(userParam);
+ if (oper != null) {
+ userOp.setPath(operPath);
+
+ userOp.setName((String) oper.get("operationId"));
+ List<String> opProduces = CastUtils.cast((List<?>)
oper.get("produces"));
+ userOp.setProduces(listToString(opProduces));
+
+ List<String> opConsumes = CastUtils.cast((List<?>)
oper.get("consumes"));
+ userOp.setConsumes(listToString(opConsumes));
+
+ List<Parameter> userOpParams = new LinkedList<>();
+ List<Map<String, Object>> params =
CastUtils.cast((List<?>) oper.get("parameters"));
+ for (Map<String, Object> param : params) {
+ String name = (String) param.get("name");
+ //"query", "header", "path", "formData" or "body"
+ String paramType = (String) param.get("in");
+ ParameterType pType = "body".equals(paramType) ?
ParameterType.REQUEST_BODY
+ : "formData".equals(paramType)
+ ? ParameterType.FORM :
ParameterType.valueOf(paramType.toUpperCase());
+ Parameter userParam = new Parameter(pType, name);
+
+ setJavaType(userParam, (String) param.get("type"));
+ userOpParams.add(userParam);
+ }
+ if (!userOpParams.isEmpty()) {
+ userOp.setParameters(userOpParams);
+ }
+ List<String> opTags = CastUtils.cast((List<?>)
oper.get("tags"));
+ if (opTags == null) {
+ opTags = Collections.singletonList("");
+ }
+ for (String opTag : opTags) {
+ userOpsMap.get(opTag).add(userOp);
+ }
}
- if (!userOpParams.isEmpty()) {
- userOp.setParameters(userOpParams);
- }
- List<String> opTags =
CastUtils.cast((List<?>)oper.get("tags"));
- if (opTags == null) {
- opTags = Collections.singletonList("");
- }
- for (String opTag : opTags) {
- userOpsMap.get(opTag).add(userOp);
- }
-
}
}
diff --git
a/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtilsTest.java
b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtilsTest.java
index 71bf469..21ec121 100644
---
a/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtilsTest.java
+++
b/rt/rs/description-swagger/src/test/java/org/apache/cxf/jaxrs/swagger/parse/SwaggerParseUtilsTest.java
@@ -490,4 +490,10 @@ public class SwaggerParseUtilsTest {
assertEquals(String.class, param2.getJavaType());
}
+
+ @Test
+ public void testConvertSwaggerWithNullValuesForOperations() {
+ UserApplication ap =
SwaggerParseUtils.getUserApplication("/swagger2petShopWithNullOperations.json");
+ assertNotNull(ap);
+ }
}
\ No newline at end of file
diff --git
a/rt/rs/description-swagger/src/test/resources/swagger2petShopWithNullOperations.json
b/rt/rs/description-swagger/src/test/resources/swagger2petShopWithNullOperations.json
new file mode 100644
index 0000000..fe03b1a
--- /dev/null
+++
b/rt/rs/description-swagger/src/test/resources/swagger2petShopWithNullOperations.json
@@ -0,0 +1,742 @@
+{"swagger":"2.0",
+ "info":{
+ "description":"This is a sample server Petstore server. You can find out
more about Swagger at [http://swagger.io](http://swagger.io) or on
[irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can
use the api key `special-key` to test the authorization filters.",
+ "version":"1.0.0","title":"Swagger Petstore",
+ "termsOfService":"http://swagger.io/terms/",
+ "contact":{
+ "email":"[email protected]"
+ },
+ "license":{
+ "name":"Apache 2.0",
+ "url":"http://www.apache.org/licenses/LICENSE-2.0.html"
+ }
+ },
+ "host":"petstore.swagger.io",
+ "basePath":"/v2",
+ "tags":[
+ {
+ "name":"pet",
+ "description":"Everything about your Pets",
+ "externalDocs":{
+ "description":"Find out more",
+ "url":"http://swagger.io"
+ }
+ },
+ {
+ "name":"store",
+ "description":"Access to Petstore orders"
+ },
+ {
+ "name":"user",
+ "description":"Operations about user",
+ "externalDocs":{
+ "description": "Find out more about our store",
+ "url":"http://swagger.io"
+ }
+ }
+ ],
+ "schemes":["http"],
+ "paths":{
+ "/pet":{
+ "head": null,
+ "post":{
+ "tags":["pet"],
+ "summary":"Add a new pet to the store",
+ "description":"",
+ "operationId":"addPet",
+ "consumes":["application/json","application/xml"],
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"Pet object that needs to be added to the store",
+ "required":true,
+ "schema":{"$ref":"#/definitions/Pet"}
+ }
+ ],
+ "responses":{
+ "405":{"description":"Invalid input"}
+ },
+ "security":[
+ {
+ "petstore_auth":[
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ },
+ "put":{
+ "tags":["pet"],
+ "summary":"Update an existing pet",
+ "description":"",
+ "operationId":"updatePet",
+ "consumes":["application/json","application/xml"],
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"Pet object that needs to be added to the store",
+ "required":true,
+ "schema":{"$ref":"#/definitions/Pet"}
+ }
+ ],
+ "responses":{
+ "400":{"description":"Invalid ID supplied"},
+ "404":{"description":"Pet not found"},
+ "405":{"description":"Validation exception"}
+ },
+ "security":[
+ {
+ "petstore_auth":["write:pets","read:pets"]
+ }
+ ]
+ }
+ },
+
+ "/pet/findByStatus":{
+ "get":{
+ "tags":["pet"],
+ "summary":"Finds Pets by status",
+ "description":"Multiple status values can be provided with comma
separated strings",
+ "operationId":"findPetsByStatus",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"status",
+ "in":"query",
+ "description":"Status values that need to be considered for
filter",
+ "required":true,
+ "type":"array",
+ "items":{
+ "type":"string",
+ "enum":["available","pending","sold"],
+ "default":"available"
+ },
+ "collectionFormat":"multi"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"type":"array","items":{"$ref":"#/definitions/Pet"}}
+ },
+ "400":{"description":"Invalid status value"}
+ },
+ "security":[
+ {"petstore_auth":["write:pets","read:pets"]}
+ ]
+ }
+ },
+ "/pet/findByTags":{
+ "get":{
+ "tags":["pet"],
+ "summary":"Finds Pets by tags",
+ "description":"Muliple tags can be provided with comma separated
strings. Use tag1, tag2, tag3 for testing.",
+ "operationId":"findPetsByTags",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"tags",
+ "in":"query",
+ "description":"Tags to filter by",
+ "required":true,
+ "type":"array",
+ "items":{
+ "type":"string"
+ },
+ "collectionFormat":"multi"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"type":"array","items":{"$ref":"#/definitions/Pet"}}},
+ "400":{
+ "description":"Invalid tag value"}
+ },
+ "security":[
+ {"petstore_auth":["write:pets","read:pets"]}
+ ],
+ "deprecated":true
+ }
+ },
+ "/pet/{petId}":{
+ "get":{
+ "tags":["pet"],
+ "summary":"Find pet by ID",
+ "description":"Returns a single pet",
+ "operationId":"getPetById",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"petId",
+ "in":"path",
+ "description":"ID of pet to return",
+ "required":true,
+ "type":"integer",
+ "format":"int64"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"$ref":"#/definitions/Pet"}
+ },
+ "400":{
+ "description":"Invalid ID supplied"
+ },
+ "404":{
+ "description":"Pet not found"}
+ },
+ "security":[
+ {"api_key":[]}
+ ]
+ },
+ "post":{
+ "tags":["pet"],
+ "summary":"Updates a pet in the store with form data",
+ "description":"",
+ "operationId":"updatePetWithForm",
+ "consumes":["application/x-www-form-urlencoded"],
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"petId",
+ "in":"path",
+ "description":"ID of pet that needs to be updated",
+ "required":true,
+ "type":"integer",
+ "format":"int64"
+ },
+ {
+ "name":"name",
+ "in":"formData",
+ "description":"Updated name of the pet",
+ "required":false,
+ "type":"string"
+ },
+ {
+ "name":"status",
+ "in":"formData",
+ "description":"Updated status of the pet",
+ "required":false,
+ "type":"string"
+ }
+ ],
+ "responses":{
+ "405":{
+ "description":"Invalid input"}
+ },
+ "security":[
+ {"petstore_auth":["write:pets","read:pets"]}
+ ]
+ },
+ "delete":{
+ "tags":["pet"],
+ "summary":"Deletes a pet",
+ "description":"",
+ "operationId":"deletePet",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"api_key",
+ "in":"header",
+ "required":false,
+ "type":"string"
+ },
+ {
+ "name":"petId",
+ "in":"path",
+ "description":"Pet id to delete",
+ "required":true,
+ "type":"integer",
+ "format":"int64"
+ }
+ ],
+ "responses":{
+ "400":{
+ "description":"Invalid ID supplied"
+ },
+ "404":{
+ "description":"Pet not found"
+ }
+ },
+ "security":[
+ {"petstore_auth":["write:pets","read:pets"]}
+ ]
+ }
+ },
+ "/pet/{petId}/uploadImage":{
+ "post":{
+ "tags":["pet"],
+ "summary":"uploads an image",
+ "description":"",
+ "operationId":"uploadFile",
+ "consumes":["multipart/form-data"],
+ "produces":["application/json"],
+ "parameters":[
+ {
+ "name":"petId",
+ "in":"path",
+ "description":"ID of pet to update",
+ "required":true,
+ "type":"integer",
+ "format":"int64"
+ },
+ {
+ "name":"additionalMetadata",
+ "in":"formData",
+ "description":"Additional data to pass to server",
+ "required":false,
+ "type":"string"
+ },
+ {
+ "name":"file",
+ "in":"formData",
+ "description":"file to upload",
+ "required":false,
+ "type":"file"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"$ref":"#/definitions/ApiResponse"}
+ }
+ },
+ "security":[{"petstore_auth":["write:pets","read:pets"]}]
+ }
+ },
+ "/store/inventory":{
+ "get":{
+ "tags":["store"],
+ "summary":"Returns pet inventories by status",
+ "description":"Returns a map of status codes to quantities",
+ "operationId":"getInventory",
+ "produces":["application/json"],
+ "parameters":[],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{
+ "type":"object",
+ "additionalProperties":{"type":"integer","format":"int32"}
+ }
+ }
+ },
+ "security":[{"api_key":[]}]
+ }
+ },
+ "/store/order":{
+ "post":{
+ "tags":["store"],
+ "summary":"Place an order for a pet",
+ "description":"",
+ "operationId":"placeOrder",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"order placed for purchasing the pet",
+ "required":true,
+ "schema":{"$ref":"#/definitions/Order"}
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"$ref":"#/definitions/Order"}
+ },
+ "400":{
+ "description":"Invalid Order"
+ }
+ }
+ }
+ },
+ "/store/order/{orderId}":{
+ "get":{
+ "tags":["store"],
+ "summary":"Find purchase order by ID",
+ "description":"For valid response try integer IDs with value >= 1 and
<= 10. Other values will generated exceptions",
+ "operationId":"getOrderById",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"orderId",
+ "in":"path",
+ "description":"ID of pet that needs to be fetched",
+ "required":true,
+ "type":"integer",
+ "maximum":10.0,
+ "minimum":1.0,
+ "format":"int64"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"$ref":"#/definitions/Order"}
+ },
+ "400":{
+ "description":"Invalid ID supplied"
+ },
+ "404":{
+ "description":"Order not found"
+ }
+ }
+ },
+ "delete":{
+ "tags":["store"],
+ "summary":"Delete purchase order by ID",
+ "description":"For valid response try integer IDs with positive
integer value. Negative or non-integer values will generate API errors",
+ "operationId":"deleteOrder",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"orderId",
+ "in":"path",
+ "description":"ID of the order that needs to be deleted",
+ "required":true,
+ "type":"integer",
+ "minimum":1.0,
+ "format":"int64"
+ }
+ ],
+ "responses":
+ {
+ "400":{
+ "description":"Invalid ID supplied"
+ },
+ "404":{
+ "description":"Order not found"}
+ }
+ }
+ },
+ "/user":{
+ "post":{
+ "tags":["user"],
+ "summary":"Create user",
+ "description":"This can only be done by the logged in user.",
+ "operationId":"createUser",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"Created user object",
+ "required":true,
+ "schema":{"$ref":"#/definitions/User"}
+ }
+ ],
+ "responses":{
+ "default":{
+ "description":"successful operation"}
+ }
+ }
+ },
+ "/user/createWithArray":{
+ "post":{
+ "tags":["user"],
+ "summary":"Creates list of users with given input array",
+ "description":"",
+ "operationId":"createUsersWithArrayInput",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"List of user object",
+ "required":true,
+ "schema":{
+ "type":"array",
+ "items":{"$ref":"#/definitions/User"}
+ }
+ }
+ ],
+ "responses":{
+ "default":{"description":"successful operation"}
+ }
+ }
+ },
+ "/user/createWithList":{
+ "post":{
+ "tags":["user"],
+ "summary":"Creates list of users with given input array",
+ "description":"",
+ "operationId":"createUsersWithListInput",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "in":"body",
+ "name":"body",
+ "description":"List of user object",
+ "required":true,
+ "schema":{
+ "type":"array",
+ "items":{"$ref":"#/definitions/User"}
+ }
+ }
+ ],
+ "responses":{
+ "default":{"description":"successful operation"}
+ }
+ }
+ },
+ "/user/login":{
+ "get":{
+ "tags":["user"],
+ "summary":"Logs user into the system",
+ "description":"",
+ "operationId":"loginUser",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"username",
+ "in":"query",
+ "description":"The user name for login",
+ "required":true,
+ "type":"string"
+ },
+ {
+ "name":"password",
+ "in":"query",
+ "description":"The password for login in clear text",
+ "required":true,
+ "type":"string"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"type":"string"},
+ "headers":{
+ "X-Rate-Limit":{
+ "type":"integer",
+ "format":"int32",
+ "description":"calls per hour allowed by the user"
+ },
+ "X-Expires-After":{
+ "type":"string",
+ "format":"date-time",
+ "description":"date in UTC when token expires"
+ }
+ }
+ },
+ "400":{"description":"Invalid username/password supplied"}
+ }
+ }
+ },
+ "/user/logout":{
+ "get":{
+ "tags":["user"],
+ "summary":"Logs out current logged in user session",
+ "description":"",
+ "operationId":"logoutUser",
+ "produces":["application/xml","application/json"],
+ "parameters":[],
+ "responses":{
+ "default":{"description":"successful operation"}
+ }
+ }
+ },
+ "/user/{username}":{
+ "get":{
+ "tags":["user"],
+ "summary":"Get user by user name",
+ "description":"",
+ "operationId":"getUserByName",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"username",
+ "in":"path",
+ "description":"The name that needs to be fetched. Use user1 for
testing. ",
+ "required":true,
+ "type":"string"
+ }
+ ],
+ "responses":{
+ "200":{
+ "description":"successful operation",
+ "schema":{"$ref":"#/definitions/User"}
+ },
+ "400":{"description":"Invalid username supplied"},
+ "404":{"description":"User not found"}
+ }
+ },
+ "put":{
+ "tags":["user"],
+ "summary":"Updated user",
+ "description":"This can only be done by the logged in user.",
+ "operationId":"updateUser",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"username",
+ "in":"path",
+ "description":"name that need to be updated",
+ "required":true,
+ "type":"string"
+ },
+ {
+ "in":"body",
+ "name":"body",
+ "description":"Updated user object",
+ "required":true,
+ "schema":{"$ref":"#/definitions/User"}
+ }
+ ],
+ "responses":{
+ "400":{"description":"Invalid user supplied"},
+ "404":{"description":"User not found"}
+ }
+ },
+ "delete":{
+ "tags":["user"],
+ "summary":"Delete user",
+ "description":"This can only be done by the logged in user.",
+ "operationId":"deleteUser",
+ "produces":["application/xml","application/json"],
+ "parameters":[
+ {
+ "name":"username",
+ "in":"path",
+ "description":"The name that needs to be deleted",
+ "required":true,"type":"string"
+ }
+ ],
+ "responses":{
+ "400":{"description":"Invalid username supplied"},
+ "404":{"description":"User not found"}
+ }
+ }
+ }
+ },
+ "securityDefinitions":{
+ "petstore_auth":{
+ "type":"oauth2",
+ "authorizationUrl":"http://petstore.swagger.io/oauth/dialog",
+ "flow":"implicit",
+ "scopes":{
+ "write:pets":"modify pets in your account",
+ "read:pets":"read your pets"
+ }
+ },
+ "api_key":{
+ "type":"apiKey",
+ "name":"api_key",
+ "in":"header"
+ }
+ },
+ "definitions":{
+ "Order":{
+ "type":"object",
+ "properties":{
+ "id":{
+ "type":"integer",
+ "format":"int64"
+ },
+ "petId":{
+ "type":"integer",
+ "format":"int64"
+ },
+ "quantity":{
+ "type":"integer",
+ "format":"int32"
+ },
+ "shipDate":{
+ "type":"string",
+ "format":"date-time"
+ },
+ "status":{
+ "type":"string",
+ "description":"Order Status",
+ "enum":["placed","approved","delivered"]
+ },
+ "complete":{
+ "type":"boolean",
+ "default":false
+ }
+ },
+ "xml":{
+ "name":"Order"
+ }
+ },
+ "Category":{
+ "type":"object",
+ "properties":{
+ "id":{
+ "type":"integer","format":"int64"
+ },
+ "name":{
+ "type":"string"}
+ },
+ "xml":{"name":"Category"}
+ },
+ "User":{
+ "type":"object",
+ "properties":{
+ "id":{
+ "type":"integer",
+ "format":"int64"
+ },
+ "username":{"type":"string"},
+ "firstName":{"type":"string"},
+ "lastName":{"type":"string"},
+ "email":{"type":"string"},
+ "password":{"type":"string"},
+ "phone":{"type":"string"},
+ "userStatus":{
+ "type":"integer",
+ "format":"int32",
+ "description":"User Status"
+ }
+ },
+ "xml":{"name":"User"}
+ },
+ "Tag":{
+ "type":"object",
+ "properties":{
+ "id":{"type":"integer","format":"int64"},
+ "name":{"type":"string"}
+ },
+ "xml":{"name":"Tag"}
+ },
+ "Pet":{
+ "type":"object",
+ "required":["name","photoUrls"],
+ "properties":{
+ "id":{"type":"integer","format":"int64"},
+ "category":{"$ref":"#/definitions/Category"},
+ "name":{"type":"string","example":"doggie"},
+ "photoUrls":{
+ "type":"array",
+ "xml":{"name":"photoUrl","wrapped":true},
+ "items":{"type":"string"}
+ },
+ "tags":{
+ "type":"array",
+ "xml":{"name":"tag","wrapped":true},
+ "items":{"$ref":"#/definitions/Tag"}
+ },
+ "status":{"type":"string","description":"pet status in the
store","enum":["available","pending","sold"]}},
+ "xml":{"name":"Pet"}
+ },
+ "ApiResponse":{
+ "type":"object",
+ "properties":{
+ "code":{
+ "type":"integer",
+ "format":"int32"
+ },
+ "type":{"type":"string"},
+ "message":{"type":"string"}
+ }
+ }
+ },
+ "externalDocs":{"description":"Find out more about
Swagger","url":"http://swagger.io"}
+}