From 198606a5a9a2cce15640c5de5f771ec857595538 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Tue, 4 Sep 2018 10:42:56 -0500 Subject: [PATCH 1/3] fixing issue #811 in master branch --- .../processors/ExternalRefProcessor.java | 35 +++++++++++++++++++ .../parser/processors/OperationProcessor.java | 2 ++ .../parser/processors/ResponseProcessor.java | 19 ++++++++++ .../java/io/swagger/parser/util/RefUtils.java | 11 +++++- .../io/swagger/parser/SwaggerParserTest.java | 11 ++++++ .../processors/OperationProcessorTest.java | 5 ++- .../components/referent.yaml | 2 ++ .../components/response-with-reference.yaml | 4 +++ .../components/schema-with-reference.yaml | 8 +++++ .../resources/oapi-reference-test/index.yaml | 16 +++++++++ .../json/paths/healthPath.json | 12 +++---- .../json/responses/errorResponses.json | 4 +-- .../yaml/paths/healthPath.yaml | 12 +++---- .../yaml/responses/errorResponses.yaml | 4 +-- 14 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test/components/referent.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test/components/response-with-reference.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test/index.yaml diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java index b2bc271b4a..8704ab15c6 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ExternalRefProcessor.java @@ -7,6 +7,7 @@ import io.swagger.models.properties.RefProperty; import io.swagger.models.refs.RefFormat; import io.swagger.parser.ResolverCache; +import io.swagger.parser.util.RefUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.LoggerFactory; @@ -153,6 +154,30 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { return newRef; } + + public void processRefToExternalResponse(String $ref, RefFormat refFormat) { + + final Response response = cache.loadRef($ref, refFormat, Response.class); + + if(response != null) { + + String file = $ref.split("#/")[0]; + + Model model = null; + if (response.getResponseSchema() != null) { + model = response.getResponseSchema(); + if (model instanceof RefModel) { + RefModel refModel = (RefModel) model; + if (RefUtils.isAnExternalRefFormat(refFormat)) { + processRefModel(refModel, $ref); + } else { + processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE); + } + } + } + } + } + private void processProperties(final Map subProps, final String file) { if (subProps == null || 0 == subProps.entrySet().size() ) { return; @@ -187,6 +212,16 @@ private void processRefProperty(RefProperty subRef, String externalFile) { processRefToExternalDefinition(externalFile + subRef.get$ref(), RefFormat.RELATIVE); } } + + private void processRefModel(RefModel subRef, String externalFile) { + + if (isAnExternalRefFormat(subRef.getRefFormat())) { + String joinedRef = join(externalFile, subRef.get$ref()); + subRef.set$ref(processRefToExternalDefinition(joinedRef, subRef.getRefFormat())); + } else { + processRefToExternalDefinition(externalFile + subRef.get$ref(), RefFormat.RELATIVE); + } + } public static String join(String source, String fragment) { diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/OperationProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/OperationProcessor.java index 1272fe45cf..073afdbd0e 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/OperationProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/OperationProcessor.java @@ -35,6 +35,8 @@ public void processOperation(Operation operation) { if(response != null) { if (response instanceof RefResponse) { RefResponse refResponse = (RefResponse) response; + responseProcessor.processResponse(response); + Response resolvedResponse = cache.loadRef(refResponse.get$ref(), refResponse.getRefFormat(), Response.class); if (resolvedResponse != null) { diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ResponseProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ResponseProcessor.java index c117f97625..b4dde6f645 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ResponseProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/ResponseProcessor.java @@ -1,17 +1,22 @@ package io.swagger.parser.processors; import io.swagger.models.Model; +import io.swagger.models.RefResponse; import io.swagger.models.Response; import io.swagger.models.Swagger; import io.swagger.models.properties.Property; +import io.swagger.models.refs.RefFormat; import io.swagger.parser.ResolverCache; +import io.swagger.parser.util.RefUtils; public class ResponseProcessor { private final ModelProcessor modelProcessor; + private final ExternalRefProcessor externalRefProcessor; public ResponseProcessor(ResolverCache cache, Swagger swagger) { modelProcessor = new ModelProcessor(cache, swagger); + externalRefProcessor = new ExternalRefProcessor(cache, swagger); } @@ -19,6 +24,12 @@ public void processResponse(Response response) { //process the response body final Model schema = response.getResponseSchema(); + if (response instanceof RefResponse) { + RefResponse refResponse = (RefResponse) response; + processReferenceResponse(refResponse); + } + + if (schema != null) { modelProcessor.processModel(schema); } @@ -29,4 +40,12 @@ public void processResponse(Response response) { */ } + + public void processReferenceResponse(RefResponse refResponse){ + RefFormat refFormat = refResponse.getRefFormat(); + String $ref = refResponse.get$ref(); + if (RefUtils.isAnExternalRefFormat(refFormat)){ + externalRefProcessor.processRefToExternalResponse($ref, refFormat); + } + } } diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java index dc511b1216..271521f525 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java @@ -5,9 +5,14 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import java.io.File; import java.io.FileInputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.Set; @@ -72,7 +77,7 @@ public static String readExternalUrlRef(String file, RefFormat refFormat, List auths, diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index 0b860ae6f3..c4f7dc44a0 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -54,6 +54,17 @@ public class SwaggerParserTest { + @Test + public void testIssue811() throws Exception { + SwaggerParser parser = new SwaggerParser(); + final Swagger swagger = parser.read("src/test/resources/oapi-reference-test/index.yaml"); + Assert.assertNotNull(swagger); + assertTrue(swagger.getPaths().get("/").getGet().getResponses().get("200").getResponseSchema() instanceof RefModel); + RefModel model = (RefModel) swagger.getPaths().get("/").getGet().getResponses().get("200").getResponseSchema(); + Assert.assertEquals(model.get$ref(),"#/definitions/schema-with-reference"); + + } + @Test public void testIssue727() throws Exception { SwaggerParser parser = new SwaggerParser(); diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/processors/OperationProcessorTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/processors/OperationProcessorTest.java index b1d8abe0c5..f7259ca041 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/processors/OperationProcessorTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/processors/OperationProcessorTest.java @@ -42,7 +42,7 @@ public void testProcessOperation(@Injectable final List inputParamete operation.setParameters(inputParameterList); final String ref = "http://my.company.com/path/to/file.json#/foo/bar"; - RefResponse refResponse = new RefResponse(ref); + final RefResponse refResponse = new RefResponse(ref); operation.response(200, refResponse); operation.response(400, incomingResponse); @@ -59,6 +59,9 @@ public void testProcessOperation(@Injectable final List inputParamete times = 1; result = outputParameterList; + responseProcessor.processResponse(refResponse); + times = 1; + cache.loadRef(ref, RefFormat.URL, Response.class); times = 1; result = resolvedResponse; diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test/components/referent.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/referent.yaml new file mode 100644 index 0000000000..80ef568029 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/referent.yaml @@ -0,0 +1,2 @@ +--- +type: object diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test/components/response-with-reference.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/response-with-reference.yaml new file mode 100644 index 0000000000..61e31e4291 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/response-with-reference.yaml @@ -0,0 +1,4 @@ +--- +description: Response with schema containing reference +schema: + $ref: "./schema-with-reference.yaml" diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml new file mode 100644 index 0000000000..0cdf8cf1e4 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml @@ -0,0 +1,8 @@ +--- +type: object +properties: + reference_array: + type: array + items: + # changing this to $ref: "./referent.yaml" works + $ref: "./referent.yaml" diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test/index.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test/index.yaml new file mode 100644 index 0000000000..d0950f02a7 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test/index.yaml @@ -0,0 +1,16 @@ +--- +swagger: "2.0" + +info: + version: 1.0.0 + title: Path include test case child + +paths: + /: + get: + description: Test + summary: Test + operationId: getTest + responses: + 200: + $ref: "./components/response-with-reference.yaml" diff --git a/modules/swagger-parser/src/test/resources/relative-file-references/json/paths/healthPath.json b/modules/swagger-parser/src/test/resources/relative-file-references/json/paths/healthPath.json index 25a3ed2aab..243ef0a603 100644 --- a/modules/swagger-parser/src/test/resources/relative-file-references/json/paths/healthPath.json +++ b/modules/swagger-parser/src/test/resources/relative-file-references/json/paths/healthPath.json @@ -1,10 +1,10 @@ { "parameters": [ { - "$ref": "./parameters/params.json#/param1" + "$ref": "../parameters/params.json#/param1" }, { - "$ref": "./parameters/params.json#/param2" + "$ref": "../parameters/params.json#/param2" } ], "get": { @@ -25,7 +25,7 @@ "in": "body", "required": true, "schema": { - "$ref": "./models/health.json" + "$ref": "../models/health.json" } } ], @@ -33,14 +33,14 @@ "200": { "description": "Health information from the server", "schema": { - "$ref": "./models/health.json" + "$ref": "../models/health.json" } }, "400": { - "$ref": "./responses/errorResponses.json#/bad-request" + "$ref": "../responses/errorResponses.json#/bad-request" }, "500": { - "$ref": "./responses/errorResponses.json#/internal-server-error" + "$ref": "../responses/errorResponses.json#/internal-server-error" } } } diff --git a/modules/swagger-parser/src/test/resources/relative-file-references/json/responses/errorResponses.json b/modules/swagger-parser/src/test/resources/relative-file-references/json/responses/errorResponses.json index ce17bf193f..efa8c53f92 100644 --- a/modules/swagger-parser/src/test/resources/relative-file-references/json/responses/errorResponses.json +++ b/modules/swagger-parser/src/test/resources/relative-file-references/json/responses/errorResponses.json @@ -2,13 +2,13 @@ "bad-request": { "description": "Your request was not valid", "schema": { - "$ref": "./models/error.json" + "$ref": "../models/error.json" } }, "internal-server-error": { "description": "An unexpected error occur during processing", "schema": { - "$ref": "./models/error.json" + "$ref": "../models/error.json" } } } \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/relative-file-references/yaml/paths/healthPath.yaml b/modules/swagger-parser/src/test/resources/relative-file-references/yaml/paths/healthPath.yaml index 38060420ef..2840ec8fd7 100644 --- a/modules/swagger-parser/src/test/resources/relative-file-references/yaml/paths/healthPath.yaml +++ b/modules/swagger-parser/src/test/resources/relative-file-references/yaml/paths/healthPath.yaml @@ -1,7 +1,7 @@ --- parameters: -- $ref: "./parameters/params.yaml#/param1" -- $ref: "./parameters/params.yaml#/param2" +- $ref: "../parameters/params.yaml#/param1" +- $ref: "../parameters/params.yaml#/param2" get: summary: "Returns server health information" operationId: "getHealth" @@ -14,13 +14,13 @@ get: in: "body" required: true schema: - $ref: "./models/health.yaml" + $ref: "../models/health.yaml" responses: 200: description: "Health information from the server" schema: - $ref: "./models/health.yaml" + $ref: "../models/health.yaml" 400: - $ref: "./responses/errorResponses.yaml#/bad-request" + $ref: "../responses/errorResponses.yaml#/bad-request" 500: - $ref: "./responses/errorResponses.yaml#/internal-server-error" + $ref: "../responses/errorResponses.yaml#/internal-server-error" diff --git a/modules/swagger-parser/src/test/resources/relative-file-references/yaml/responses/errorResponses.yaml b/modules/swagger-parser/src/test/resources/relative-file-references/yaml/responses/errorResponses.yaml index 4e154c6a26..123e3eed6b 100644 --- a/modules/swagger-parser/src/test/resources/relative-file-references/yaml/responses/errorResponses.yaml +++ b/modules/swagger-parser/src/test/resources/relative-file-references/yaml/responses/errorResponses.yaml @@ -2,8 +2,8 @@ bad-request: description: "Your request was not valid" schema: - $ref: "./models/error.yaml" + $ref: "../models/error.yaml" internal-server-error: description: "An unexpected error occur during processing" schema: - $ref: "./models/error.yaml" + $ref: "../models/error.yaml" From 073e2ae417d34ce55cd186817a3fdd7c95f9e2eb Mon Sep 17 00:00:00 2001 From: gracekarina Date: Tue, 4 Sep 2018 11:05:33 -0500 Subject: [PATCH 2/3] removing commented code #811 --- .../src/main/java/io/swagger/parser/util/RefUtils.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java index 271521f525..42f9dd0128 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java @@ -77,7 +77,7 @@ public static String readExternalUrlRef(String file, RefFormat refFormat, List auths, Path parentDirectory) { From 6349e9fdcfd0ed24ea56ca299ed67d97a30556d5 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Tue, 4 Sep 2018 17:34:23 -0500 Subject: [PATCH 3/3] removing comment in spec --- .../oapi-reference-test/components/schema-with-reference.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml index 0cdf8cf1e4..4a896cc6d5 100644 --- a/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test/components/schema-with-reference.yaml @@ -4,5 +4,4 @@ properties: reference_array: type: array items: - # changing this to $ref: "./referent.yaml" works $ref: "./referent.yaml"