diff --git a/modules/swagger-parser/pom.xml b/modules/swagger-parser/pom.xml index 012f527224..48a6882ef8 100644 --- a/modules/swagger-parser/pom.xml +++ b/modules/swagger-parser/pom.xml @@ -20,6 +20,7 @@ maven-surefire-plugin single + . diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java index 6b36fdd02e..1069185bba 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java @@ -916,6 +916,16 @@ public Property property(ObjectNode node, String location, ParseResult result) { } } } + + // work-around for https://github.com/swagger-api/swagger-core/issues/1977 + if(node.get("$ref") != null && node.get("$ref").isTextual()) { + // check if it's a relative ref + String refString = node.get("$ref").textValue(); + if(refString.indexOf("/") == -1 && refString.indexOf(".") > 0) { + refString = "./" + refString; + node.put("$ref", refString); + } + } return Json.mapper().convertValue(node, Property.class); } diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java new file mode 100644 index 0000000000..870679513a --- /dev/null +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTests.java @@ -0,0 +1,27 @@ +package io.swagger.parser; + +import io.swagger.models.Swagger; +import io.swagger.parser.util.SwaggerDeserializationResult; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +public class FileReferenceTests { + @Test + public void testIssue306() { + SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/nested-file-references/issue-306.yaml", null, true); + assertNotNull(result.getSwagger()); + + Swagger swagger = result.getSwagger(); + + assertTrue(swagger.getDefinitions().size() == 3); + // resolved from `$ref: './book.yaml'` + assertNotNull(swagger.getDefinitions().get("Inventory")); + // resolved from `$ref: 'book.yaml'` + assertNotNull(swagger.getDefinitions().get("Orders")); + + // copied from `./book.yaml` + assertNotNull(swagger.getDefinitions().get("book")); + } +} diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml new file mode 100644 index 0000000000..2e2236aee4 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-file-references/book.yaml @@ -0,0 +1,9 @@ +description: A book entity +properties: + name: + type: string + title: + type: string + pages: + type: integer + format: int32 \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml new file mode 100644 index 0000000000..77b8b6f12f --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-file-references/components/entities.yaml @@ -0,0 +1,5 @@ +definitions: + Category: + properties: + name: + type: string diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml new file mode 100644 index 0000000000..a263f2a13a --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-file-references/issue-306.yaml @@ -0,0 +1,18 @@ +swagger: '2.0' +definitions: + Animal: + required: + - id + properties: + id: + type: string + categories: + $ref: './components/entities.yaml#/definitions/Category' + Inventory: + properties: + book: + $ref: './book.yaml' + Orders: + properties: + book: + $ref: 'book.yaml' \ No newline at end of file