Skip to content

Commit eefb7f5

Browse files
committed
flattenComposedSchema Option - refs - #1275
1 parent 26bcac1 commit eefb7f5

File tree

6 files changed

+178
-14
lines changed

6 files changed

+178
-14
lines changed

modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public class ParseOptions {
55
private boolean resolveCombinators = true;
66
private boolean resolveFully;
77
private boolean flatten;
8+
private boolean flattenComposedSchemas;
89
private boolean skipMatches;
910

1011
public boolean isResolve() {
@@ -42,4 +43,12 @@ public boolean isSkipMatches() {
4243
public void setSkipMatches(boolean skipMatches) {
4344
this.skipMatches = skipMatches;
4445
}
46+
47+
public boolean isFlattenComposedSchemas() {
48+
return flattenComposedSchemas;
49+
}
50+
51+
public void setFlattenComposedSchemas(boolean flattenComposedSchemas) {
52+
this.flattenComposedSchemas = flattenComposedSchemas;
53+
}
4554
}

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public SwaggerParseResult readLocation(String url, List<AuthorizationValue> auth
7070
result.setOpenAPI(resolver.resolve());
7171
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
7272
} else if (options.isFlatten()) {
73-
InlineModelResolver inlineModelResolver = new InlineModelResolver();
73+
InlineModelResolver inlineModelResolver = new InlineModelResolver(options.isFlattenComposedSchemas());
7474
inlineModelResolver.setSkipMatches(options.isSkipMatches());
7575
inlineModelResolver.flatten(result.getOpenAPI());
7676
}

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

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ public class InlineModelResolver {
3232
Map<String, Schema> addedModels = new HashMap<>();
3333
Map<String, String> generatedSignature = new HashMap<>();
3434

35+
private boolean flattenComposedSchemas;
36+
37+
38+
public InlineModelResolver(){this(false);}
39+
40+
public InlineModelResolver(boolean flattenComposedSchemas) {
41+
this.flattenComposedSchemas = flattenComposedSchemas;
42+
}
43+
3544
public void flatten(OpenAPI openAPI) {
3645
this.openAPI = openAPI;
3746

@@ -359,6 +368,32 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
359368
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
360369
flattenProperties(inner.getProperties(), path);
361370
String modelName = resolveModelName(inner.getTitle(), path + "_" + key);
371+
Schema innerModel = createModelFromProperty(inner, modelName);
372+
String existing = matchGenerated(innerModel);
373+
if (existing != null) {
374+
ap.setItems(new Schema().$ref(existing));
375+
} else {
376+
ap.setItems(new Schema().$ref(modelName));
377+
addGenerated(modelName, innerModel);
378+
openAPI.getComponents().addSchemas(modelName, innerModel);
379+
}
380+
}else if(inner instanceof ComposedSchema && this.flattenComposedSchemas){
381+
ComposedSchema composedSchema = (ComposedSchema) inner;
382+
String modelName = resolveModelName(inner.getTitle(), path + "_" + key);
383+
List<Schema> list = null;
384+
if (composedSchema.getAllOf() != null) {
385+
list = composedSchema.getAllOf();
386+
}else if (composedSchema.getAnyOf() != null) {
387+
list = composedSchema.getAnyOf();
388+
}else if (composedSchema.getOneOf() != null) {
389+
list = composedSchema.getOneOf();
390+
}
391+
for(int i= 0; i<list.size();i++){
392+
if(list.get(i).getProperties()!= null){
393+
flattenProperties(list.get(i).getProperties(), modelName);
394+
}
395+
}
396+
362397
Schema innerModel = createModelFromProperty(inner, modelName);
363398
String existing = matchGenerated(innerModel);
364399
if (existing != null) {
@@ -369,6 +404,7 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
369404
openAPI.getComponents().addSchemas(modelName, innerModel);
370405
}
371406
}
407+
372408
}
373409
} else if (property.getAdditionalProperties() != null && property.getAdditionalProperties() instanceof Schema) {
374410
Schema inner = (Schema) property.getAdditionalProperties();
@@ -437,20 +473,36 @@ public Schema createModelFromProperty(Schema schema, String path) {
437473
XML xml = schema.getXml();
438474
Map<String, Schema> properties = schema.getProperties();
439475

440-
Schema model = new Schema();//TODO Verify this!
441-
model.setDescription(description);
442-
model.setExample(example);
443-
model.setName(name);
444-
model.setXml(xml);
445-
model.setType(schema.getType());
446-
model.setRequired(requiredList);
447-
448-
if (properties != null) {
449-
flattenProperties(properties, path);
450-
model.setProperties(properties);
451-
}
452476

453-
return model;
477+
if (schema instanceof ComposedSchema && this.flattenComposedSchemas){
478+
ComposedSchema composedModel = (ComposedSchema) schema;
479+
480+
composedModel.setDescription(description);
481+
composedModel.setExample(example);
482+
composedModel.setName(name);
483+
composedModel.setXml(xml);
484+
composedModel.setType(schema.getType());
485+
composedModel.setRequired(requiredList);
486+
487+
return composedModel;
488+
489+
490+
} else {
491+
Schema model = new Schema();//TODO Verify this!
492+
model.setDescription(description);
493+
model.setExample(example);
494+
model.setName(name);
495+
model.setXml(xml);
496+
model.setType(schema.getType());
497+
model.setRequired(requiredList);
498+
499+
if (properties != null) {
500+
flattenProperties(properties, path);
501+
model.setProperties(properties);
502+
}
503+
504+
return model;
505+
}
454506
}
455507

456508
@SuppressWarnings("static-method")

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,37 @@ public class OpenAPIV3ParserTest {
6666
protected int serverPort = getDynamicPort();
6767
protected WireMockServer wireMockServer;
6868

69+
70+
@Test
71+
public void testFlattenComposedSchema() {
72+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
73+
ParseOptions options = new ParseOptions();
74+
options.setResolve(true);
75+
options.setFlatten(true);
76+
options.setFlattenComposedSchemas(true);
77+
SwaggerParseResult parseResult = openApiParser.readLocation("flattenComposedSchema.yaml", null, options);
78+
79+
OpenAPI openAPI = parseResult.getOpenAPI();
80+
assertNotNull(openAPI.getComponents().getSchemas().get("val_Members_val_member"));
81+
assertNotNull(openAPI.getComponents().getSchemas().get("val_MemberProducts_val_product"));
82+
83+
}
84+
85+
@Test
86+
public void testNotFlattenComposedSchema() {
87+
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();
88+
ParseOptions options = new ParseOptions();
89+
options.setResolve(true);
90+
options.setFlatten(true);
91+
92+
SwaggerParseResult parseResult = openApiParser.readLocation("flattenComposedSchema.yaml", null, options);
93+
94+
OpenAPI openAPI = parseResult.getOpenAPI();
95+
assertNull(openAPI.getComponents().getSchemas().get("val_Members_val_member"));
96+
assertNull(openAPI.getComponents().getSchemas().get("val_MemberProducts_val_product"));
97+
98+
}
99+
69100
@Test
70101
public void testCodegenIssue8601() {
71102
OpenAPIV3Parser openApiParser = new OpenAPIV3Parser();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,5 +1347,6 @@ public void testInlineItemsSchema() throws Exception {
13471347

13481348
assertNotNull(openAPI);
13491349
assertNotNull(openAPI.getComponents().getSchemas().get("inline_response_200"));
1350+
Yaml.prettyPrint(openAPI);
13501351
}
13511352
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
openapi: 3.0.2
3+
info:
4+
title: test
5+
version: 1.0.0
6+
paths:
7+
"/validation":
8+
post:
9+
tags:
10+
- test
11+
requestBody:
12+
required: true+
13+
content:
14+
application/json:
15+
schema:
16+
"$ref": "#/components/schemas/mtg_Message"
17+
responses:
18+
'200':
19+
description: '200'
20+
content:
21+
application/json:
22+
schema:
23+
"$ref": "#/components/schemas/mtg_Message"
24+
components:
25+
schemas:
26+
val_Members:
27+
additionalProperties: false
28+
description: valmembers desc
29+
properties:
30+
val_member:
31+
description: valmember desc
32+
items:
33+
type: object
34+
oneOf:
35+
- "$ref": "#/components/schemas/val_MemberChoice1"
36+
- "$ref": "#/components/schemas/val_MemberChoice2"
37+
minItems: 1
38+
type: array
39+
required:
40+
- val_member
41+
type: object
42+
val_MemberChoice1:
43+
additionalProperties: false
44+
description: val_MemberChoice1 desc
45+
properties:
46+
val_unique_reference1:
47+
type: string
48+
type: object
49+
val_MemberChoice2:
50+
additionalProperties: false
51+
description: val_MemberChoice2 desc
52+
properties:
53+
val_unique_reference2:
54+
type: string
55+
type: object
56+
val_MemberProducts:
57+
additionalProperties: false
58+
description: val_MemberProducts desc
59+
properties:
60+
val_product:
61+
items:
62+
type: object
63+
oneOf:
64+
- "$ref": "#/components/schemas/val_MemberChoice1"
65+
- "$ref": "#/components/schemas/val_MemberChoice3"
66+
maxItems: 4
67+
minItems: 1
68+
type: array
69+
required:
70+
- val_product
71+
type: object

0 commit comments

Comments
 (0)