From 5f02a1a9587f2c0c2668f481355278f05631731d Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Mon, 2 Jul 2018 18:27:06 +0530 Subject: [PATCH 1/7] Swagger parser issue 740 OpenAPI v2 converter: java.lang.IllegalArgumentException with allOf and discriminator --- .../v3/parser/converter/SwaggerConverter.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 814f15434d..09c5b04bf1 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 @@ -1061,11 +1061,15 @@ public Schema convert(io.swagger.models.Model v2Model) { result = arraySchema; } else if (v2Model instanceof ComposedModel) { ComposedModel composedModel = (ComposedModel) v2Model; - - ComposedSchema composed = Json.mapper().convertValue(v2Model, ComposedSchema.class); - + ComposedSchema composed = new ComposedSchema(); + composed.setDescription(composedModel.getDescription()); + composed.setExample(composedModel.getExample()); + if (composedModel.getExternalDocs() != null) { + composed.setExternalDocs(convert(composedModel.getExternalDocs())); + } + composed.setTitle(composedModel.getTitle()); + composed.setExtensions(convert(composedModel.getVendorExtensions())); composed.setAllOf(composedModel.getAllOf().stream().map(this::convert).collect(Collectors.toList())); - result = composed; } else { String v2discriminator = null; From 5fed2c37756b6bb0bdf29766c025c5d5a930e7c0 Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Mon, 2 Jul 2018 18:33:33 +0530 Subject: [PATCH 2/7] Revert my changes --- .../v3/parser/converter/SwaggerConverter.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) 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 09c5b04bf1..b4250e446c 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 @@ -317,10 +317,7 @@ private SecurityScheme convertOauth2SecurityScheme(SecuritySchemeDefinition defi } Scopes scopes = new Scopes(); - Map oAuth2Scopes = oAuth2Definition.getScopes(); - if (oAuth2Scopes != null) { - oAuth2Scopes.forEach((k, v) -> scopes.addString(k, v)); - } + oAuth2Definition.getScopes().forEach((k, v) -> scopes.addString(k, v)); oAuthFlow.setScopes(scopes); securityScheme.setFlows(oAuthFlows); @@ -1061,15 +1058,11 @@ public Schema convert(io.swagger.models.Model v2Model) { result = arraySchema; } else if (v2Model instanceof ComposedModel) { ComposedModel composedModel = (ComposedModel) v2Model; - ComposedSchema composed = new ComposedSchema(); - composed.setDescription(composedModel.getDescription()); - composed.setExample(composedModel.getExample()); - if (composedModel.getExternalDocs() != null) { - composed.setExternalDocs(convert(composedModel.getExternalDocs())); - } - composed.setTitle(composedModel.getTitle()); - composed.setExtensions(convert(composedModel.getVendorExtensions())); + + ComposedSchema composed = Json.mapper().convertValue(v2Model, ComposedSchema.class); + composed.setAllOf(composedModel.getAllOf().stream().map(this::convert).collect(Collectors.toList())); + result = composed; } else { String v2discriminator = null; From fc28f24204531fa13a7e69e8b8c576a0decd5bbe Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Mon, 2 Jul 2018 18:34:55 +0530 Subject: [PATCH 3/7] Swagger parser issue 740 OpenAPI v2 converter: java.lang.IllegalArgumentException with allOf and discriminator --- .../v3/parser/converter/SwaggerConverter.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) 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 b4250e446c..09c5b04bf1 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 @@ -317,7 +317,10 @@ private SecurityScheme convertOauth2SecurityScheme(SecuritySchemeDefinition defi } Scopes scopes = new Scopes(); - oAuth2Definition.getScopes().forEach((k, v) -> scopes.addString(k, v)); + Map oAuth2Scopes = oAuth2Definition.getScopes(); + if (oAuth2Scopes != null) { + oAuth2Scopes.forEach((k, v) -> scopes.addString(k, v)); + } oAuthFlow.setScopes(scopes); securityScheme.setFlows(oAuthFlows); @@ -1058,11 +1061,15 @@ public Schema convert(io.swagger.models.Model v2Model) { result = arraySchema; } else if (v2Model instanceof ComposedModel) { ComposedModel composedModel = (ComposedModel) v2Model; - - ComposedSchema composed = Json.mapper().convertValue(v2Model, ComposedSchema.class); - + ComposedSchema composed = new ComposedSchema(); + composed.setDescription(composedModel.getDescription()); + composed.setExample(composedModel.getExample()); + if (composedModel.getExternalDocs() != null) { + composed.setExternalDocs(convert(composedModel.getExternalDocs())); + } + composed.setTitle(composedModel.getTitle()); + composed.setExtensions(convert(composedModel.getVendorExtensions())); composed.setAllOf(composedModel.getAllOf().stream().map(this::convert).collect(Collectors.toList())); - result = composed; } else { String v2discriminator = null; From fe82f9b80df25b3da6116366b78ca52a6656f8bb Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Mon, 2 Jul 2018 22:13:41 +0530 Subject: [PATCH 4/7] Fix for issue 664 ResolveFully doesn't resolve the request bodies --- .../parser/processors/OperationProcessor.java | 2 +- .../processors/RequestBodyProcessor.java | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java index e269e32f3c..f9f5202008 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java @@ -42,7 +42,7 @@ public void processOperation(Operation operation) { } final RequestBody requestBody = operation.getRequestBody(); if(requestBody != null) { - requestBodyProcessor.processRequestBody(requestBody); + operation.setRequestBody(requestBodyProcessor.processRequestBody(requestBody)); } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java index 34f95477f5..9d0e9f25d4 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java @@ -9,8 +9,7 @@ import java.util.Map; -import static io.swagger.v3.parser.util.RefUtils.computeRefFormat; -import static io.swagger.v3.parser.util.RefUtils.isAnExternalRefFormat; +import static io.swagger.v3.parser.util.RefUtils.*; /** * Created by gracekarina on 20/06/17. @@ -28,11 +27,8 @@ public RequestBodyProcessor(ResolverCache cache, OpenAPI openAPI) { this.openAPI = openAPI; } - public void processRequestBody(RequestBody requestBody) { - - if (requestBody.get$ref() != null){ - processReferenceRequestBody(requestBody); - } + public RequestBody processRequestBody(RequestBody refRequestBody) { + RequestBody requestBody = refRequestBody.get$ref() != null ? processReferenceRequestBody(refRequestBody) : refRequestBody; Schema schema = null; if(requestBody.getContent() != null){ Map content = requestBody.getContent(); @@ -46,10 +42,11 @@ public void processRequestBody(RequestBody requestBody) { } } } + return requestBody; } - public void processReferenceRequestBody(RequestBody requestBody){ + public RequestBody processReferenceRequestBody(RequestBody requestBody){ RefFormat refFormat = computeRefFormat(requestBody.get$ref()); String $ref = requestBody.get$ref(); if (isAnExternalRefFormat(refFormat)){ @@ -58,7 +55,14 @@ public void processReferenceRequestBody(RequestBody requestBody){ if (newRef != null) { requestBody.set$ref(newRef); } + } else if (openAPI.getComponents() != null) { + Map requestBodies = openAPI.getComponents().getRequestBodies(); + if (requestBodies != null) { + String referenceKey = computeDefinitionName($ref); + return requestBodies.getOrDefault(referenceKey, requestBody); + } } + return requestBody; } } From e4da4965eaef44bdddb19183545edd4f1fa298ad Mon Sep 17 00:00:00 2001 From: Mohammed Rizwan Date: Mon, 2 Jul 2018 23:12:53 +0530 Subject: [PATCH 5/7] Revert for issue 664 --- .../parser/processors/OperationProcessor.java | 2 +- .../processors/RequestBodyProcessor.java | 20 ++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java index f9f5202008..e269e32f3c 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java @@ -42,7 +42,7 @@ public void processOperation(Operation operation) { } final RequestBody requestBody = operation.getRequestBody(); if(requestBody != null) { - operation.setRequestBody(requestBodyProcessor.processRequestBody(requestBody)); + requestBodyProcessor.processRequestBody(requestBody); } diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java index 9d0e9f25d4..34f95477f5 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/RequestBodyProcessor.java @@ -9,7 +9,8 @@ import java.util.Map; -import static io.swagger.v3.parser.util.RefUtils.*; +import static io.swagger.v3.parser.util.RefUtils.computeRefFormat; +import static io.swagger.v3.parser.util.RefUtils.isAnExternalRefFormat; /** * Created by gracekarina on 20/06/17. @@ -27,8 +28,11 @@ public RequestBodyProcessor(ResolverCache cache, OpenAPI openAPI) { this.openAPI = openAPI; } - public RequestBody processRequestBody(RequestBody refRequestBody) { - RequestBody requestBody = refRequestBody.get$ref() != null ? processReferenceRequestBody(refRequestBody) : refRequestBody; + public void processRequestBody(RequestBody requestBody) { + + if (requestBody.get$ref() != null){ + processReferenceRequestBody(requestBody); + } Schema schema = null; if(requestBody.getContent() != null){ Map content = requestBody.getContent(); @@ -42,11 +46,10 @@ public RequestBody processRequestBody(RequestBody refRequestBody) { } } } - return requestBody; } - public RequestBody processReferenceRequestBody(RequestBody requestBody){ + public void processReferenceRequestBody(RequestBody requestBody){ RefFormat refFormat = computeRefFormat(requestBody.get$ref()); String $ref = requestBody.get$ref(); if (isAnExternalRefFormat(refFormat)){ @@ -55,14 +58,7 @@ public RequestBody processReferenceRequestBody(RequestBody requestBody){ if (newRef != null) { requestBody.set$ref(newRef); } - } else if (openAPI.getComponents() != null) { - Map requestBodies = openAPI.getComponents().getRequestBodies(); - if (requestBodies != null) { - String referenceKey = computeDefinitionName($ref); - return requestBodies.getOrDefault(referenceKey, requestBody); - } } - return requestBody; } } From da64e415e9e452e2e1bc5d488373a2a5d20d0e7d Mon Sep 17 00:00:00 2001 From: Jeremie Bresson Date: Wed, 11 Jul 2018 16:10:55 +0200 Subject: [PATCH 6/7] Add a test case for #740 https://github.com/swagger-api/swagger-parser/issues/740 --- .../swagger/parser/test/V2ConverterTest.java | 11 ++++ .../src/test/resources/issue-740.yaml | 66 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 modules/swagger-parser-v2-converter/src/test/resources/issue-740.yaml diff --git a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java index 4d56529095..4e55836709 100644 --- a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java +++ b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java @@ -76,6 +76,7 @@ public class V2ConverterTest { private static final String ISSUE_672_JSON = "issue-672.json"; private static final String ISSUE_673_YAML = "issue-673.yaml"; private static final String ISSUE_676_JSON = "issue-676.json"; + private static final String ISSUE_740_YAML = "issue-740.yaml"; private static final String ISSUE_708_YAML = "issue-708.yaml"; private static final String API_BATCH_PATH = "/api/batch/"; @@ -616,6 +617,16 @@ public void testIssue708() throws Exception { assertEquals(schema.getPattern(), "^[0-9]+$"); } + @Test(description = "OpenAPI v2 converter - Migrate a schema with AllOf") + public void testIssue740() throws Exception { + final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_740_YAML); + assertNotNull(oas); + Schema schema = oas.getComponents().getSchemas().get("Action"); + assertTrue(schema instanceof ComposedSchema); + ComposedSchema composedSchema = (ComposedSchema) schema; + assertEquals(composedSchema.getAllOf().size(), 2); + } + @Test(description = "OpenAPI v2 converter - Missing Parameter.style property") public void testParameterConversion() throws Exception { OpenAPI oas = getConvertedOpenAPIFromJsonFile(PARAMETER_CONVERSION_JSON); diff --git a/modules/swagger-parser-v2-converter/src/test/resources/issue-740.yaml b/modules/swagger-parser-v2-converter/src/test/resources/issue-740.yaml new file mode 100644 index 0000000000..efb60aa957 --- /dev/null +++ b/modules/swagger-parser-v2-converter/src/test/resources/issue-740.yaml @@ -0,0 +1,66 @@ +swagger: '2.0' +info: + description: 'Test' + version: 1.0.0 + title: OpenAPI Test Issue 740 + license: + name: Apache-2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +host: petstore.swagger.io +basePath: /v2 +schemes: + - http +paths: + /ping: + post: + summary: test + operationId: pingOperation + consumes: + - application/json + produces: + - application/json + parameters: + - in: body + name: body + required: true + schema: + $ref: '#/definitions/Entity' + responses: + '200': + description: OK + schema: + $ref: '#/definitions/Action' +definitions: + Entity: + type: "object" + properties: + id: + type: "string" + example: "1438752" + description: "The ID of the entity." + readOnly: true + title: "Entity" + description: "A base object for all API entities." + Action: + title: "Action" + allOf: + - $ref: "#/definitions/Entity" + - type: "object" + required: + - "action_type" + discriminator: "action_type" + properties: + name: + type: "string" + description: "The name of the action." + readOnly: true + action_type: + $ref: "#/definitions/ActionType" + ActionType: + type: "string" + title: "ActionType" + description: "Some enum" + enum: + - "value1" + - "value2" + x-swagger-router-model: "ActionTypeDto" \ No newline at end of file From 30cabf833925dcef90f71464336eb20b51fc2565 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Mon, 23 Jul 2018 11:55:49 -0500 Subject: [PATCH 7/7] trying build in travis --- .../java/io/swagger/v3/parser/util/OpenAPIDeserializer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java index c4bcd21a08..0e6c331299 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java @@ -106,10 +106,12 @@ public SwaggerParseResult deserialize(JsonNode rootNode) { public SwaggerParseResult deserialize(JsonNode rootNode, String path) { SwaggerParseResult result = new SwaggerParseResult(); try { + ParseResult rootParse = new ParseResult(); OpenAPI api = parseRoot(rootNode, rootParse, path); result.setOpenAPI(api); result.setMessages(rootParse.getMessages()); + } catch (Exception e) { result.setMessages(Arrays.asList(e.getMessage()));