Skip to content

Commit b2a9442

Browse files
committed
fix: refs #1801, #1821 - fix OAS 3.1 type(s) processing
1 parent 2f35a0d commit b2a9442

File tree

6 files changed

+114
-4
lines changed

6 files changed

+114
-4
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.swagger.v3.oas.models.Operation;
1414
import io.swagger.v3.oas.models.PathItem;
1515
import io.swagger.v3.oas.models.Paths;
16+
import io.swagger.v3.oas.models.SpecVersion;
1617
import io.swagger.v3.oas.models.callbacks.Callback;
1718
import io.swagger.v3.oas.models.examples.Example;
1819
import io.swagger.v3.oas.models.links.Link;
@@ -313,6 +314,7 @@ public OpenAPI parseRoot(JsonNode node, ParseResult result, String path) {
313314
return null;
314315
} else if (value.startsWith("3.1")) {
315316
result.openapi31(true);
317+
openAPI.setSpecVersion(SpecVersion.V31);
316318
}
317319
if (!value.startsWith("3.0.") && !value.startsWith("3.1.")){
318320
result.warning(location, "The provided definition does not specify a valid version field");

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.swagger.v3.oas.models.Operation;
66
import io.swagger.v3.oas.models.PathItem;
77
import io.swagger.v3.oas.models.Paths;
8+
import io.swagger.v3.oas.models.SpecVersion;
89
import io.swagger.v3.oas.models.callbacks.Callback;
910
import io.swagger.v3.oas.models.examples.Example;
1011
import io.swagger.v3.oas.models.headers.Header;
@@ -379,7 +380,15 @@ public Schema resolveSchema(Schema schema) {
379380
boolean adjacent = (hasAllOf && hasAnyOf) || (hasAllOf && hasOneOf) || (hasAnyOf && hasOneOf);
380381

381382
if (aggregateCombinators && (hasAllOf || adjacent)) {
382-
Schema combinedModel = SchemaTypeUtil.createSchema(composedSchema.getType(), composedSchema.getFormat());
383+
Schema combinedModel = null;
384+
if (SpecVersion.V30.equals(composedSchema.getSpecVersion())) {
385+
combinedModel = SchemaTypeUtil.createSchema(getSchemaType(composedSchema), composedSchema.getFormat());
386+
} else {
387+
combinedModel = new JsonSchema();
388+
combinedModel.setFormat(composedSchema.getFormat());
389+
combinedModel.setTypes(composedSchema.getTypes());
390+
}
391+
383392
// combinedModel.setDefault(composedSchema.getDefault());
384393
Set<Object> examples = new HashSet<>();
385394
Set<Object> defaultValues = new HashSet<>();
@@ -436,8 +445,12 @@ public Schema resolveSchema(Schema schema) {
436445
Schema property = updated.get(key);
437446

438447
if (property.getProperties() != model.getProperties()) {
439-
if (property.getType() == null) {
440-
property.setType("object");
448+
if (!hasSchemaType(property)) {
449+
if (SpecVersion.V30.equals(property.getSpecVersion())) {
450+
property.setType("object");
451+
} else {
452+
property.addType("object");
453+
}
441454
}
442455
model.addProperties(key, property);
443456
} else {
@@ -453,6 +466,22 @@ public Schema resolveSchema(Schema schema) {
453466
return result;
454467
}
455468

469+
protected String getSchemaType(Schema schema) {
470+
if (SpecVersion.V30.equals(schema.getSpecVersion())) {
471+
return schema.getType();
472+
}
473+
if (schema.getTypes() != null && schema.getTypes().size() == 1) {
474+
return (String)schema.getTypes().iterator().next();
475+
}
476+
return null;
477+
}
478+
479+
protected boolean hasSchemaType(Schema schema) {
480+
if (SpecVersion.V30.equals(schema.getSpecVersion())) {
481+
return schema.getType() != null;
482+
}
483+
return schema.getTypes() != null && schema.getTypes().size() > 0;
484+
}
456485
public Map<String,Example> resolveExample(Map<String,Example> examples){
457486

458487
Map<String,Example> resolveExamples = examples;

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OAI31DeserializationTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,4 +947,44 @@ public void test30NonRefSiblingsBehavior() {
947947
assertNull(profile.getProperties());
948948

949949
}
950+
951+
@Test(description = "Test Issue 1801")
952+
public void test31Issue1801() {
953+
ParseOptions options = new ParseOptions();
954+
SwaggerParseResult result = new OpenAPIV3Parser().readLocation( "3.1.0/issue-1801.yaml", null, options);
955+
assertNotNull(result.getOpenAPI());
956+
OpenAPI openAPI = result.getOpenAPI();
957+
Schema firstAllOf = (Schema)openAPI.getComponents().getSchemas().get("AllofWithTheLastEmptySchema").getAllOf().get(0);
958+
assertEquals(firstAllOf.getTypes().iterator().next(), "number");
959+
assertEquals(firstAllOf.getType(), null);
960+
Schema secondAllOf = (Schema)openAPI.getComponents().getSchemas().get("AllofWithTheLastEmptySchema").getAllOf().get(1);
961+
assertEquals(secondAllOf.getTypes(), null);
962+
assertEquals(firstAllOf.getType(), null);
963+
964+
try {
965+
System.setProperty("bind-type", "true");
966+
result = new OpenAPIV3Parser().readLocation("3.1.0/issue-1801.yaml", null, options);
967+
assertNotNull(result.getOpenAPI());
968+
openAPI = result.getOpenAPI();
969+
firstAllOf = (Schema) openAPI.getComponents().getSchemas().get("AllofWithTheLastEmptySchema").getAllOf().get(0);
970+
assertEquals(firstAllOf.getTypes().iterator().next(), "number");
971+
assertEquals(firstAllOf.getType(), "number");
972+
secondAllOf = (Schema) openAPI.getComponents().getSchemas().get("AllofWithTheLastEmptySchema").getAllOf().get(1);
973+
assertEquals(secondAllOf.getTypes(), null);
974+
assertEquals(secondAllOf.getType(), null);
975+
} finally {
976+
System.setProperty("bind-type", "false");
977+
}
978+
}
979+
980+
@Test(description = "Test Issue 1821")
981+
public void test31Issue1821() {
982+
ParseOptions options = new ParseOptions();
983+
options.setResolve(true);
984+
options.setResolveFully(true);
985+
SwaggerParseResult result = new OpenAPIV3Parser().readLocation( "3.1.0/issue-1821.yaml", null, options);
986+
assertNotNull(result.getOpenAPI());
987+
Schema id = (Schema)result.getOpenAPI().getComponents().getSchemas().get("Rule").getProperties().get("id");
988+
assertEquals(id.getTypes().iterator().next(), "string");
989+
}
950990
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
openapi: 3.1.0
2+
servers:
3+
- url: https://someserver.com/v1
4+
info:
5+
title: openapi 3.1.0 sample spec
6+
version: 0.0.1
7+
description: sample spec for testing openapi functionality, built from json schema
8+
tests for draft2020-12
9+
tags: []
10+
paths: {}
11+
components:
12+
schemas:
13+
AllofWithTheLastEmptySchema:
14+
$schema: https://json-schema.org/draft/2020-12/schema
15+
allOf:
16+
- type: number
17+
- {}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
openapi: 3.1.0
2+
paths: {}
3+
components:
4+
schemas:
5+
Rule:
6+
type: object
7+
properties:
8+
id:
9+
type: string
10+
format: uuid
11+
name:
12+
type: string
13+
condition:
14+
type: string
15+
order:
16+
type: integer
17+
enabled:
18+
type: boolean
19+
version:
20+
type: integer
21+
description: Version counter
22+

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@
406406
<swagger-parser-v2-version>1.0.63</swagger-parser-v2-version>
407407
<commons-io-version>2.11.0</commons-io-version>
408408
<slf4j-version>1.7.30</slf4j-version>
409-
<swagger-core-version>2.2.4</swagger-core-version>
409+
<swagger-core-version>2.2.6</swagger-core-version>
410410
<swagger-core-v2-version>1.6.8</swagger-core-v2-version>
411411
<junit-version>4.13.2</junit-version>
412412
<testng-version>6.14.2</testng-version>

0 commit comments

Comments
 (0)