From a65e4d9928abbd61bc251b279863d87ef2630cc3 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Wed, 12 Sep 2018 15:30:31 -0500 Subject: [PATCH] fixes for issue #834 in OAS 2 --- .../processors/ExternalRefProcessor.java | 30 ++++++++++++++++- .../io/swagger/parser/SwaggerParserTest.java | 33 +++++++++++++++++++ .../issue-834/components/response1.yaml | 4 +++ .../issue-834/components/response2.yaml | 4 +++ .../issue-834/components/schema.yaml | 2 ++ .../src/test/resources/issue-834/index.yaml | 30 +++++++++++++++++ .../components/referent.yaml | 2 ++ .../components/schema-with-reference.yaml | 7 ++++ .../resources/oapi-reference-test2/index.yaml | 22 +++++++++++++ 9 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 modules/swagger-parser/src/test/resources/issue-834/components/response1.yaml create mode 100644 modules/swagger-parser/src/test/resources/issue-834/components/response2.yaml create mode 100644 modules/swagger-parser/src/test/resources/issue-834/components/schema.yaml create mode 100644 modules/swagger-parser/src/test/resources/issue-834/index.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test2/components/referent.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test2/components/schema-with-reference.yaml create mode 100644 modules/swagger-parser/src/test/resources/oapi-reference-test2/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 8704ab15c6..8d91d8972e 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 @@ -155,10 +155,37 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { } - public void processRefToExternalResponse(String $ref, RefFormat refFormat) { + public String processRefToExternalResponse(String $ref, RefFormat refFormat) { + String renamedRef = cache.getRenamedRef($ref); + if(renamedRef != null) { + return renamedRef; + } final Response response = cache.loadRef($ref, refFormat, Response.class); + String newRef; + + + Map responses = swagger.getResponses(); + + if (responses == null) { + responses = new LinkedHashMap<>(); + } + + final String possiblyConflictingDefinitionName = computeDefinitionName($ref); + + Response existingResponse = responses.get(possiblyConflictingDefinitionName); + + if (existingResponse != null) { + LOGGER.debug("A model for " + existingResponse + " already exists"); + if(existingResponse instanceof RefResponse) { + // use the new model + existingResponse = null; + } + } + newRef = possiblyConflictingDefinitionName; + cache.putRenamedRef($ref, newRef); + if(response != null) { String file = $ref.split("#/")[0]; @@ -176,6 +203,7 @@ public void processRefToExternalResponse(String $ref, RefFormat refFormat) { } } } + return newRef; } private void processProperties(final Map subProps, final String file) { 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 c4f7dc44a0..461fdc0617 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,39 @@ public class SwaggerParserTest { + @Test + public void testIssue834() { + Swagger swagger = new SwaggerParser().read("issue-834/index.yaml", null, true); + assertNotNull(swagger); + + Response foo200 =swagger.getPaths().get("/foo").getGet().getResponses().get("200"); + assertNotNull(foo200); + RefModel model200 = (RefModel) foo200.getResponseSchema(); + String foo200SchemaRef = model200.get$ref(); + assertEquals(foo200SchemaRef, "#/definitions/schema"); + + Response foo300 = swagger.getPaths().get("/foo").getGet().getResponses().get("300"); + assertNotNull(foo300); + RefModel model300 = (RefModel) foo300.getResponseSchema(); + String foo300SchemaRef = model300.get$ref(); + assertEquals(foo300SchemaRef, "#/definitions/schema"); + + Response bar200 = swagger.getPaths().get("/bar").getGet().getResponses().get("200"); + assertNotNull(bar200); + RefModel modelBar200 = (RefModel) bar200.getResponseSchema(); + String bar200SchemaRef = modelBar200.get$ref(); + assertEquals(bar200SchemaRef, "#/definitions/schema"); + } + + @Test + public void testIssue811_RefSchema_ToRefSchema() { + final Swagger swagger = new SwaggerParser().read("oapi-reference-test2/index.yaml", null, true); + Assert.assertNotNull(swagger); + RefModel model = (RefModel) swagger.getPaths().get("/").getGet().getResponses().get("200").getResponseSchema(); + Assert.assertEquals(model.get$ref() ,"#/definitions/schema-with-reference"); + } + + @Test public void testIssue811() throws Exception { SwaggerParser parser = new SwaggerParser(); diff --git a/modules/swagger-parser/src/test/resources/issue-834/components/response1.yaml b/modules/swagger-parser/src/test/resources/issue-834/components/response1.yaml new file mode 100644 index 0000000000..ec9593fe17 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-834/components/response1.yaml @@ -0,0 +1,4 @@ +--- +description: Response with schema containing reference +schema: + $ref: "./schema.yaml" \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/issue-834/components/response2.yaml b/modules/swagger-parser/src/test/resources/issue-834/components/response2.yaml new file mode 100644 index 0000000000..ec9593fe17 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-834/components/response2.yaml @@ -0,0 +1,4 @@ +--- +description: Response with schema containing reference +schema: + $ref: "./schema.yaml" \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/issue-834/components/schema.yaml b/modules/swagger-parser/src/test/resources/issue-834/components/schema.yaml new file mode 100644 index 0000000000..3be57c93fb --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-834/components/schema.yaml @@ -0,0 +1,2 @@ +--- +type: object \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/issue-834/index.yaml b/modules/swagger-parser/src/test/resources/issue-834/index.yaml new file mode 100644 index 0000000000..b61fc74d75 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/issue-834/index.yaml @@ -0,0 +1,30 @@ +--- +swagger: "2.0" +externalDocs: + description: Test + url: http://test.com/test +info: + version: 0.0.1 + title: Test + license: + name: Test + url: http://test.com/test +paths: + /foo: + get: + description: foo + summary: foo + operationId: foo + responses: + 200: + $ref: "./components/response1.yaml" + 300: + $ref: "./components/response2.yaml" + /bar: + get: + description: bar + summary: bar + operationId: bar + responses: + 200: + $ref: "./components/response1.yaml" \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/referent.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/referent.yaml new file mode 100644 index 0000000000..80ef568029 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/referent.yaml @@ -0,0 +1,2 @@ +--- +type: object diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/schema-with-reference.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/schema-with-reference.yaml new file mode 100644 index 0000000000..4a896cc6d5 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test2/components/schema-with-reference.yaml @@ -0,0 +1,7 @@ +--- +type: object +properties: + reference_array: + type: array + items: + $ref: "./referent.yaml" diff --git a/modules/swagger-parser/src/test/resources/oapi-reference-test2/index.yaml b/modules/swagger-parser/src/test/resources/oapi-reference-test2/index.yaml new file mode 100644 index 0000000000..66e37a25e7 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/oapi-reference-test2/index.yaml @@ -0,0 +1,22 @@ +--- +swagger: "2.0" +externalDocs: + description: Test + url: http://test.com/test +info: + version: 0.0.1 + title: Test + license: + name: Test + url: http://test.com/test +paths: + /: + get: + description: Test + summary: Test + operationId: getTest + responses: + 200: + description: Response with schema containing reference + schema: + $ref: "./components/schema-with-reference.yaml"