Skip to content

Commit 3b9911c

Browse files
committed
fix: mergeAllOf was applied twice in the root object
closes #36
1 parent e003528 commit 3b9911c

6 files changed

Lines changed: 73 additions & 17 deletions

File tree

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

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,7 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
166166
Map<String, Object> originalAllOfRoot = refs.jsonContext.read(jsonPath);
167167

168168
AllOfObject allOfObject = new AllOfObject();
169-
merge(allOfObject, originalAllOfRoot);
170-
for (int i = 0; i < allOf.size(); i++) {
171-
if(allOf.get(i) instanceof Map) {
172-
Map<String, Object> item = (Map<String, Object>) allOf.get(i);
173-
merge(allOfObject, item);
174-
} else {
175-
throw new RuntimeException("Could not understand allOf: " + allOf.get(i));
176-
}
177-
}
169+
mergeAllOf(allOfObject, originalAllOfRoot);
178170

179171
try {
180172
var isRoot = "$".equals(jsonPath);
@@ -216,20 +208,20 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
216208
}
217209
}
218210

219-
private void merge(AllOfObject allOfObject, List<Map<String, Object>> items) {
211+
private void mergeAllOf(AllOfObject allOfObject, List<Map<String, Object>> items) {
220212
for (Map<String, Object> innerItem : items) {
221-
merge(allOfObject, innerItem);
213+
mergeAllOf(allOfObject, innerItem);
222214
}
223215
}
224216

225-
private void merge(AllOfObject allOfObject, Map<String, Object> item) {
217+
private void mergeAllOf(AllOfObject allOfObject, Map<String, Object> item) {
226218
if(item.keySet().size() == 1 && item.containsKey("allOf")) {
227219
List<Map<String, Object>> items = (List) item.get("allOf");
228-
merge(allOfObject, items);
220+
mergeAllOf(allOfObject, items);
229221
} else {
230222
for (Map.Entry<String, Object> entry : item.entrySet()) {
231223
if(entry.getKey().equals("allOf")) {
232-
merge(allOfObject, (List) item.get("allOf"));
224+
mergeAllOf(allOfObject, (List) item.get("allOf"));
233225
} else {
234226
allOfObject.allOf.put(entry.getKey(), entry.getValue());
235227
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.zenwave360.jsonrefparser;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import java.io.File;
7+
import java.util.Collection;
8+
9+
public class GH36Test {
10+
11+
@Test
12+
public void test() throws Exception {
13+
$RefParser refParser = new $RefParser(new File("src/test/resources/GH-36/root.json"));
14+
15+
$Refs refs = refParser.parse().dereference().mergeAllOf().getRefs();
16+
var schema = refs.schema();
17+
Collection<String> required = (Collection<String>) schema.get("required");
18+
Assert.assertEquals(2, required.size());
19+
Assert.assertTrue(required.contains("ingressDomain"));
20+
Assert.assertTrue(required.contains("a"));
21+
}
22+
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package io.zenwave360.jsonrefparser;
22

3+
import org.junit.Assert;
34
import org.junit.Test;
45

56
import java.io.File;
7+
import java.util.Map;
68

79
import com.fasterxml.jackson.databind.ObjectMapper;
810
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
@@ -18,7 +20,17 @@ public void testMergeAllOfAtRoot() throws Exception {
1820
File file = new File("src/test/resources/gh-32-mergeAllOf-root.yml");
1921
$RefParser parser = new $RefParser(file).parse();
2022
$Refs refs = parser.dereference().mergeAllOf().getRefs();
23+
24+
// Verify allOf is removed
25+
Assert.assertFalse(refs.schema().containsKey("allOf"));
26+
27+
// Verify properties from both Core and Extension are merged
2128
assertTrue(refs.schema().containsKey("properties"));
22-
// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
29+
var properties = (Map) refs.schema().get("properties");
30+
Assert.assertEquals(2, properties.size());
31+
Assert.assertTrue(properties.containsKey("prop1"));
32+
Assert.assertTrue(properties.containsKey("prop2"));
33+
34+
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
2335
}
2436
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,16 @@ public void testDereferenceAndMergeChainedAllOf() throws IOException {
266266
File file = new File("src/test/resources/asyncapi/car-engine_chained_allOf.yml");
267267
$RefParser parser = new $RefParser(file).parse();
268268
$Refs refs = parser.dereference().mergeAllOf().getRefs();
269-
// Assert.assertFalse(refs.circular);
270-
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
269+
271270
assertNoAllOfs(refs.schema());
271+
272+
// Verify Car has all properties from Base, Engine, and Car
273+
var carProperties = (Map) refs.get("$.components.schemas.Car.properties");
274+
Assert.assertTrue(carProperties.containsKey("reference")); // from Base
275+
Assert.assertTrue(carProperties.containsKey("mileage")); // from Engine
276+
Assert.assertTrue(carProperties.containsKey("make")); // from Car
277+
278+
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
272279
}
273280

274281
@Test
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema#",
3+
"type": "object",
4+
"properties": {
5+
"ingressDomain": {
6+
"type": "string"
7+
}
8+
},
9+
"required": ["ingressDomain"]
10+
}

src/test/resources/GH-36/root.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"$schema": "https://json-schema.org/draft-07/schema#",
3+
"type": "object",
4+
"allOf": [
5+
{ "$ref": "common.schema.json" }
6+
],
7+
"properties": {
8+
"a": {
9+
"type": "integer"
10+
}
11+
},
12+
"required": ["a" ]
13+
}

0 commit comments

Comments
 (0)