Reference current = this; while (valid == null) { String normalized = current.getNormalizedRef(); if (visited.contains(normalized)) { return failResolve(null, new ReferenceCycleException(this, current)); } else { visited.add(normalized); currentJson = current.getManager().loadDoc(); } catch (IOException e) { return failResolve("Failed to load referenced documnet", e); if (isReferenceNode(currentJson)) { current = manager.getReference(currentJson); if (current.isInvalid(false)) { return failResolve("Invalid reference in reference chain", current.getInvalidReason()); failResolve("Referenced node not present in JSON document"); return isValid(false);
public static void checkReference(Reference ref, ValidationResults results, Overlay<?> context) { if (ref.isInvalid()) { results.addError(msg(BadRef, ref.getRefString(), ref.getInvalidReason()), context); } } }
/* package */JsonOverlay<V> getOverlay() { if (!reference.isResolved()) { reference.resolve(); } if (target == null && reference.isValid()) { ReferenceRegistry registry = refMgr.getRegistry(); { @SuppressWarnings("unchecked") JsonOverlay<V> castTarget = (JsonOverlay<V>) registry.getOverlay(reference.getNormalizedRef(), factory.getSignature()); this.target = castTarget; } if (target == null) { @SuppressWarnings("unchecked") JsonOverlay<V> castTarget = (JsonOverlay<V>) registry.getOverlay(reference.getJson(), factory.getSignature()); this.target = castTarget; } if (target == null) { target = factory.create(reference.getJson(), null, reference.getManager()); target._setCreatingRef(reference); refMgr.getRegistry().register(reference.getNormalizedRef(), factory.getSignature(), target); } } return target; }
/* package */ JsonNode _toJson(SerializationOptions options) { if (_isReference()) { if (!options.isFollowRefs() || refOverlay._getReference().isInvalid()) { ObjectNode obj = _jsonObject(); obj.put("$ref", refOverlay._getReference().getRefString()); return obj; } else { return refOverlay.getOverlay()._toJson(options); } } else { return _toJsonInternal(options); } }
public boolean isInvalid() { return isInvalid(true); }
/* package */String _getJsonReference(boolean forRef) { if (creatingRef != null) { return creatingRef.getNormalizedRef(); } if (_isReference() && refOverlay._getReference().isValid() && !forRef) { return refOverlay.getOverlay()._getJsonReference(false); } if (parent != null) { String ref = parent._getJsonReference(); return ref + (ref.contains("#") ? "" : "#") + "/" + pathInParent; } else { return "#"; } }
protected JsonOverlay(JsonNode json, JsonOverlay<?> parent, OverlayFactory<V> factory, ReferenceManager refMgr) { this.json = json; if (Reference.isReferenceNode(json)) { this.refOverlay = new RefOverlay<V>(json, parent, factory, refMgr); } else { this.value = _fromJson(json); } this.parent = parent; this.factory = factory; this.refMgr = refMgr; this.present = !json.isMissingNode(); }
private boolean failResolve(String msg) { return failResolve(msg, null); }
public Reference getReference(String refString) { try { URL url = new URL(docUrl, refString); String fragment = url.getRef(); ReferenceManager manager = getManagerFor(url); return new Reference(refString, fragment, normalize(url, false).toString(), manager); } catch (MalformedURLException e) { return new Reference(refString, new ResolutionException(null, e), null); } }
/* package */String _getPathFromRoot() { if (parent != null) { if (pathInParent.isEmpty()) { return parent._getPathFromRoot(); } else { String parentPath = parent._getPathFromRoot(); return parentPath != null ? parentPath + "/" + encodePointerPart(pathInParent) : null; } } else if (creatingRef != null) { return creatingRef.getFragment(); } else { return null; } }
private JsonOverlay<V> thisOrRefTarget() { if (refOverlay == null || refOverlay._getReference().isInvalid()) { return this; } else { return refOverlay.getOverlay(); } }
@SuppressWarnings("unchecked") public JsonOverlay<V> create(JsonNode json, JsonOverlay<?> parent, ReferenceManager refMgr) { JsonOverlay<V> overlay; if (Reference.isReferenceNode(json)) { Reference reference = refMgr.getReference(json); RefOverlay<V> refOverlay = new RefOverlay<V>(reference, null, this, refMgr);
public static void checkReference(Reference ref, ValidationResults results, Overlay<?> context) { if (ref.isInvalid()) { results.addError(msg(BadRef, ref.getRefString(), ref.getInvalidReason()), context); } } }