Skip to content

Commit f3df8e8

Browse files
OpenAPIDeserializer.getSchema: Avoid incorrect error message when parsing a boolean value for "additionalProperties" (issue #1099)
1 parent 8af23f4 commit f3df8e8

File tree

2 files changed

+58
-27
lines changed

2 files changed

+58
-27
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,9 +2032,6 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
20322032
ArrayNode allOfArray = getArray("allOf", node, false, location, result);
20332033
ArrayNode anyOfArray = getArray("anyOf", node, false, location, result);
20342034
ObjectNode itemsNode = getObject("items", node, false, location, result);
2035-
ObjectNode additionalPropertiesNode = getObject("additionalProperties", node, false, location, result);
2036-
Boolean additionalPropertiesBoolean = getBoolean("additionalProperties", node, false, location, result);
2037-
20382035

20392036
if((allOfArray != null )||(anyOfArray != null)|| (oneOfArray != null)) {
20402037
ComposedSchema composedSchema = new ComposedSchema();
@@ -2085,31 +2082,25 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
20852082
schema = items;
20862083
}
20872084

2088-
if(additionalPropertiesNode != null) {
2089-
MapSchema mapSchema = new MapSchema();
2090-
if (additionalPropertiesNode.getNodeType().equals(JsonNodeType.OBJECT)) {
2091-
ObjectNode additionalPropertiesObj = getObject("additionalProperties", node, false, location, result);
2092-
if (additionalPropertiesObj != null) {
2093-
Schema additionalProperties = getSchema(additionalPropertiesObj, location, result);
2094-
if (additionalProperties != null) {
2095-
mapSchema.setAdditionalProperties(additionalProperties);
2096-
schema = mapSchema;
2097-
}
2098-
}
2099-
}
2100-
} else if(additionalPropertiesBoolean != null){
2101-
MapSchema mapSchema = new MapSchema();
2102-
if (additionalPropertiesBoolean) {
2103-
mapSchema.setAdditionalProperties(additionalPropertiesBoolean);
2104-
schema = mapSchema;
2105-
}else{
2106-
ObjectSchema objectSchema = new ObjectSchema();
2107-
objectSchema.setAdditionalProperties(additionalPropertiesBoolean);
2108-
schema = objectSchema;
2109-
}
2110-
}
2085+
Boolean additionalPropertiesBoolean = getBoolean("additionalProperties", node, false, location, result);
21112086

2087+
ObjectNode additionalPropertiesObject =
2088+
additionalPropertiesBoolean == null
2089+
? getObject("additionalProperties", node, false, location, result)
2090+
: null;
21122091

2092+
Object additionalProperties =
2093+
additionalPropertiesObject != null
2094+
? getSchema(additionalPropertiesObject, location, result)
2095+
: additionalPropertiesBoolean;
2096+
2097+
if(additionalProperties != null) {
2098+
schema =
2099+
additionalProperties.equals( Boolean.FALSE)
2100+
? new ObjectSchema()
2101+
: new MapSchema();
2102+
schema.setAdditionalProperties( additionalProperties);
2103+
}
21132104

21142105
if (schema == null){
21152106
schema = SchemaTypeUtil.createSchemaByType(node);

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.swagger.v3.oas.models.media.DateSchema;
2121
import io.swagger.v3.oas.models.media.DateTimeSchema;
2222
import io.swagger.v3.oas.models.media.IntegerSchema;
23+
import io.swagger.v3.oas.models.media.MapSchema;
2324
import io.swagger.v3.oas.models.media.MediaType;
2425
import io.swagger.v3.oas.models.media.ObjectSchema;
2526
import io.swagger.v3.oas.models.media.Schema;
@@ -58,10 +59,11 @@
5859
import java.util.Set;
5960
import java.util.TimeZone;
6061

62+
import static java.util.Collections.emptyList;
6163
import static org.testng.Assert.assertEquals;
64+
import static org.testng.Assert.assertFalse;
6265
import static org.testng.Assert.assertNotNull;
6366
import static org.testng.Assert.assertTrue;
64-
import static org.testng.Assert.assertFalse;
6567

6668
public class OpenAPIDeserializerTest {
6769

@@ -679,6 +681,44 @@ public void testArrayModelDefinition() {
679681
assertTrue(response.getAdditionalProperties() != null);
680682
}
681683

684+
@Test
685+
public void testAdditionalPropertiesBoolean() {
686+
String yaml =
687+
"openapi: 3.0.0\n" +
688+
"info:\n" +
689+
" title: Test\n" +
690+
" version: 1.0.0\n" +
691+
"paths:\n" +
692+
" \"/store/inventory\":\n" +
693+
" post:\n" +
694+
" requestBody:\n" +
695+
" content:\n" +
696+
" application/json:\n" +
697+
" schema:\n" +
698+
" additionalProperties: true\n" +
699+
" responses:\n" +
700+
" '200':\n" +
701+
" description: successful operation\n" +
702+
" content:\n" +
703+
" application/json:\n" +
704+
" schema:\n" +
705+
" additionalProperties: false\n";
706+
707+
OpenAPIV3Parser parser = new OpenAPIV3Parser();
708+
SwaggerParseResult result = parser.readContents(yaml, null, null);
709+
assertEquals(result.getMessages(), emptyList());
710+
711+
OpenAPI openAPI = result.getOpenAPI();
712+
713+
Schema body = openAPI.getPaths().get("/store/inventory").getPost().getRequestBody().getContent().get("application/json").getSchema();
714+
assertEquals(body.getAdditionalProperties(), Boolean.TRUE);
715+
assertEquals(body.getClass(), MapSchema.class);
716+
717+
Schema response = openAPI.getPaths().get("/store/inventory").getPost().getResponses().get("200").getContent().get("application/json").getSchema();
718+
assertEquals(response.getAdditionalProperties(), Boolean.FALSE);
719+
assertEquals(response.getClass(), ObjectSchema.class);
720+
}
721+
682722
@Test
683723
public void testArrayQueryParam() throws Exception {
684724
String yaml = "openapi: 3.0.0\n" +

0 commit comments

Comments
 (0)