From ea8c5fffe81e582f71bbed3794b4072b11e8215a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bence=20Er=C5=91s?= Date: Tue, 12 Feb 2019 22:21:08 +0100 Subject: [PATCH] fixing #270 and some code cleanup in ReferenceLookup --- .../json/schema/loader/ReferenceLookup.java | 31 +++++++++---------- .../schema/loader/ReferenceLookupTest.java | 6 ++++ .../jsonvalidator/ref-lookup-tests.json | 7 +++++ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java b/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java index e22222f79..c47108a51 100644 --- a/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java +++ b/core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java @@ -123,36 +123,25 @@ private Schema.Builder performQueryEvaluation(String mapKey, JsonPointerEvalu if (ls.pointerSchemas.containsKey(absolutePointer)) { return ls.pointerSchemas.get(absolutePointer); } - JsonValue rawInternalReferenced = pointerEvaluator.query().getQueryResult(); - ReferenceSchema.Builder refBuilder = ReferenceSchema.builder() - .refValue(mapKey); - ls.pointerSchemas.put(absolutePointer, refBuilder); - Schema referredSchema = new SchemaLoader(rawInternalReferenced.ls).load().build(); - refBuilder.build().setReferredSchema(referredSchema); - return refBuilder; + JsonValue referencedRawSchema = pointerEvaluator.query().getQueryResult(); + return createReferenceSchema(mapKey, absolutePointer, referencedRawSchema); } /** * Returns a schema builder instance after looking up the JSON pointer. */ Schema.Builder lookup(String relPointerString, JsonObject ctx) { - if (isSameDocumentRef(relPointerString)) { - return performQueryEvaluation(relPointerString, JsonPointerEvaluator.forDocument(ls.rootSchemaJson(), relPointerString)); - } String absPointerString = ReferenceResolver.resolve(ls.id, relPointerString).toString(); if (ls.pointerSchemas.containsKey(absPointerString)) { return ls.pointerSchemas.get(absPointerString); } JsonValue rawInternalReferenced = lookupObjById(ls.rootSchemaJson, absPointerString); if (rawInternalReferenced != null) { - ReferenceSchema.Builder refBuilder = ReferenceSchema.builder() - .refValue(relPointerString); - ls.pointerSchemas.put(absPointerString, refBuilder); - Schema referredSchema = new SchemaLoader(rawInternalReferenced.ls).load().build(); - refBuilder.build().setReferredSchema(referredSchema); - return refBuilder; + return createReferenceSchema(relPointerString, absPointerString, rawInternalReferenced); + } + if (isSameDocumentRef(relPointerString)) { + return performQueryEvaluation(relPointerString, JsonPointerEvaluator.forDocument(ls.rootSchemaJson(), relPointerString)); } - JsonPointerEvaluator pointer = createPointerEvaluator(absPointerString); ReferenceSchema.Builder refBuilder = ReferenceSchema.builder() .refValue(relPointerString); @@ -172,6 +161,14 @@ Schema.Builder lookup(String relPointerString, JsonObject ctx) { return refBuilder; } + private Schema.Builder createReferenceSchema(String relPointerString, String absPointerString, JsonValue rawReferenced) { + ReferenceSchema.Builder refBuilder = ReferenceSchema.builder().refValue(relPointerString); + ls.pointerSchemas.put(absPointerString, refBuilder); + Schema referredSchema = new SchemaLoader(rawReferenced.ls).load().build(); + refBuilder.build().setReferredSchema(referredSchema); + return refBuilder; + } + private JsonObject initJsonObjectById(URI id) { JsonObject o = JsonValue.of(ls.config.schemasByURI.get(id)).requireObject(); new LoadingState(ls.config, ls.pointerSchemas, o, o, id, SchemaLocation.parseURI(id.toString())); diff --git a/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java b/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java index c4cc92cf4..bacca7117 100644 --- a/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java +++ b/core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java @@ -95,4 +95,10 @@ public void schemaVersionChange() { assertTrue(actual.isExclusiveMinimum()); } + @Test + public void idAsJsonPointerWorks() { + Schema actual = performLookup("#/properties/pointerToIdIsJsonPointer"); + assertEquals("the ID can be a JSON pointer", actual.getDescription()); + } + } diff --git a/core/src/test/resources/org/everit/jsonvalidator/ref-lookup-tests.json b/core/src/test/resources/org/everit/jsonvalidator/ref-lookup-tests.json index cc887d050..b52d23bf1 100644 --- a/core/src/test/resources/org/everit/jsonvalidator/ref-lookup-tests.json +++ b/core/src/test/resources/org/everit/jsonvalidator/ref-lookup-tests.json @@ -17,6 +17,9 @@ }, "definitionInRemote": { "$ref": "http://localhost/child-ref#/definitions/SubSchema" + }, + "pointerToIdIsJsonPointer": { + "$ref": "#/definitions/pointer" } }, "definitions": { @@ -30,6 +33,10 @@ "HasId": { "$id": "has-id", "description": "it has document-local identifier" + }, + "IdIsJsonPointer": { + "$id": "#/definitions/pointer", + "description": "the ID can be a JSON pointer" } } }