diff --git a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java index 1b410818b..3df3c1ef4 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java @@ -27,8 +27,11 @@ import org.openapitools.openapidiff.core.model.deferred.RecursiveSchemaSet; import org.openapitools.openapidiff.core.utils.RefPointer; import org.openapitools.openapidiff.core.utils.RefType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SchemaDiff { + private static final Logger logger = LoggerFactory.getLogger(SchemaDiff.class); private static final RefPointer> refPointer = new RefPointer<>(RefType.SCHEMAS); private static final Map, Class> @@ -96,7 +99,14 @@ protected static Schema resolveComposedSchema( updatedVisitedRefs.add(composed.get$ref()); composed = refPointer.resolveRef(components, composed, composed.get$ref()); composed = resolveComposedSchema(components, composed, updatedVisitedRefs); - schema = addSchema(schema, composed); + if (composed.getProperties() != null + && composed.getProperties().containsValue(composedSchema)) { + logger.warn( + "Circular reference detected in composed (allOf/oneOf/anyOf) schema: {}", + composed.get$ref()); + } else { + addSchema(schema, composed); + } } } composedSchema.setAllOf(null); diff --git a/core/src/main/java/org/openapitools/openapidiff/core/model/deferred/RecursiveSchemaSet.java b/core/src/main/java/org/openapitools/openapidiff/core/model/deferred/RecursiveSchemaSet.java index 079139db2..a12816ee7 100644 --- a/core/src/main/java/org/openapitools/openapidiff/core/model/deferred/RecursiveSchemaSet.java +++ b/core/src/main/java/org/openapitools/openapidiff/core/model/deferred/RecursiveSchemaSet.java @@ -13,6 +13,6 @@ public boolean contains(CacheKey key) { public void put(CacheKey key) { leftKeys.add(key.getLeft()); - leftKeys.add(key.getRight()); + rightKeys.add(key.getRight()); } } diff --git a/core/src/test/resources/recursive_model_1.yaml b/core/src/test/resources/recursive_model_1.yaml index 24f545186..88742b135 100644 --- a/core/src/test/resources/recursive_model_1.yaml +++ b/core/src/test/resources/recursive_model_1.yaml @@ -25,6 +25,17 @@ components: type: string message2: type: string + recursiveDirect: + $ref: '#/components/schemas/B' + recursiveAllOf: + allOf: + - $ref: '#/components/schemas/B' + recursiveOneOf: + oneOf: + - $ref: '#/components/schemas/B' + recursiveAnyOf: + anyOf: + - $ref: '#/components/schemas/B' details: type: array items: