19
19
import io .swagger .v3 .parser .models .RefFormat ;
20
20
import org .slf4j .Logger ;
21
21
import org .slf4j .LoggerFactory ;
22
-
23
22
import java .util .ArrayList ;
24
23
import java .util .HashMap ;
25
24
import java .util .HashSet ;
@@ -38,6 +37,8 @@ public class ResolverFully {
38
37
39
38
private boolean aggregateCombinators ;
40
39
40
+
41
+
41
42
public ResolverFully () {
42
43
this (true );
43
44
}
@@ -53,6 +54,7 @@ public ResolverFully(boolean aggregateCombinators) {
53
54
private Map <String , RequestBody > requestBodies ;
54
55
private Map <String , Header > headers ;
55
56
private Map <String , Link > links ;
57
+ private Map <String , Schema > resolvedProperties = new HashMap <>();
56
58
57
59
public void resolveFully (OpenAPI openAPI ) {
58
60
if (openAPI .getComponents () != null && openAPI .getComponents ().getRequestBodies () != null ) {
@@ -259,30 +261,43 @@ public Parameter resolveParameter(Parameter parameter){
259
261
260
262
public Schema resolveSchema (Schema schema ) {
261
263
if (schema .get$ref () != null ) {
264
+
262
265
String ref = schema .get$ref ();
263
266
ref = ref .substring (ref .lastIndexOf ("/" ) + 1 );
264
267
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
268
275
- Schema model = resolveSchema ( resolved );
269
+ if ( resolved != null ) {
276
270
277
- // if we make it without a resolution loop, we can update the reference
278
- this .resolvedModels .put (ref , model );
279
- return model ;
271
+ if (this .resolvedModels .containsKey (ref )) {
272
+ LOGGER .debug ("avoiding infinite loop" );
273
+ return resolvedModels .get (ref );
274
+ }
275
+ resolvedModels .put (ref , schema );
276
+ Schema model = resolveSchema (resolved );
277
+
278
+ // if we make it without a resolution loop, we can update the reference
279
+ resolvedModels .put (ref , model );
280
+
281
+
282
+ return model ;
283
+
284
+ }else {
285
+ return schema ;
286
+ }
280
287
}
281
288
282
289
if (schema instanceof ArraySchema ) {
283
290
ArraySchema arrayModel = (ArraySchema ) schema ;
284
291
if (arrayModel .getItems ().get$ref () != null ) {
285
- arrayModel .setItems (resolveSchema (arrayModel .getItems ()));
292
+ String ref = arrayModel .getItems ().get$ref ();
293
+ ref = ref .substring (ref .lastIndexOf ("/" ) + 1 );
294
+ if (resolvedModels .get (ref ) == null ) {
295
+ arrayModel .setItems (resolveSchema (arrayModel .getItems ()));
296
+ }else {
297
+ arrayModel .setItems (resolvedModels .get (ref ));
298
+ //validar que tan profundo estoy en la recursion para cortar con la asignacion de propiedades.
299
+ arrayModel .getItems ().set$ref (arrayModel .getItems ().get$ref ());
300
+ }
286
301
} else {
287
302
arrayModel .setItems (arrayModel .getItems ());
288
303
}
@@ -331,7 +346,14 @@ public Schema resolveSchema(Schema schema) {
331
346
if (resolved .getProperties () != null ) {
332
347
for (String key : properties .keySet ()) {
333
348
Schema prop = (Schema ) resolved .getProperties ().get (key );
334
- model .addProperties (key , resolveSchema (prop ));
349
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
350
+ LOGGER .debug ("avoiding infinite loop" );
351
+ Schema resolvedProp = resolveSchema (prop );
352
+ model .addProperties (key ,resolvedProp );
353
+ resolvedProperties .put (key , resolvedProp );
354
+ }else {
355
+ model .addProperties (key ,resolvedProperties .get (key ));
356
+ }
335
357
}
336
358
if (resolved .getRequired () != null ) {
337
359
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -372,7 +394,14 @@ public Schema resolveSchema(Schema schema) {
372
394
if (resolved .getProperties () != null ) {
373
395
for (String key : properties .keySet ()) {
374
396
Schema prop = (Schema ) resolved .getProperties ().get (key );
375
- model .addProperties (key , resolveSchema (prop ));
397
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
398
+ LOGGER .debug ("avoiding infinite loop" );
399
+ Schema resolvedProp = resolveSchema (prop );
400
+ model .addProperties (key ,resolvedProp );
401
+ resolvedProperties .put (key , resolvedProp );
402
+ }else {
403
+ model .addProperties (key ,resolvedProperties .get (key ));
404
+ }
376
405
}
377
406
if (resolved .getRequired () != null ) {
378
407
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -414,7 +443,14 @@ public Schema resolveSchema(Schema schema) {
414
443
if (resolved .getProperties () != null ) {
415
444
for (String key : properties .keySet ()) {
416
445
Schema prop = (Schema ) resolved .getProperties ().get (key );
417
- model .addProperties (key , resolveSchema (prop ));
446
+ if (resolvedProperties .get (key ) == null && resolvedProperties .get (key ) != prop ) {
447
+ LOGGER .debug ("avoiding infinite loop" );
448
+ Schema resolvedProp = resolveSchema (prop );
449
+ model .addProperties (key ,resolvedProp );
450
+ resolvedProperties .put (key , resolvedProp );
451
+ }else {
452
+ model .addProperties (key ,resolvedProperties .get (key ));
453
+ }
418
454
}
419
455
if (resolved .getRequired () != null ) {
420
456
for (int i = 0 ; i < resolved .getRequired ().size (); i ++) {
@@ -463,8 +499,15 @@ public Schema resolveSchema(Schema schema) {
463
499
Map <String , Schema > properties = model .getProperties ();
464
500
for (String propertyName : properties .keySet ()) {
465
501
Schema property = (Schema ) model .getProperties ().get (propertyName );
466
- Schema resolved = resolveSchema (property );
467
- updated .put (propertyName , resolved );
502
+ if (resolvedProperties .get (propertyName ) == null && resolvedProperties .get (propertyName ) != property ) {
503
+ LOGGER .debug ("avoiding infinite loop" );
504
+ Schema resolved = resolveSchema (property );
505
+ updated .put (propertyName , resolved );
506
+ resolvedProperties .put (propertyName , resolved );
507
+ }else {
508
+ updated .put (propertyName , resolvedProperties .get (propertyName ));
509
+
510
+ }
468
511
}
469
512
470
513
for (String key : updated .keySet ()) {
0 commit comments