From ae3993a4e3aca8d4ebef8503578203b30dca8ceb Mon Sep 17 00:00:00 2001 From: frantuma Date: Wed, 24 Apr 2019 10:04:21 +0200 Subject: [PATCH] deserialize into MapSchema for bool additionalProperties --- .../v3/parser/util/OpenAPIDeserializer.java | 27 +++++++-------- .../v3/parser/test/OpenAPIV3ParserTest.java | 33 ++++++++++++++++++- .../src/test/resources/issue-1071-false.yaml | 28 ++++++++++++++++ .../src/test/resources/issue-1071-true.yaml | 28 ++++++++++++++++ pom.xml | 2 +- 5 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1071-false.yaml create mode 100644 modules/swagger-parser-v3/src/test/resources/issue-1071-true.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java index 03f8b0a1f0..30b6ec8626 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.media.Encoding; import io.swagger.v3.oas.models.media.MapSchema; import io.swagger.v3.oas.models.media.MediaType; +import io.swagger.v3.oas.models.media.ObjectSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.XML; import io.swagger.v3.oas.models.security.OAuthFlow; @@ -50,9 +51,7 @@ import io.swagger.v3.oas.models.servers.ServerVariables; import io.swagger.v3.parser.core.models.SwaggerParseResult; import io.swagger.v3.core.util.Json; -import io.swagger.v3.core.util.RefUtils; -import io.swagger.v3.parser.models.RefFormat; import org.apache.commons.lang3.StringUtils; import static io.swagger.v3.core.util.RefUtils.extractSimpleName; @@ -2034,6 +2033,7 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){ ArrayNode anyOfArray = getArray("anyOf", node, false, location, result); ObjectNode itemsNode = getObject("items", node, false, location, result); ObjectNode additionalPropertiesNode = getObject("additionalProperties", node, false, location, result); + Boolean additionalPropertiesBoolean = getBoolean("additionalProperties", node, false, location, result); if((allOfArray != null )||(anyOfArray != null)|| (oneOfArray != null)) { @@ -2085,7 +2085,7 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){ schema = items; } - if(additionalPropertiesNode != null){ + if(additionalPropertiesNode != null) { MapSchema mapSchema = new MapSchema(); if (additionalPropertiesNode.getNodeType().equals(JsonNodeType.OBJECT)) { ObjectNode additionalPropertiesObj = getObject("additionalProperties", node, false, location, result); @@ -2093,19 +2093,20 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){ Schema additionalProperties = getSchema(additionalPropertiesObj, location, result); if (additionalProperties != null) { mapSchema.setAdditionalProperties(additionalProperties); + schema = mapSchema; } } - } else if (additionalPropertiesNode.getNodeType().equals(JsonNodeType.BOOLEAN)) { - Boolean additionalProperties = getBoolean("additionalProperties", node, false, location, result); - if (additionalProperties != null) { - if (additionalProperties == true) { - mapSchema.setAdditionalProperties(additionalProperties); - }else{ - schema.setAdditionalProperties(additionalProperties); - } - } } - schema = mapSchema; + } else if(additionalPropertiesBoolean != null){ + MapSchema mapSchema = new MapSchema(); + if (additionalPropertiesBoolean) { + mapSchema.setAdditionalProperties(additionalPropertiesBoolean); + schema = mapSchema; + }else{ + ObjectSchema objectSchema = new ObjectSchema(); + objectSchema.setAdditionalProperties(additionalPropertiesBoolean); + schema = objectSchema; + } } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index cf914dc8c1..c5cd8d1d93 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -75,11 +75,42 @@ public void testIssue1071() { OpenAPI apispec = parseResult.getOpenAPI(); assertNotNull(apispec); Schema test = apispec.getPaths().get("/mapschema").getGet().getResponses().get("200").getContent().get("application/json").getSchema(); - System.out.println(test.getClass()); assertTrue(test instanceof MapSchema); } + @Test + public void testIssue1071True() { + + ParseOptions options = new ParseOptions(); + options.setResolve(true); + + SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("issue-1071-true.yaml", null, options); + OpenAPI apispec = parseResult.getOpenAPI(); + assertNotNull(apispec); + Schema test = apispec.getPaths().get("/mapschema").getGet().getResponses().get("200").getContent().get("application/json").getSchema(); + assertTrue(test instanceof MapSchema); + assertTrue(test.getAdditionalProperties() instanceof Boolean); + assertTrue((Boolean)test.getAdditionalProperties()); + + } + + @Test + public void testIssue1071False() { + + ParseOptions options = new ParseOptions(); + options.setResolve(true); + + SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("issue-1071-false.yaml", null, options); + OpenAPI apispec = parseResult.getOpenAPI(); + assertNotNull(apispec); + Schema test = apispec.getPaths().get("/mapschema").getGet().getResponses().get("200").getContent().get("application/json").getSchema(); + assertTrue(test instanceof ObjectSchema); + assertTrue(test.getAdditionalProperties() instanceof Boolean); + assertFalse((Boolean)test.getAdditionalProperties()); + + } + @Test public void testIssue1039() { diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1071-false.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1071-false.yaml new file mode 100644 index 0000000000..61234fcca1 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1071-false.yaml @@ -0,0 +1,28 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + description: A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification + termsOfService: http://swagger.io/terms/ + contact: + name: Swagger API Team + email: apiteam@swagger.io + url: http://swagger.io + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +servers: + - url: http://petstore.swagger.io/api +paths: + '/mapschema': + get: + description: MapSchema + operationId: MapSchema + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: object + additionalProperties: false \ No newline at end of file diff --git a/modules/swagger-parser-v3/src/test/resources/issue-1071-true.yaml b/modules/swagger-parser-v3/src/test/resources/issue-1071-true.yaml new file mode 100644 index 0000000000..37b330a74e --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/issue-1071-true.yaml @@ -0,0 +1,28 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Swagger Petstore + description: A sample API that uses a petstore as an example to demonstrate features in the OpenAPI 3.0 specification + termsOfService: http://swagger.io/terms/ + contact: + name: Swagger API Team + email: apiteam@swagger.io + url: http://swagger.io + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +servers: + - url: http://petstore.swagger.io/api +paths: + '/mapschema': + get: + description: MapSchema + operationId: MapSchema + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: object + additionalProperties: true \ No newline at end of file diff --git a/pom.xml b/pom.xml index 92ac86ff3f..1e296b70d4 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ 1.0.45-SNAPSHOT 2.4 1.6.3 - 2.0.7 + 2.0.8-SNAPSHOT 4.8.1 6.14.2 1.35