Skip to content

Commit badd997

Browse files
committed
fix: mergeAllOf at the root of the document
closes: #32
1 parent 97e6a37 commit badd997

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,20 +177,31 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
177177
}
178178

179179
try {
180+
var isRoot = "$".equals(jsonPath);
180181
var mergedAllOfObject = allOfObject.buildAllOfObject();
181-
$Ref originalRef = refs.getOriginalRef(originalAllOfRoot);
182+
$Ref originalRef = isRoot? $Ref.of("", uri) : refs.getOriginalRef(originalAllOfRoot);
182183
if (originalRef != null) {
183184
refs.saveOriginalRef(originalRef, mergedAllOfObject);
184185
}
185-
refs.jsonContext.set(jsonPath, mergedAllOfObject);
186+
if (isRoot) {
187+
var root = refs.jsonContext.json();
188+
if(root instanceof Map) {
189+
((Map) root).remove("allOf");
190+
((Map) root).putAll(mergedAllOfObject);
191+
} else {
192+
throw new RuntimeException("Could not understand root: " + root);
193+
}
194+
} else {
195+
refs.jsonContext.set(jsonPath, mergedAllOfObject);
196+
}
186197
refs.saveOriginalAllOf(mergedAllOfObject, allOf);
187198
} catch (Exception e){
188199
log.error("Error setting jsonPath:{} in file:{}", jsonPath, currentFileURL, e);
189200
throw e;
190201
}
191202
} else if(value instanceof Map) {
192-
// visit
193-
((Map<String, Object>) value).entrySet().forEach(e -> {
203+
// visit - use ArrayList to avoid ConcurrentModificationException
204+
new ArrayList<>(((Map<String, Object>) value).entrySet()).forEach(e -> {
194205
mergeAllOf(e.getValue(), ArrayUtils.add(paths, e.getKey()), currentFileURL);
195206
});
196207
} else if(value instanceof List) {
@@ -257,6 +268,7 @@ private String indent() {
257268
return StringUtils.join(indent, "");
258269
}
259270
private void dereference(ExtendedJsonContext jsonContext, Object value, String[] paths, URI currentFileURL) {
271+
// var $id = jsonContext.read("$['$id']");
260272
var visitedNodeRef = String.format("%s%s", currentFileURL, jsonPointer(paths));
261273
log.trace("{}visiting {}", indent(), visitedNodeRef);
262274

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.zenwave360.jsonrefparser;
2+
3+
import org.junit.Test;
4+
5+
import java.io.File;
6+
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
9+
10+
import static org.junit.Assert.assertTrue;
11+
12+
public class Gh32MergeAllOfAtRootTest {
13+
14+
private ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
15+
16+
@Test
17+
public void testMergeAllOfAtRoot() throws Exception {
18+
File file = new File("src/test/resources/gh-32-mergeAllOf-root.yml");
19+
$RefParser parser = new $RefParser(file).parse();
20+
$Refs refs = parser.dereference().mergeAllOf().getRefs();
21+
assertTrue(refs.schema().containsKey("properties"));
22+
// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(refs.schema()));
23+
}
24+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
$schema: https://json-schema.org/draft-07/schema
2+
$id: urn:schema:example:1.0.0
3+
title: Example
4+
type: object
5+
allOf:
6+
- $ref: "#/definitions/Core"
7+
- $ref: "#/definitions/Extension"
8+
definitions:
9+
Core:
10+
type: object
11+
properties:
12+
prop1:
13+
type: string
14+
Extension:
15+
type: object
16+
properties:
17+
prop2:
18+
type: string

0 commit comments

Comments
 (0)