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 7b349a9be1..7b9a655c96 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 @@ -116,6 +116,29 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) { } } } + if (model instanceof ModelImpl) { + ModelImpl modelImpl = (ModelImpl) model; + Property additionalProperties = modelImpl.getAdditionalProperties(); + if (additionalProperties != null) { + if (additionalProperties instanceof RefProperty) { + processRefProperty(((RefProperty) additionalProperties), file); + } else if (additionalProperties instanceof ArrayProperty) { + ArrayProperty arrayProp = (ArrayProperty) additionalProperties; + if (arrayProp.getItems() instanceof RefProperty) { + processRefProperty((RefProperty) arrayProp.getItems(), file); + } + } else if (additionalProperties instanceof MapProperty) { + MapProperty mapProp = (MapProperty) additionalProperties; + if (mapProp.getAdditionalProperties() instanceof RefProperty) { + processRefProperty((RefProperty) mapProp.getAdditionalProperties(), file); + } else if (mapProp.getAdditionalProperties() instanceof ArrayProperty && + ((ArrayProperty) mapProp.getAdditionalProperties()).getItems() instanceof RefProperty) { + processRefProperty((RefProperty) ((ArrayProperty) mapProp.getAdditionalProperties()).getItems(), file); + } + } + + } + } if (model instanceof ArrayModel && ((ArrayModel) model).getItems() instanceof RefProperty) { processRefProperty((RefProperty) ((ArrayModel) model).getItems(), 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 0b3509a475..6a16d9a627 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 @@ -50,6 +50,7 @@ import static org.testng.Assert.fail; public class SwaggerParserTest { + @Test public void testModelParameters() throws Exception { String yaml = "swagger: '2.0'\n" + @@ -1026,4 +1027,20 @@ public void testRefNameConflicts() throws Exception { assertEquals("local", swagger.getDefinitions().get("PersonObj").getProperties().get("location").getExample()); assertEquals("referred", swagger.getDefinitions().get("PersonObj_2").getProperties().get("location").getExample()); } + + @Test + public void testRefAdditionalProperties() throws Exception { + Swagger swagger = new SwaggerParser().read("src/test/resources/additionalProperties.yaml"); + + Assert.assertNotNull(swagger); + + Assert.assertTrue(swagger.getDefinitions().size() == 3); + + Assert.assertNotNull(swagger.getDefinitions().get("link-object")); + Assert.assertNotNull(swagger.getDefinitions().get("rel-data")); + Assert.assertNotNull(swagger.getDefinitions().get("result")); + } + + + } \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/additionalProperties.yaml b/modules/swagger-parser/src/test/resources/additionalProperties.yaml new file mode 100644 index 0000000000..fb35e7d349 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/additionalProperties.yaml @@ -0,0 +1,22 @@ +swagger: "2.0" +info: + title: Test API + version: 1.0.0 +host: swagger.io +basePath: /show-bug +schemes: +- http +produces: +- application/json +consumes: +- application/json + +paths: + /tests: + get: + operationId: listTests + responses: + 200: + description: Returns results. + schema: + $ref: "./globals.yaml#/definitions/result" \ No newline at end of file diff --git a/modules/swagger-parser/src/test/resources/globals.yaml b/modules/swagger-parser/src/test/resources/globals.yaml new file mode 100644 index 0000000000..ef301b8337 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/globals.yaml @@ -0,0 +1,23 @@ +definitions: + link-object: + type: object + additionalProperties: + $ref: '#/definitions/rel-data' + + rel-data: + type: object + required: + - href + properties: + href: + type: string + note: + type: string + + result: + type: object + properties: + name: + type: string + _links: + $ref: "#/definitions/link-object" \ No newline at end of file