Skip to content

Commit 76860fe

Browse files
Handle recursive refs in ComposedSchema (allOf/oneOf/anyOf)
1 parent 19bdb61 commit 76860fe

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

core/src/main/java/org/openapitools/openapidiff/core/compare/SchemaDiff.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@
2727
import org.openapitools.openapidiff.core.model.deferred.RecursiveSchemaSet;
2828
import org.openapitools.openapidiff.core.utils.RefPointer;
2929
import org.openapitools.openapidiff.core.utils.RefType;
30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
3032

3133
public class SchemaDiff {
34+
private static final Logger logger = LoggerFactory.getLogger(SchemaDiff.class);
3235

3336
private static final RefPointer<Schema<?>> refPointer = new RefPointer<>(RefType.SCHEMAS);
3437
private static final Map<Class<? extends Schema>, Class<? extends SchemaDiffResult>>
@@ -96,7 +99,14 @@ protected static Schema<?> resolveComposedSchema(
9699
updatedVisitedRefs.add(composed.get$ref());
97100
composed = refPointer.resolveRef(components, composed, composed.get$ref());
98101
composed = resolveComposedSchema(components, composed, updatedVisitedRefs);
99-
schema = addSchema(schema, composed);
102+
if (composed.getProperties() != null
103+
&& composed.getProperties().containsValue(composedSchema)) {
104+
logger.warn(
105+
"Circular reference detected in composed (allOf/oneOf/anyOf) schema: {}",
106+
composed.get$ref());
107+
} else {
108+
addSchema(schema, composed);
109+
}
100110
}
101111
}
102112
composedSchema.setAllOf(null);

core/src/main/java/org/openapitools/openapidiff/core/model/deferred/RecursiveSchemaSet.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ public boolean contains(CacheKey key) {
1313

1414
public void put(CacheKey key) {
1515
leftKeys.add(key.getLeft());
16-
leftKeys.add(key.getRight());
16+
rightKeys.add(key.getRight());
1717
}
1818
}

core/src/test/resources/recursive_model_1.yaml

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ components:
2525
type: string
2626
message2:
2727
type: string
28+
recursiveDirect:
29+
$ref: '#/components/schemas/B'
30+
recursiveAllOf:
31+
allOf:
32+
- $ref: '#/components/schemas/B'
33+
recursiveOneOf:
34+
oneOf:
35+
- $ref: '#/components/schemas/B'
36+
recursiveAnyOf:
37+
anyOf:
38+
- $ref: '#/components/schemas/B'
2839
details:
2940
type: array
3041
items:

0 commit comments

Comments
 (0)