Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.swagger.v3.oas.models.media.DateTimeSchema;
import io.swagger.v3.oas.models.media.Discriminator;
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.Schema;
import io.swagger.v3.oas.models.media.XML;
Expand Down Expand Up @@ -2023,7 +2024,7 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
ArrayNode allOfArray = getArray("allOf", node, false, location, 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);


if((allOfArray != null )||(anyOfArray != null)|| (oneOfArray != null)) {
Expand Down Expand Up @@ -2075,6 +2076,31 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
schema = items;
}

if(additionalPropertiesNode != null){
MapSchema mapSchema = new MapSchema();
if (additionalPropertiesNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectNode additionalPropertiesObj = getObject("additionalProperties", node, false, location, result);
if (additionalPropertiesObj != null) {
Schema additionalProperties = getSchema(additionalPropertiesObj, location, result);
if (additionalProperties != null) {
mapSchema.setAdditionalProperties(additionalProperties);
}
}
} 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;
}



if (schema == null){
schema = SchemaTypeUtil.createSchemaByType(node);
}
Expand Down Expand Up @@ -2267,24 +2293,6 @@ public Schema getSchema(ObjectNode node, String location, ParseResult result){
schema.setProperties(properties);
}


if (node.get("additionalProperties") != null) {
if (node.get("additionalProperties").getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectNode additionalPropertiesObj = getObject("additionalProperties", node, false, location, result);
if (additionalPropertiesObj != null) {
Schema additionalProperties = getSchema(additionalPropertiesObj, location, result);
if (additionalProperties != null) {
schema.setAdditionalProperties(additionalProperties);
}
}
} else if (node.get("additionalProperties").getNodeType().equals(JsonNodeType.BOOLEAN)) {
Boolean additionalProperties = getBoolean("additionalProperties", node, false, location, result);
if (additionalProperties != null) {
schema.setAdditionalProperties(additionalProperties);
}

}
}
value = getString("description",node,false,location,result);
if (StringUtils.isNotBlank(value)) {
schema.setDescription(value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,20 @@ public class OpenAPIV3ParserTest {
protected int serverPort = getDynamicPort();
protected WireMockServer wireMockServer;

@Test
public void testIssue1071() {

ParseOptions options = new ParseOptions();
options.setResolve(true);

SwaggerParseResult parseResult = new OpenAPIV3Parser().readLocation("issue-1071.yaml", null, options);
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 testIssue1039() {
Expand All @@ -76,7 +90,7 @@ public void testIssue1039() {
OpenAPI apispec = parseResult.getOpenAPI();
assertNotNull(apispec);
assertEquals(apispec.getPaths().get("/pets").getGet().getParameters().get(0).getSchema().getType(),"array");

}

@Test
Expand Down
29 changes: 29 additions & 0 deletions modules/swagger-parser-v3/src/test/resources/issue-1071.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
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:
type: string