1
1
package io .swagger .v3 .parser .util ;
2
2
3
+ import io .swagger .v3 .oas .models .Components ;
3
4
import io .swagger .v3 .oas .models .OpenAPI ;
4
5
import io .swagger .v3 .oas .models .Operation ;
5
6
import io .swagger .v3 .oas .models .PathItem ;
7
+ import io .swagger .v3 .oas .models .Paths ;
6
8
import io .swagger .v3 .oas .models .callbacks .Callback ;
7
9
import io .swagger .v3 .oas .models .examples .Example ;
8
10
import io .swagger .v3 .oas .models .headers .Header ;
19
21
import io .swagger .v3 .parser .models .RefFormat ;
20
22
import org .slf4j .Logger ;
21
23
import org .slf4j .LoggerFactory ;
22
-
23
24
import java .util .ArrayList ;
24
25
import java .util .HashMap ;
25
26
import java .util .HashSet ;
@@ -38,6 +39,8 @@ public class ResolverFully {
38
39
39
40
private boolean aggregateCombinators ;
40
41
42
+
43
+
41
44
public ResolverFully () {
42
45
this (true );
43
46
}
@@ -53,52 +56,54 @@ public ResolverFully(boolean aggregateCombinators) {
53
56
private Map <String , RequestBody > requestBodies ;
54
57
private Map <String , Header > headers ;
55
58
private Map <String , Link > links ;
59
+ private Map <String , Schema > resolvedProperties = new HashMap <>();
56
60
57
61
public void resolveFully (OpenAPI openAPI ) {
58
- if (openAPI .getComponents () != null && openAPI .getComponents ().getRequestBodies () != null ) {
59
- requestBodies = openAPI .getComponents ().getRequestBodies ();
62
+ Components components = openAPI .getComponents ();
63
+ if (components != null && components .getRequestBodies () != null ) {
64
+ requestBodies = components .getRequestBodies ();
60
65
if (requestBodies == null ) {
61
66
requestBodies = new HashMap <>();
62
67
}
63
68
}
64
69
65
- if (openAPI . getComponents () != null && openAPI . getComponents () .getSchemas () != null ) {
66
- schemas = openAPI . getComponents () .getSchemas ();
70
+ if (components != null && components .getSchemas () != null ) {
71
+ schemas = components .getSchemas ();
67
72
if (schemas == null ) {
68
73
schemas = new HashMap <>();
69
74
}
70
75
}
71
76
72
- if (openAPI . getComponents () != null && openAPI . getComponents () .getExamples () != null ) {
73
- examples = openAPI . getComponents () .getExamples ();
77
+ if (components != null && components .getExamples () != null ) {
78
+ examples = components .getExamples ();
74
79
if (examples == null ) {
75
80
examples = new HashMap <>();
76
81
}
77
82
}
78
83
79
- if (openAPI . getComponents () != null && openAPI . getComponents () .getHeaders () != null ) {
80
- headers = openAPI . getComponents () .getHeaders ();
84
+ if (components != null && components .getHeaders () != null ) {
85
+ headers = components .getHeaders ();
81
86
if (headers == null ) {
82
87
headers = new HashMap <>();
83
88
}
84
89
}
85
90
86
- if (openAPI . getComponents () != null && openAPI . getComponents () .getParameters () != null ) {
87
- parameters = openAPI . getComponents () .getParameters ();
91
+ if (components != null && components .getParameters () != null ) {
92
+ parameters = components .getParameters ();
88
93
if (parameters == null ) {
89
94
parameters = new HashMap <>();
90
95
}
91
96
}
92
- if (openAPI . getComponents () != null && openAPI . getComponents () .getLinks () != null ) {
93
- links = openAPI . getComponents () .getLinks ();
97
+ if (components != null && components .getLinks () != null ) {
98
+ links = components .getLinks ();
94
99
if (links == null ) {
95
100
links = new HashMap <>();
96
101
}
97
102
}
98
-
99
- if (openAPI . getPaths () != null ) {
100
- for (String pathname : openAPI . getPaths () .keySet ()) {
101
- PathItem pathItem = openAPI . getPaths () .get (pathname );
103
+ Paths paths = openAPI . getPaths ();
104
+ if (paths != null ) {
105
+ for (String pathname : paths .keySet ()) {
106
+ PathItem pathItem = paths .get (pathname );
102
107
resolvePath (pathItem );
103
108
}
104
109
}
@@ -262,21 +267,24 @@ public Schema resolveSchema(Schema schema) {
262
267
String ref = schema .get$ref ();
263
268
ref = ref .substring (ref .lastIndexOf ("/" ) + 1 );
264
269
Schema resolved = schemas .get (ref );
265
- if (resolved == null ) {
266
- LOGGER .error ("unresolved model " + ref );
267
- return schema ;
268
- }
269
- if (this .resolvedModels .containsKey (ref )) {
270
- LOGGER .debug ("avoiding infinite loop" );
271
- return this .resolvedModels .get (ref );
272
- }
273
- this .resolvedModels .put (ref , schema );
274
270
275
- Schema model = resolveSchema ( resolved );
271
+ if ( resolved != null ) {
276
272
277
- // if we make it without a resolution loop, we can update the reference
278
- this .resolvedModels .put (ref , model );
279
- return model ;
273
+ if (this .resolvedModels .containsKey (ref )) {
274
+ LOGGER .debug ("avoiding infinite loop" );
275
+ return resolvedModels .get (ref );
276
+ }
277
+ resolvedModels .put (ref , schema );
278
+ Schema model = resolveSchema (resolved );
279
+
280
+ // if we make it without a resolution loop, we can update the reference
281
+ resolvedModels .put (ref , model );
282
+
283
+ return model ;
284
+
285
+ }else {
286
+ return schema ;
287
+ }
280
288
}
281
289
282
290
if (schema instanceof ArraySchema ) {
@@ -297,8 +305,14 @@ public Schema resolveSchema(Schema schema) {
297
305
Schema innerProperty = obj .getProperties ().get (propertyName );
298
306
// reference check
299
307
if (schema != innerProperty ) {
300
- Schema resolved = resolveSchema (innerProperty );
301
- updated .put (propertyName , resolved );
308
+ if (resolvedProperties .get (propertyName ) == null && resolvedProperties .get (propertyName ) != innerProperty ) {
309
+ LOGGER .debug ("avoiding infinite loop" );
310
+ Schema resolved = resolveSchema (innerProperty );
311
+ updated .put (propertyName , resolved );
312
+ resolvedProperties .put (propertyName , resolved );
313
+ }else {
314
+ updated .put (propertyName , resolvedProperties .get (propertyName ));
315
+ }
302
316
}
303
317
}
304
318
obj .setProperties (updated );
@@ -331,7 +345,14 @@ public Schema resolveSchema(Schema schema) {
331
345
if (resolved .getProperties () != null ) {
332
346
for (String key : properties .keySet ()) {
333
347
Schema prop = (Schema ) resolved .getProperties ().get (key );
334
- model .addProperties (key , resolveSchema (prop ));
348
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
349
+ LOGGER .debug ("avoiding infinite loop" );
350
+ Schema resolvedProp = resolveSchema (prop );
351
+ model .addProperties (key ,resolvedProp );
352
+ resolvedProperties .put (key , resolvedProp );
353
+ }else {
354
+ model .addProperties (key ,resolvedProperties .get (key ));
355
+ }
335
356
}
336
357
if (resolved .getRequired () != null ) {
337
358
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -372,7 +393,14 @@ public Schema resolveSchema(Schema schema) {
372
393
if (resolved .getProperties () != null ) {
373
394
for (String key : properties .keySet ()) {
374
395
Schema prop = (Schema ) resolved .getProperties ().get (key );
375
- model .addProperties (key , resolveSchema (prop ));
396
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
397
+ LOGGER .debug ("avoiding infinite loop" );
398
+ Schema resolvedProp = resolveSchema (prop );
399
+ model .addProperties (key ,resolvedProp );
400
+ resolvedProperties .put (key , resolvedProp );
401
+ }else {
402
+ model .addProperties (key ,resolvedProperties .get (key ));
403
+ }
376
404
}
377
405
if (resolved .getRequired () != null ) {
378
406
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -414,7 +442,14 @@ public Schema resolveSchema(Schema schema) {
414
442
if (resolved .getProperties () != null ) {
415
443
for (String key : properties .keySet ()) {
416
444
Schema prop = (Schema ) resolved .getProperties ().get (key );
417
- model .addProperties (key , resolveSchema (prop ));
445
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
446
+ LOGGER .debug ("avoiding infinite loop" );
447
+ Schema resolvedProp = resolveSchema (prop );
448
+ model .addProperties (key ,resolvedProp );
449
+ resolvedProperties .put (key , resolvedProp );
450
+ }else {
451
+ model .addProperties (key ,resolvedProperties .get (key ));
452
+ }
418
453
}
419
454
if (resolved .getRequired () != null ) {
420
455
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -463,8 +498,14 @@ public Schema resolveSchema(Schema schema) {
463
498
Map <String , Schema > properties = model .getProperties ();
464
499
for (String propertyName : properties .keySet ()) {
465
500
Schema property = (Schema ) model .getProperties ().get (propertyName );
466
- Schema resolved = resolveSchema (property );
467
- updated .put (propertyName , resolved );
501
+ if (resolvedProperties .get (propertyName ) == null && resolvedProperties .get (propertyName ) != property ) {
502
+ LOGGER .debug ("avoiding infinite loop" );
503
+ Schema resolved = resolveSchema (property );
504
+ updated .put (propertyName , resolved );
505
+ resolvedProperties .put (propertyName , resolved );
506
+ }else {
507
+ updated .put (propertyName , resolvedProperties .get (propertyName ));
508
+ }
468
509
}
469
510
470
511
for (String key : updated .keySet ()) {
0 commit comments