From 6373deff35b1ba068a137d017f536509327b3b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bence=20Er=C5=91s?= Date: Sat, 19 Jan 2019 01:04:09 +0100 Subject: [PATCH] fix for #260 with integration test --- .../schema/loader/JsonPointerEvaluator.java | 14 ++++++++++--- .../json/schema/loader/ReferenceLookup.java | 6 ++++-- .../example/definitions/buildings.json | 21 +++++++++++++++++++ .../remotes/example/definitions/stuff.json | 8 +++++++ .../json/schema/issues/issue260/schema.json | 10 +++++++++ .../issues/issue260/subject-invalid.json | 7 +++++++ .../issues/issue260/validator-config.json | 4 ++++ 7 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/buildings.json create mode 100644 tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/stuff.json create mode 100644 tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/schema.json create mode 100644 tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/subject-invalid.json create mode 100644 tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/validator-config.json diff --git a/core/src/main/java/org/everit/json/schema/loader/JsonPointerEvaluator.java b/core/src/main/java/org/everit/json/schema/loader/JsonPointerEvaluator.java index b5a047035..c3569c282 100644 --- a/core/src/main/java/org/everit/json/schema/loader/JsonPointerEvaluator.java +++ b/core/src/main/java/org/everit/json/schema/loader/JsonPointerEvaluator.java @@ -10,6 +10,8 @@ import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URLDecoder; import java.nio.charset.Charset; import java.util.LinkedList; @@ -106,8 +108,13 @@ static final JsonPointerEvaluator forDocument(JsonObject document, String fragme return new JsonPointerEvaluator(() -> document, fragment); } - private static JsonObject configureBasedOnState(JsonObject obj, LoadingState callingState) { - obj.ls = new LoadingState(callingState.config, callingState.pointerSchemas, obj, obj, null, SchemaLocation.empty()); + private static JsonObject configureBasedOnState(JsonObject obj, LoadingState callingState, String id) { + try { + URI uri = new URI(id); + obj.ls = new LoadingState(callingState.config, callingState.pointerSchemas, obj, obj, uri, SchemaLocation.empty()); + } catch (URISyntaxException e) { + throw callingState.createSchemaException("invalid URI: " + e.getMessage()); + } return obj; } @@ -122,7 +129,8 @@ static final JsonPointerEvaluator forURL(SchemaClient schemaClient, String url, fragment = url.substring(poundIdx); toBeQueried = url.substring(0, poundIdx); } - return new JsonPointerEvaluator(() -> configureBasedOnState(executeWith(schemaClient, toBeQueried), callingState), fragment); + return new JsonPointerEvaluator(() -> configureBasedOnState(executeWith(schemaClient, toBeQueried), callingState, toBeQueried), + fragment); } private final Supplier documentProvider; 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 e97910c3e..7a026f8fd 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 @@ -160,11 +160,13 @@ Schema.Builder lookup(String relPointerString, JsonObject ctx) { ls.pointerSchemas.put(absPointerString, refBuilder); JsonPointerEvaluator.QueryResult result = pointer.query(); + URI resolutionScope = !isInternal ? withoutFragment(absPointerString) : ls.id; + JsonObject containingDocument = result.getContainingDocument(); SchemaLoader childLoader = ls.initChildLoader() .pointerToCurrentObj(SchemaLocation.parseURI(absPointerString)) - .resolutionScope(!isInternal ? withoutFragment(absPointerString) : ls.id) + .resolutionScope(resolutionScope) .schemaJson(result.getQueryResult()) - .rootSchemaJson(result.getContainingDocument()).build(); + .rootSchemaJson(containingDocument).build(); Schema referredSchema = childLoader.load().build(); refBuilder.schemaLocation(SchemaLocation.parseURI(absPointerString)); refBuilder.build().setReferredSchema(referredSchema); diff --git a/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/buildings.json b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/buildings.json new file mode 100644 index 000000000..3795ab8e4 --- /dev/null +++ b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/buildings.json @@ -0,0 +1,21 @@ +{ + "house": { + "type": "object", + "properties": { + "rooms": { + "type": "array", + "items": { + "$ref": "#/room" + } + } + } + }, + "room": { + "type": "object", + "properties": { + "door": { + "$ref": "stuff.json#/door" + } + } + } +} diff --git a/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/stuff.json b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/stuff.json new file mode 100644 index 000000000..62d8d34cf --- /dev/null +++ b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/remotes/example/definitions/stuff.json @@ -0,0 +1,8 @@ +{ + "door": { + "type": "object", + "properties": { + "material": { "type": "string" } + } + } +} diff --git a/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/schema.json b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/schema.json new file mode 100644 index 000000000..ad5756b3a --- /dev/null +++ b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/schema.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://localhost:1234/", + "type": "object", + "properties": { + "house": { + "$ref": "example/definitions/buildings.json#/house" + } + } +} diff --git a/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/subject-invalid.json b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/subject-invalid.json new file mode 100644 index 000000000..9ad74e456 --- /dev/null +++ b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/subject-invalid.json @@ -0,0 +1,7 @@ +{ + "house": { + "rooms": [ { + "door": { "material": 1 } + }] + } +} diff --git a/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/validator-config.json b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/validator-config.json new file mode 100644 index 000000000..118f54931 --- /dev/null +++ b/tests/vanilla/src/main/resources/org/everit/json/schema/issues/issue260/validator-config.json @@ -0,0 +1,4 @@ +{ + "metaSchemaVersion": 7 +} +