From e6ecbcd1cadcf14fc7c76d24efa43c3985fc3a65 Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Fri, 29 Oct 2021 18:21:21 +0530 Subject: [PATCH] Fix for issue 1608 --- .../v3/parser/converter/SwaggerConverter.java | 31 +++++--- .../io/swagger/parser/OpenAPIParserTest.java | 10 +++ .../src/test/resources/issue1608.json | 76 +++++++++++++++++++ 3 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 modules/swagger-parser/src/test/resources/issue1608.json diff --git a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java index 21b5de1e4c..a98d613fe9 100644 --- a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java +++ b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java @@ -59,6 +59,7 @@ import io.swagger.v3.parser.core.models.AuthorizationValue; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; +import io.swagger.v3.parser.util.ResolverFully; import io.swagger.v3.parser.util.SchemaTypeUtil; import org.apache.commons.lang3.StringUtils; @@ -108,19 +109,25 @@ public SwaggerParseResult readContents(String swaggerAsString, List auth, ParseOptions options) { SwaggerParseResult out = convert(result); - if (out != null && options != null && options.isFlatten()) { - try { - SwaggerParseResult resultV3 = new OpenAPIV3Parser().readContents(Yaml.pretty(out.getOpenAPI()), auth, options); - out.setOpenAPI(resultV3.getOpenAPI()); - if (out.getMessages() != null) { - out.getMessages().addAll(resultV3.getMessages()); - out.messages(out.getMessages().stream() - .distinct() - .collect(Collectors.toList())); - } else { - out.messages(resultV3.getMessages()); + if (out != null && options != null) { + if (options.isResolveFully()) { + new ResolverFully(options.isResolveCombinators()).resolveFully(out.getOpenAPI()); + } + if (options.isFlatten()) { + try { + SwaggerParseResult resultV3 = new OpenAPIV3Parser().readContents(Yaml.pretty(out.getOpenAPI()), auth, options); + out.setOpenAPI(resultV3.getOpenAPI()); + if (out.getMessages() != null) { + out.getMessages().addAll(resultV3.getMessages()); + out.messages(out.getMessages().stream() + .distinct() + .collect(Collectors.toList())); + } else { + out.messages(resultV3.getMessages()); + } + } catch (Exception ignore) { } - } catch (Exception ignore) {} + } } return out; } diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java index f7641cb5ac..513dc8b134 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java @@ -30,6 +30,16 @@ public class OpenAPIParserTest { + @Test + public void testIssue1608(){ + ParseOptions options = new ParseOptions(); + options.setResolveFully(true); + OpenAPIParser openAPIParser = new OpenAPIParser(); + SwaggerParseResult swaggerParseResult = openAPIParser.readLocation("issue1608.json", null, options); + Schema schema = swaggerParseResult.getOpenAPI().getPaths().get("/pet").getPut().getRequestBody().getContent().get("application/json").getSchema(); + assertEquals(schema.getRequired().size(), 1); + } + @Test public void testIssue1143(){ ParseOptions options = new ParseOptions(); diff --git a/modules/swagger-parser/src/test/resources/issue1608.json b/modules/swagger-parser/src/test/resources/issue1608.json new file mode 100644 index 0000000000..c2ff11fecb --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue1608.json @@ -0,0 +1,76 @@ +{ + "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.5", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "schemes": [ + "https", + "http" + ], + "paths": { + "/pet": { + "put": { + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "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" + } + } + } + } + }, + "definitions": { + "Pet": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "example": "doggie" + } + }, + "xml": { + "name": "Pet" + } + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +} \ No newline at end of file