Skip to content

Commit f850379

Browse files
committed
fixes mergeAllOf when circular references
1 parent 9b8a322 commit f850379

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/main/java/io/zenwave360/jsonrefparser/$RefParser.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,26 @@ public class $RefParser {
126126

127127
public $RefParser dereference() {
128128
this.refs.addPath(uri);
129+
this.visited.clear();
129130
dereference(refs.jsonContext, refs.schema(), new String[0], uri);
130131
return this;
131132
}
132133

133134
public $RefParser mergeAllOf() {
134135
this.refs.addPath(uri);
136+
this.visited.clear();
135137
mergeAllOf(refs.schema(), new String[0], uri);
136138
return this;
137139
}
138140

139141
private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
142+
var visitedNodeRef = String.format("%s%s", currentFileURL.toString(), jsonPointer(paths));
143+
log.trace("{}visiting {}", indent(), visitedNodeRef);
144+
if(visited.contains(value)) {
145+
log.trace("{}skipping visited {}", indent(), visitedNodeRef);
146+
return;
147+
}
148+
visited.add(value);
140149
if(paths.length > 0 && "allOf".equals(paths[paths.length -1])) {
141150
List allOf = (List) value;
142151
List<String> required = new ArrayList<>();
@@ -185,7 +194,7 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
185194
}
186195
}
187196

188-
private Set<String> visited = new HashSet<>();
197+
private List<Object> visited = new ArrayList<>();
189198
private List<String> indent = new ArrayList<>();
190199
private String indent() {
191200
return StringUtils.join(indent, "");

src/test/java/io/zenwave360/jsonrefparser/ParserTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
99
import io.zenwave360.jsonrefparser.resolver.HttpResolver;
1010
import org.junit.Assert;
11+
import org.junit.Ignore;
1112
import org.junit.Test;
1213

1314
import java.io.File;
@@ -269,4 +270,25 @@ public void testDereferenceRecursiveSimplest() throws IOException {
269270
// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
270271
// assertNoRefs(refs.schema());
271272
}
273+
274+
@Test
275+
public void testMergeAllOfRecursive() throws IOException {
276+
File file = new File("src/test/resources/asyncapi/orders-model.yml");
277+
$RefParser parser = new $RefParser(file).parse();
278+
$Refs refs = parser.dereference().mergeAllOf().getRefs();
279+
// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
280+
// assertNoRefs(refs.schema());
281+
}
282+
283+
@Test
284+
@Ignore
285+
public void testDetectCircularRecursive() throws IOException {
286+
File file = new File("src/test/resources/asyncapi/orders-model.yml");
287+
$RefParser parser = new $RefParser(file).parse();
288+
$Refs refs = parser.dereference().getRefs();
289+
Assert.assertTrue(refs.circular);
290+
// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
291+
// assertNoRefs(refs.schema());
292+
}
293+
272294
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
asyncapi: 2.4.0
2+
3+
components:
4+
schemas:
5+
CustomerOrder:
6+
type: "object"
7+
x-business-entity: "CustomerOrder"
8+
properties:
9+
orderedItems:
10+
type: "array"
11+
items:
12+
$ref: "#/components/schemas/OrderedItem"
13+
OrderedItem:
14+
type: "object"
15+
x-business-entity: "OrderedItem"
16+
properties:
17+
customerOrders:
18+
type: "array"
19+
items:
20+
$ref: "#/components/schemas/CustomerOrder"

0 commit comments

Comments
 (0)