/** * Load a JSON tree from the given URL (unless preloaded tree is provided), * register the content, and maybe rewrite "simple" refs to local object refs */ private Content loadInternal(URL url, JsonNode tree, boolean rewriteSimpleRefs) { String urlString = cacheUrl(url); Content content = contentItems.get(urlString); if (content == null) { content = new ContentLoader(this).load(url, tree, rewriteSimpleRefs); contentItems.put(urlString, content); } return content; }
/** * Recursive method to search out and handle all references in this loaded spec */ private JsonNode assembleNode(JsonNode node, Reference base, Set<Reference> visited) { if (Util.isRef(node)) { Reference ref = Reference.fromNode(node, base, contentManager.getModelVersion()); return assembleRef(ref, base, visited); } else { assembleObjectProperties(node, base, visited); assembleArrayElements(node, base, visited); return node; } }
private Content assemble(JsonNode tree, Reference base) { Set<Reference> visited = new HashSet<Reference>(); JsonNode assembly = assembleNode(tree, base, visited); return Content.getContentItem(base, assembly); }
public Content load(URL url, JsonNode tree, boolean rewriteSimpleRefs) { this.base = new Reference(url, contentManager.getModelVersion()); if (tree == null) { Content content = docLoader.load(url); if (content.isValid()) { tree = content.getTree(); } else { return content; } } if (rewriteSimpleRefs) { SimpleRefFixer.fixSimpleRefs(tree); } return assemble(tree, base); }
/** * If this is an object node, handle any refs among its property values */ private void assembleObjectProperties(JsonNode node, Reference base, Set<Reference> visited) { if (node instanceof ObjectNode) { ObjectNode objectNode = (ObjectNode) node; for (Entry<String, JsonNode> field : Util.iterable(objectNode.fields())) { field.setValue(assembleNode(field.getValue(), base, visited)); } } }
/** * If this is an array node, handle any refs among its element values */ private void assembleArrayElements(JsonNode node, Reference base, Set<Reference> visited) { if (node instanceof ArrayNode) { ArrayNode arrayNode = (ArrayNode) node; for (int i = 0; i < node.size(); i++) { arrayNode.set(i, assembleNode(arrayNode.get(i), base, visited)); } } } }
} else { tree = tree.deepCopy(); tree = assembleNode(tree, ref, visited);