diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PathsProcessor.java b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PathsProcessor.java index 6e37fe8f6d..c0e8250e4e 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PathsProcessor.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/processors/PathsProcessor.java @@ -5,6 +5,7 @@ import io.swagger.models.parameters.Parameter; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; +import io.swagger.models.refs.RefFormat; import io.swagger.parser.ResolverCache; import io.swagger.parser.SwaggerResolver; @@ -143,12 +144,12 @@ protected void updateLocalRefs(Parameter param, String pathRef) { protected void updateLocalRefs(Model model, String pathRef) { if(model instanceof RefModel) { - RefModel refModel = (RefModel) model; - if(isLocalRef(refModel.get$ref())) { - refModel.set$ref(computeLocalRef(refModel.get$ref(), pathRef)); - }/*else if(isLocalRef(refModel.getOriginalRef())) { - refModel.set$ref(computeLocalRef(refModel.getOriginalRef(), pathRef)); - }*/ + RefModel ref = (RefModel) model; + if(ref.getRefFormat() == RefFormat.INTERNAL) { + ref.set$ref(computeLocalRef(ref.get$ref(), pathRef)); + } else if (ref.getRefFormat() == RefFormat.RELATIVE) { + ref.set$ref(computeRelativeRef(ref.get$ref(), pathRef)); + } } else if(model instanceof ModelImpl) { // process properties @@ -176,22 +177,23 @@ else if(model instanceof ArrayModel) { protected void updateLocalRefs(Property property, String pathRef) { if(property instanceof RefProperty) { RefProperty ref = (RefProperty) property; - if(isLocalRef(ref.get$ref())) { + if(ref.getRefFormat() == RefFormat.INTERNAL) { ref.set$ref(computeLocalRef(ref.get$ref(), pathRef)); - }/*else if(isLocalRef(ref.getOriginalRef())) { - ref.set$ref(computeLocalRef(ref.getOriginalRef(), pathRef)); - }*/ - } - } - - protected boolean isLocalRef(String ref) { - if(ref.startsWith("#")) { - return true; + } else if (ref.getRefFormat() == RefFormat.RELATIVE) { + ref.set$ref(computeRelativeRef(ref.get$ref(), pathRef)); + } } - return false; } protected String computeLocalRef(String ref, String prefix) { return prefix + ref; } + + protected String computeRelativeRef(String ref, String prefix) { + int index = prefix.lastIndexOf('/'); + if (index > 1) { + return prefix.substring(0, index + 1) + ref; + } + return ref; + } } diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java index c7607bbf8f..8157f4be6c 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/FileReferenceTest.java @@ -117,6 +117,29 @@ public void testIssue316() { assertEquals(ref.get$ref(), "#/definitions/Foobar"); } + @Test + public void testIssue1223() { + SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/nested-file-references/issue-1223.yaml", null, true); + assertNotNull(result.getSwagger()); + + Swagger swagger = result.getSwagger(); + assertNotNull(swagger.getPath("/events")); + Path path = swagger.getPath("/events"); + assertNotNull(path.getGet()); + Operation get = path.getGet(); + assertEquals(get.getOperationId(), "getEvents"); + assertEquals(swagger.getDefinitions().size(),3); + assertEquals(swagger.getDefinitions().get("Foobar").getProperties().size(), 1); + assertEquals(swagger.getDefinitions().get("StatusResponse").getProperties().size(), 1); + assertEquals(swagger.getDefinitions().get("Paging2").getProperties().size(), 2); + Model model = swagger.getDefinitions().get("Paging2"); + + Property property = model.getProperties().get("foobar"); + assertTrue(property instanceof RefProperty); + RefProperty ref = (RefProperty) property; + assertEquals(ref.get$ref(), "#/definitions/Foobar"); + } + @Test public void testIssue323() { SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("./src/test/resources/nested-file-references/issue-323.yaml", null, true); diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/common/eventsWithPagingInSubdir.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/common/eventsWithPagingInSubdir.yaml new file mode 100644 index 0000000000..5e23406f2b --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-file-references/common/eventsWithPagingInSubdir.yaml @@ -0,0 +1,12 @@ +get: + description: A list of events + operationId: getEvents + responses: + 200: + description: OK + schema: + type: object + properties: + paging: +# type: string + $ref: 'paging2.yaml#/Paging2' diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/common/paging2.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/common/paging2.yaml index 41d22e8ed5..59260b0ec3 100644 --- a/modules/swagger-parser/src/test/resources/nested-file-references/common/paging2.yaml +++ b/modules/swagger-parser/src/test/resources/nested-file-references/common/paging2.yaml @@ -3,4 +3,4 @@ Paging2: total_items: type: integer foobar: - $ref: '../common2/bar.yaml#/Foobar' + $ref: './common2/bar.yaml#/Foobar' diff --git a/modules/swagger-parser/src/test/resources/nested-file-references/issue-1223.yaml b/modules/swagger-parser/src/test/resources/nested-file-references/issue-1223.yaml new file mode 100644 index 0000000000..5bba8b3f41 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/nested-file-references/issue-1223.yaml @@ -0,0 +1,22 @@ +swagger: '2.0' +info: + title: Test API + version: '1' +host: example.com +basePath: /api/v1 +schemes: + - https +consumes: + - application/json; charset=utf-8 +produces: + - application/json; charset=utf-8 + +paths: + /events: + $ref: './common/eventsWithPagingInSubdir.yaml' + +definitions: + StatusResponse: + properties: + http_code: + type: integer