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 8bac000c85..b28a57cce2 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 @@ -1,6 +1,7 @@ package io.swagger.parser.processors; import io.swagger.models.Model; +import io.swagger.models.RefModel; import io.swagger.models.Swagger; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; @@ -48,6 +49,15 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { //If this is a new model, then check it for other sub references + String file = $ref.split("#/")[0]; + if (model instanceof RefModel) { + RefModel refModel = (RefModel) model; + if(isAnExternalRefFormat(refModel.getRefFormat())) { + refModel.set$ref(processRefToExternalDefinition(refModel.get$ref(), refModel.getRefFormat())); + } else { + processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE); + } + } //Loop the properties and recursively call this method; Map subProps = model.getProperties(); if(subProps != null) { @@ -55,8 +65,11 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { if (prop.getValue() instanceof RefProperty) { RefProperty subRef = (RefProperty) prop.getValue(); - if(isAnExternalRefFormat(subRef.getRefFormat())) + if(isAnExternalRefFormat(subRef.getRefFormat())) { subRef.set$ref(processRefToExternalDefinition(subRef.get$ref(), subRef.getRefFormat())); + } else { + processRefToExternalDefinition(file + subRef.get$ref(), RefFormat.RELATIVE); + } } } } 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 c408097a34..414cfa341a 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 @@ -138,6 +138,17 @@ public void testLoadRelativeFileTree_Json() throws Exception { //Json.mapper().writerWithDefaultPrettyPrinter().writeValue(new File("resolved.json"), swagger); } + @Test + public void testLoadExternalNestedDefinitions() throws Exception { + SwaggerParser parser = new SwaggerParser(); + final Swagger swagger = parser.read("src/test/resources/nested-references/b.yaml"); + Map definitions = swagger.getDefinitions(); + assertTrue(definitions.containsKey("x")); + assertTrue(!definitions.containsKey("y")); + assertTrue(definitions.containsKey("z")); + assertEquals(((RefModel) definitions.get("i")).get$ref(), "#/definitions/k"); + } + @Test public void testPetstore() throws Exception { SwaggerParser parser = new SwaggerParser(); diff --git a/modules/swagger-parser/src/test/resources/nested-references/a.yaml b/modules/swagger-parser/src/test/resources/nested-references/a.yaml new file mode 100644 index 0000000000..40a55974b7 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-references/a.yaml @@ -0,0 +1,16 @@ +--- +swagger: "2.0" +info: + title: test + version: '0.0.0' +paths: {} +definitions: + y: + $ref: "#/definitions/z" + z: + type: object + properties: + name: + type: string + j: + $ref: "./b.yaml#/definitions/k" diff --git a/modules/swagger-parser/src/test/resources/nested-references/b.yaml b/modules/swagger-parser/src/test/resources/nested-references/b.yaml new file mode 100644 index 0000000000..184f5ae814 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-references/b.yaml @@ -0,0 +1,16 @@ +--- +swagger: "2.0" +info: + title: test + version: '0.0.0' +paths: {} +definitions: + x: + $ref: "./a.yaml#/definitions/y" + i: + $ref: "./a.yaml#/definitions/j" + k: + type: object + properties: + name: + type: string