Skip to content

Commit f3825f3

Browse files
authored
Fix getSchema() anchor fragment lookup. (#930)
1 parent 44b1ec5 commit f3825f3

File tree

5 files changed

+106
-1
lines changed

5 files changed

+106
-1
lines changed

src/main/java/com/networknt/schema/JsonSchemaFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ protected JsonSchema getMappedSchema(final URI schemaUri, SchemaValidatorsConfig
467467
URI documentUri = "".equals(schemaUri.getSchemeSpecificPart()) ? new URI(schemaUri.getScheme(), schemaUri.getUserInfo(), schemaUri.getHost(), schemaUri.getPort(), schemaUri.getPath(), schemaUri.getQuery(), null) : new URI(schemaUri.getScheme(), schemaUri.getSchemeSpecificPart(), null);
468468
SchemaLocation documentLocation = new SchemaLocation(schemaLocation.getAbsoluteIri());
469469
JsonSchema document = doCreate(validationContext, documentLocation, evaluationPath, documentUri, schemaNode, null, false);
470-
JsonNode subSchemaNode = document.getRefSchemaNode(schemaLocation.getFragment().toString());
470+
JsonNode subSchemaNode = document.getRefSchemaNode("#" + schemaLocation.getFragment().toString());
471471
if (subSchemaNode != null) {
472472
jsonSchema = doCreate(validationContext, schemaLocation, evaluationPath, mappedUri, subSchemaNode, document, false);
473473
} else {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.networknt.schema;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.networknt.schema.uri.URITranslator;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.net.URI;
9+
10+
public class Issue928Test {
11+
private final ObjectMapper mapper = new ObjectMapper();
12+
13+
private JsonSchemaFactory factoryFor(SpecVersion.VersionFlag version) {
14+
return JsonSchemaFactory
15+
.builder(JsonSchemaFactory.getInstance(version))
16+
.objectMapper(mapper)
17+
.addUriTranslator(
18+
URITranslator.prefix("https://example.org", "resource:")
19+
)
20+
.build();
21+
}
22+
23+
@Test
24+
public void test_07() {
25+
test_spec(SpecVersion.VersionFlag.V7);
26+
}
27+
28+
@Test
29+
public void test_201909() {
30+
test_spec(SpecVersion.VersionFlag.V201909);
31+
}
32+
33+
@Test
34+
public void test_202012() {
35+
test_spec(SpecVersion.VersionFlag.V202012);
36+
}
37+
38+
public void test_spec(SpecVersion.VersionFlag specVersion) {
39+
JsonSchemaFactory schemaFactory = factoryFor(specVersion);
40+
41+
String versionId = specVersion.getId();
42+
String versionStr = versionId.substring(versionId.indexOf("draft") + 6, versionId.indexOf("/schema"));
43+
44+
String baseUrl = String.format("https://example.org/schema/issue928-v%s.json", versionStr);
45+
System.out.println("baseUrl: " + baseUrl);
46+
47+
JsonSchema byPointer = schemaFactory.getSchema(
48+
URI.create(baseUrl + "#/definitions/example"));
49+
50+
Assertions.assertEquals(byPointer.validate(mapper.valueToTree("A")).size(), 0);
51+
Assertions.assertEquals(byPointer.validate(mapper.valueToTree("Z")).size(), 1);
52+
53+
JsonSchema byAnchor = schemaFactory.getSchema(
54+
URI.create(baseUrl + "#example"));
55+
56+
Assertions.assertEquals(
57+
byPointer.getSchemaNode(),
58+
byAnchor.getSchemaNode());
59+
60+
Assertions.assertEquals(byAnchor.validate(mapper.valueToTree("A")).size(), 0);
61+
Assertions.assertEquals(byAnchor.validate(mapper.valueToTree("Z")).size(), 1);
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"$id": "https://example.com/person.schema.json",
3+
"$schema": "https://json-schema.org/draft-07/schema#",
4+
"type": "object",
5+
"definitions": {
6+
"example": {
7+
"$id": "#example",
8+
"type": "string",
9+
"enum": [
10+
"A", "B"
11+
]
12+
}
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"$id": "https://example.com/person.schema.json",
3+
"$schema": "https://json-schema.org/draft/2019-09/schema#",
4+
"type": "object",
5+
"definitions": {
6+
"example": {
7+
"$anchor": "example",
8+
"type": "string",
9+
"enum": [
10+
"A", "B"
11+
]
12+
}
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"$id": "https://example.com/person.schema.json",
3+
"$schema": "https://json-schema.org/draft/2020-12/schema#",
4+
"type": "object",
5+
"definitions": {
6+
"example": {
7+
"$anchor": "example",
8+
"type": "string",
9+
"enum": [
10+
"A", "B"
11+
]
12+
}
13+
}
14+
}

0 commit comments

Comments
 (0)