Skip to content

Commit 2892fb6

Browse files
authored
Merge branch 'master' into master
2 parents 4fae6b7 + f97d21b commit 2892fb6

File tree

3 files changed

+137
-75
lines changed

3 files changed

+137
-75
lines changed

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

Lines changed: 68 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,11 @@ public void flatten(OpenAPI openAPI) {
7474
ArraySchema am = (ArraySchema) model;
7575
Schema inner = am.getItems();
7676

77-
if (inner instanceof ObjectSchema) {
78-
ObjectSchema op = (ObjectSchema) inner;
79-
if (op.getProperties() != null && op.getProperties().size() > 0) {
80-
flattenProperties(op.getProperties(), pathname);
81-
String modelName = resolveModelName(op.getTitle(), "body");
82-
Schema innerModel = modelFromProperty(op, modelName);
77+
if (isObjectSchema(inner)) {
78+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
79+
flattenProperties(inner.getProperties(), pathname);
80+
String modelName = resolveModelName(inner.getTitle(), "body");
81+
Schema innerModel = createModelFromProperty(inner, modelName);
8382
String existing = matchGenerated(innerModel);
8483
if (existing != null) {
8584
am.setItems(new Schema().$ref(existing));
@@ -115,12 +114,11 @@ public void flatten(OpenAPI openAPI) {
115114
ArraySchema am = (ArraySchema) model;
116115
Schema inner = am.getItems();
117116

118-
if (inner instanceof ObjectSchema) {
119-
ObjectSchema op = (ObjectSchema) inner;
120-
if (op.getProperties() != null && op.getProperties().size() > 0) {
121-
flattenProperties(op.getProperties(), pathname);
122-
String modelName = resolveModelName(op.getTitle(), parameter.getName());
123-
Schema innerModel = modelFromProperty(op, modelName);
117+
if (isObjectSchema(inner)) {
118+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
119+
flattenProperties(inner.getProperties(), pathname);
120+
String modelName = resolveModelName(inner.getTitle(), parameter.getName());
121+
Schema innerModel = createModelFromProperty(inner, modelName);
124122
String existing = matchGenerated(innerModel);
125123
if (existing != null) {
126124
am.setItems(new Schema().$ref(existing));
@@ -145,57 +143,54 @@ public void flatten(OpenAPI openAPI) {
145143
if (content.get(name) != null) {
146144
MediaType media = content.get(name);
147145
if (media.getSchema() != null) {
148-
Schema property = media.getSchema();
149-
if (property instanceof ObjectSchema) {
150-
ObjectSchema op = (ObjectSchema) property;
151-
if (op.getProperties() != null && op.getProperties().size() > 0) {
152-
String modelName = resolveModelName(op.getTitle(), "inline_response_" + key);
153-
Schema model = modelFromProperty(op, modelName);
146+
Schema mediaSchema = media.getSchema();
147+
if (isObjectSchema(mediaSchema)) {
148+
if (mediaSchema.getProperties() != null && mediaSchema.getProperties().size() > 0) {
149+
String modelName = resolveModelName(mediaSchema.getTitle(), "inline_response_" + key);
150+
Schema model = createModelFromProperty(mediaSchema, modelName);
154151
String existing = matchGenerated(model);
155152
if (existing != null) {
156-
media.setSchema(this.makeRefProperty(existing, property));
153+
media.setSchema(this.makeRefProperty(existing, mediaSchema));
157154
} else {
158-
media.setSchema(this.makeRefProperty(modelName, property));
155+
media.setSchema(this.makeRefProperty(modelName, mediaSchema));
159156
addGenerated(modelName, model);
160157
openAPI.getComponents().addSchemas(modelName, model);
161158
}
162159
}
163-
} else if (property instanceof ArraySchema) {
164-
ArraySchema ap = (ArraySchema) property;
160+
} else if (mediaSchema instanceof ArraySchema) {
161+
ArraySchema ap = (ArraySchema) mediaSchema;
165162
Schema inner = ap.getItems();
166163

167-
if (inner instanceof ObjectSchema) {
168-
ObjectSchema op = (ObjectSchema) inner;
169-
if (op.getProperties() != null && op.getProperties().size() > 0) {
170-
flattenProperties(op.getProperties(), pathname);
171-
String modelName = resolveModelName(op.getTitle(),
164+
if (isObjectSchema(inner)) {
165+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
166+
flattenProperties(inner.getProperties(), pathname);
167+
String modelName = resolveModelName(inner.getTitle(),
172168
"inline_response_" + key);
173-
Schema innerModel = modelFromProperty(op, modelName);
169+
Schema innerModel = createModelFromProperty(inner, modelName);
174170
String existing = matchGenerated(innerModel);
175171
if (existing != null) {
176-
ap.setItems(this.makeRefProperty(existing, op));
172+
ap.setItems(this.makeRefProperty(existing, inner));
177173
} else {
178-
ap.setItems(this.makeRefProperty(modelName, op));
174+
ap.setItems(this.makeRefProperty(modelName, inner));
179175
addGenerated(modelName, innerModel);
180176
openAPI.getComponents().addSchemas(modelName, innerModel);
181177
}
182178
}
183179
}
184-
} else if (property.getAdditionalProperties() != null && property.getAdditionalProperties() instanceof Schema) {
185-
186-
Schema innerProperty = (Schema) property.getAdditionalProperties();
187-
if (innerProperty instanceof ObjectSchema) {
188-
ObjectSchema op = (ObjectSchema) innerProperty;
189-
if (op.getProperties() != null && op.getProperties().size() > 0) {
190-
flattenProperties(op.getProperties(), pathname);
191-
String modelName = resolveModelName(op.getTitle(),
180+
} else if (mediaSchema.getAdditionalProperties() != null && mediaSchema.getAdditionalProperties() instanceof Schema) {
181+
182+
Schema innerProperty = (Schema) mediaSchema.getAdditionalProperties();
183+
if (isObjectSchema(innerProperty)) {
184+
if (innerProperty.getProperties() != null && innerProperty.getProperties().size() > 0) {
185+
flattenProperties(innerProperty.getProperties(), pathname);
186+
String modelName = resolveModelName(innerProperty.getTitle(),
192187
"inline_response_" + key);
193-
Schema innerModel = modelFromProperty(op, modelName);
188+
Schema innerModel = createModelFromProperty(innerProperty, modelName);
194189
String existing = matchGenerated(innerModel);
195190
if (existing != null) {
196-
property.setAdditionalProperties(new Schema().$ref(existing));
191+
mediaSchema.setAdditionalProperties(new Schema().$ref(existing));
197192
} else {
198-
property.setAdditionalProperties(new Schema().$ref(modelName));
193+
mediaSchema.setAdditionalProperties(new Schema().$ref(modelName));
199194
addGenerated(modelName, innerModel);
200195
openAPI.getComponents().addSchemas(modelName, innerModel);
201196
}
@@ -224,11 +219,10 @@ public void flatten(OpenAPI openAPI) {
224219
} else if (model instanceof ArraySchema) {
225220
ArraySchema m = (ArraySchema) model;
226221
Schema inner = m.getItems();
227-
if (inner instanceof ObjectSchema) {
228-
ObjectSchema op = (ObjectSchema) inner;
229-
if (op.getProperties() != null && op.getProperties().size() > 0) {
230-
String innerModelName = resolveModelName(op.getTitle(), modelName + "_inner");
231-
Schema innerModel = modelFromProperty(op, innerModelName);
222+
if (isObjectSchema(inner)) {
223+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
224+
String innerModelName = resolveModelName(inner.getTitle(), modelName + "_inner");
225+
Schema innerModel = createModelFromProperty(inner, innerModelName);
232226
String existing = matchGenerated(innerModel);
233227
if (existing == null) {
234228
openAPI.getComponents().addSchemas(innerModelName, innerModel);
@@ -328,13 +322,10 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
328322
Map<String, Schema> modelsToAdd = new HashMap<>();
329323
for (String key : properties.keySet()) {
330324
Schema property = properties.get(key);
331-
if (property instanceof ObjectSchema && ((ObjectSchema) property).getProperties() != null
332-
&& ((ObjectSchema) property).getProperties().size() > 0) {
333-
334-
ObjectSchema op = (ObjectSchema) property;
325+
if (isObjectSchema(property) && property.getProperties() != null && property.getProperties().size() > 0) {
335326

336-
String modelName = resolveModelName(op.getTitle(), path + "_" + key);
337-
Schema model = modelFromProperty(op, modelName);
327+
String modelName = resolveModelName(property.getTitle(), path + "_" + key);
328+
Schema model = createModelFromProperty(property, modelName);
338329

339330
String existing = matchGenerated(model);
340331

@@ -350,12 +341,11 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
350341
ArraySchema ap = (ArraySchema) property;
351342
Schema inner = ap.getItems();
352343

353-
if (inner instanceof ObjectSchema) {
354-
ObjectSchema op = (ObjectSchema) inner;
355-
if (op.getProperties() != null && op.getProperties().size() > 0) {
356-
flattenProperties(op.getProperties(), path);
357-
String modelName = resolveModelName(op.getTitle(), path + "_" + key);
358-
Schema innerModel = modelFromProperty(op, modelName);
344+
if (isObjectSchema(inner)) {
345+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
346+
flattenProperties(inner.getProperties(), path);
347+
String modelName = resolveModelName(inner.getTitle(), path + "_" + key);
348+
Schema innerModel = createModelFromProperty(inner, modelName);
359349
String existing = matchGenerated(innerModel);
360350
if (existing != null) {
361351
ap.setItems(new Schema().$ref(existing));
@@ -369,12 +359,11 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
369359
} else if (property.getAdditionalProperties() != null && property.getAdditionalProperties() instanceof Schema) {
370360
Schema inner = (Schema) property.getAdditionalProperties();
371361

372-
if (inner instanceof ObjectSchema) {
373-
ObjectSchema op = (ObjectSchema) inner;
374-
if (op.getProperties() != null && op.getProperties().size() > 0) {
375-
flattenProperties(op.getProperties(), path);
376-
String modelName = resolveModelName(op.getTitle(), path + "_" + key);
377-
Schema innerModel = modelFromProperty(op, modelName);
362+
if (isObjectSchema(inner)) {
363+
if (inner.getProperties() != null && inner.getProperties().size() > 0) {
364+
flattenProperties(inner.getProperties(), path);
365+
String modelName = resolveModelName(inner.getTitle(), path + "_" + key);
366+
Schema innerModel = createModelFromProperty(inner, modelName);
378367
String existing = matchGenerated(innerModel);
379368
if (existing != null) {
380369
property.setAdditionalProperties(new Schema().$ref(existing));
@@ -420,26 +409,26 @@ public Schema modelFromProperty(ArraySchema object, @SuppressWarnings("unused")
420409
return null;
421410
}
422411

423-
public Schema modelFromProperty(ObjectSchema object, String path) {
424-
String description = object.getDescription();
412+
public Schema createModelFromProperty(Schema schema, String path) {
413+
String description = schema.getDescription();
425414
String example = null;
426-
List<String> requiredList = object.getRequired();
415+
List<String> requiredList = schema.getRequired();
427416

428417

429-
Object obj = object.getExample();
418+
Object obj = schema.getExample();
430419
if (obj != null) {
431420
example = obj.toString();
432421
}
433-
String name = object.getName();
434-
XML xml = object.getXml();
435-
Map<String, Schema> properties = object.getProperties();
422+
String name = schema.getName();
423+
XML xml = schema.getXml();
424+
Map<String, Schema> properties = schema.getProperties();
436425

437426
Schema model = new Schema();//TODO Verify this!
438427
model.setDescription(description);
439428
model.setExample(example);
440429
model.setName(name);
441430
model.setXml(xml);
442-
model.setType(object.getType());
431+
model.setType(schema.getType());
443432
model.setRequired(requiredList);
444433

445434
if (properties != null) {
@@ -507,4 +496,10 @@ public void setSkipMatches(boolean skipMatches) {
507496
this.skipMatches = skipMatches;
508497
}
509498

510-
}
499+
private boolean isObjectSchema(Schema schema) {
500+
return schema instanceof ObjectSchema
501+
|| "object".equalsIgnoreCase(schema.getType())
502+
|| (schema.getType() == null && schema.getProperties() != null && !schema.getProperties().isEmpty());
503+
504+
}
505+
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1337,4 +1337,17 @@ public void testArbitraryObjectModelWithArrayInlineWithTitle() {
13371337
ObjectSchema op = (ObjectSchema) inlineProp;
13381338
assertNull(op.getProperties());
13391339
}
1340-
}
1340+
1341+
1342+
@Test(description = "https://github.com/swagger-api/swagger-parser/issues/1200")
1343+
public void testInlineItemsSchema() throws Exception {
1344+
ParseOptions options = new ParseOptions();
1345+
options.setFlatten(true);
1346+
OpenAPI openAPI = new OpenAPIV3Parser().read("flatten.json",null, options);
1347+
1348+
System.out.println(openAPI);
1349+
1350+
assertNotNull(openAPI);
1351+
assertNotNull(openAPI.getComponents().getSchemas().get("inline_response_200"));
1352+
}
1353+
}

modules/swagger-parser-v3/src/test/resources/flatten.json

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,59 @@
11
{
22
"openapi" : "3.0.1",
3+
"paths" : {
4+
"/employees" : {
5+
"get" : {
6+
"description" : "Obtain information about employees from HR database",
7+
"parameters" : [ {
8+
"name" : "bodylimit",
9+
"in" : "query",
10+
"schema" : {
11+
"type" : "integer",
12+
"minimum" : 10,
13+
"maximum" : 20,
14+
"example" : 8
15+
}
16+
}, {
17+
"name" : "pagelimit",
18+
"in" : "query",
19+
"schema" : {
20+
"type" : "integer",
21+
"minimum" : 1,
22+
"maximum" : 5,
23+
"example" : 2
24+
}
25+
} ],
26+
"responses" : {
27+
"200" : {
28+
"description" : "successully returned number of employees",
29+
"content" : {
30+
"application/json" : {
31+
"schema" : {
32+
"type" : "array",
33+
"items" : {
34+
"properties" : {
35+
"id" : {
36+
"type" : "integer",
37+
"example" : 4
38+
},
39+
"employee name" : {
40+
"type" : "string",
41+
"example" : "vijay"
42+
},
43+
"employee title" : {
44+
"type" : "string",
45+
"example" : "QA"
46+
}
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
}
56+
},
357
"components" : {
458
"schemas" : {
559
"ReturnInformation": {
@@ -47,4 +101,4 @@
47101
}
48102
}
49103
}
50-
}
104+
}

0 commit comments

Comments
 (0)