From 48ee2e3daf703421ad51adfe5f172c97adc8d05c Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Mon, 27 Jul 2015 12:46:27 -0700 Subject: [PATCH 1/2] updated swagger-core version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2e0933039f..eaa64f166c 100644 --- a/pom.xml +++ b/pom.xml @@ -209,7 +209,7 @@ 2.4 2.10.4 1.6.3 - 1.5.0 + 1.5.1-SNAPSHOT 4.8.1 2.1.3 From f047cafb05b309390393f842f7cddb2d7f49fd00 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Tue, 28 Jul 2015 21:59:04 -0700 Subject: [PATCH 2/2] fix for #69, added yaml support for resolver --- .../io/swagger/parser/SwaggerResolver.java | 11 ++- .../src/test/scala/SwaggerResolverTest.scala | 69 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerResolver.java b/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerResolver.java index 4ba3b9df77..438d180e63 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerResolver.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/SwaggerResolver.java @@ -1,6 +1,8 @@ package io.swagger.parser; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + import io.swagger.models.ArrayModel; import io.swagger.models.Model; import io.swagger.models.ModelImpl; @@ -19,6 +21,7 @@ import io.swagger.models.properties.RefProperty; import io.swagger.parser.util.RemoteUrl; import io.swagger.util.Json; +import io.swagger.util.Yaml; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,7 +88,13 @@ public void applyResolutions(List auths) { JsonNode location = null; String locationName = null; if (contents != null) { - location = Json.mapper().readTree(contents); + ObjectMapper mapper; + if (contents.trim().startsWith("{")) { + mapper = Json.mapper(); + } else { + mapper = Yaml.mapper(); + } + location = mapper.readTree(contents); String[] objectPath = definitionPath.split("/"); for (String objectPathPart : objectPath) { LOGGER.debug("getting part " + objectPathPart); diff --git a/modules/swagger-parser/src/test/scala/SwaggerResolverTest.scala b/modules/swagger-parser/src/test/scala/SwaggerResolverTest.scala index 9a677a2b42..cc8987a210 100644 --- a/modules/swagger-parser/src/test/scala/SwaggerResolverTest.scala +++ b/modules/swagger-parser/src/test/scala/SwaggerResolverTest.scala @@ -22,6 +22,20 @@ class SwaggerResolverTest extends FlatSpec with Matchers { swagger.getDefinitions().get("Tag") should not be (null) } + it should "resolve a simple remote model property definition in yaml" in { + val swagger = new Swagger() + swagger.addDefinition( + "Sample", new ModelImpl() + .property("remoteRef", new RefProperty("http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag"))) + + val resolved = new SwaggerResolver().resolve(swagger, null) + val prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef") + prop.isInstanceOf[RefProperty] should be(true) + val ref = prop.asInstanceOf[RefProperty] + ref.get$ref() should equal("#/definitions/Tag") + swagger.getDefinitions().get("Tag") should not be (null) + } + it should "resolve an array remote model property definition" in { val swagger = new Swagger() swagger.addDefinition( @@ -37,6 +51,21 @@ class SwaggerResolverTest extends FlatSpec with Matchers { swagger.getDefinitions().get("Tag") should not be (null) } + it should "resolve an array remote model property definition in yaml" in { + val swagger = new Swagger() + swagger.addDefinition( + "Sample", new ModelImpl() + .property("remoteRef", new ArrayProperty(new RefProperty("http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag")))) + + val resolved = new SwaggerResolver().resolve(swagger, null) + val prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef") + prop.isInstanceOf[ArrayProperty] should be(true) + val ap = prop.asInstanceOf[ArrayProperty] + val ref = ap.getItems().asInstanceOf[RefProperty] + ref.get$ref() should equal("#/definitions/Tag") + swagger.getDefinitions().get("Tag") should not be (null) + } + it should "resolve an map remote model property definition" in { val swagger = new Swagger() swagger.addDefinition( @@ -51,6 +80,20 @@ class SwaggerResolverTest extends FlatSpec with Matchers { swagger.getDefinitions().get("Tag") should not be (null) } + it should "resolve an map remote model property definition in yaml" in { + val swagger = new Swagger() + swagger.addDefinition( + "Sample", new ModelImpl() + .property("remoteRef", new MapProperty(new RefProperty("http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag")))) + val resolved = new SwaggerResolver().resolve(swagger, null) + val prop = resolved.getDefinitions().get("Sample").getProperties().get("remoteRef") + prop.isInstanceOf[MapProperty] should be(true) + val ap = prop.asInstanceOf[MapProperty] + val ref = ap.getAdditionalProperties().asInstanceOf[RefProperty] + ref.get$ref() should equal("#/definitions/Tag") + swagger.getDefinitions().get("Tag") should not be (null) + } + it should "resolve operation bodyparam remote refs" in { val swagger = new Swagger() swagger.path("/fun", new Path() @@ -65,6 +108,19 @@ class SwaggerResolverTest extends FlatSpec with Matchers { swagger.getDefinitions().get("Tag") should not be (null) } + it should "resolve operation bodyparam remote refs in yaml" in { + val swagger = new Swagger() + swagger.path("/fun", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .schema(new RefModel("http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag"))))) + + val resolved = new SwaggerResolver().resolve(swagger, null) + val param = swagger.getPaths().get("/fun").getGet().getParameters().get(0).asInstanceOf[BodyParameter] + val ref = param.getSchema().asInstanceOf[RefModel] + ref.get$ref() should equal("#/definitions/Tag") + swagger.getDefinitions().get("Tag") should not be (null) + } it should "resolve operation parameter remote refs" in { val swagger = new Swagger() @@ -119,5 +175,18 @@ class SwaggerResolverTest extends FlatSpec with Matchers { ref.get$ref() should equal("#/definitions/Tag") swagger.getDefinitions().get("Tag") should not be (null) } + + it should "resolve response remote refs in yaml" in { + val swagger = new Swagger() + swagger.path("/fun", new Path() + .get(new Operation() + .response(200, new Response() + .schema(new RefProperty("http://petstore.swagger.io/v2/swagger.yaml#/definitions/Tag"))))) + val resolved = new SwaggerResolver().resolve(swagger, null) + val response = swagger.getPaths().get("/fun").getGet().getResponses().get("200") + val ref = response.getSchema.asInstanceOf[RefProperty] + ref.get$ref() should equal("#/definitions/Tag") + swagger.getDefinitions().get("Tag") should not be (null) + } }