Skip to content

Commit ea8c5ff

Browse files
committed
fixing #270 and some code cleanup in ReferenceLookup
1 parent c52f328 commit ea8c5ff

File tree

3 files changed

+27
-17
lines changed

3 files changed

+27
-17
lines changed

core/src/main/java/org/everit/json/schema/loader/ReferenceLookup.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -123,36 +123,25 @@ private Schema.Builder<?> performQueryEvaluation(String mapKey, JsonPointerEvalu
123123
if (ls.pointerSchemas.containsKey(absolutePointer)) {
124124
return ls.pointerSchemas.get(absolutePointer);
125125
}
126-
JsonValue rawInternalReferenced = pointerEvaluator.query().getQueryResult();
127-
ReferenceSchema.Builder refBuilder = ReferenceSchema.builder()
128-
.refValue(mapKey);
129-
ls.pointerSchemas.put(absolutePointer, refBuilder);
130-
Schema referredSchema = new SchemaLoader(rawInternalReferenced.ls).load().build();
131-
refBuilder.build().setReferredSchema(referredSchema);
132-
return refBuilder;
126+
JsonValue referencedRawSchema = pointerEvaluator.query().getQueryResult();
127+
return createReferenceSchema(mapKey, absolutePointer, referencedRawSchema);
133128
}
134129

135130
/**
136131
* Returns a schema builder instance after looking up the JSON pointer.
137132
*/
138133
Schema.Builder<?> lookup(String relPointerString, JsonObject ctx) {
139-
if (isSameDocumentRef(relPointerString)) {
140-
return performQueryEvaluation(relPointerString, JsonPointerEvaluator.forDocument(ls.rootSchemaJson(), relPointerString));
141-
}
142134
String absPointerString = ReferenceResolver.resolve(ls.id, relPointerString).toString();
143135
if (ls.pointerSchemas.containsKey(absPointerString)) {
144136
return ls.pointerSchemas.get(absPointerString);
145137
}
146138
JsonValue rawInternalReferenced = lookupObjById(ls.rootSchemaJson, absPointerString);
147139
if (rawInternalReferenced != null) {
148-
ReferenceSchema.Builder refBuilder = ReferenceSchema.builder()
149-
.refValue(relPointerString);
150-
ls.pointerSchemas.put(absPointerString, refBuilder);
151-
Schema referredSchema = new SchemaLoader(rawInternalReferenced.ls).load().build();
152-
refBuilder.build().setReferredSchema(referredSchema);
153-
return refBuilder;
140+
return createReferenceSchema(relPointerString, absPointerString, rawInternalReferenced);
141+
}
142+
if (isSameDocumentRef(relPointerString)) {
143+
return performQueryEvaluation(relPointerString, JsonPointerEvaluator.forDocument(ls.rootSchemaJson(), relPointerString));
154144
}
155-
156145
JsonPointerEvaluator pointer = createPointerEvaluator(absPointerString);
157146
ReferenceSchema.Builder refBuilder = ReferenceSchema.builder()
158147
.refValue(relPointerString);
@@ -172,6 +161,14 @@ Schema.Builder<?> lookup(String relPointerString, JsonObject ctx) {
172161
return refBuilder;
173162
}
174163

164+
private Schema.Builder<?> createReferenceSchema(String relPointerString, String absPointerString, JsonValue rawReferenced) {
165+
ReferenceSchema.Builder refBuilder = ReferenceSchema.builder().refValue(relPointerString);
166+
ls.pointerSchemas.put(absPointerString, refBuilder);
167+
Schema referredSchema = new SchemaLoader(rawReferenced.ls).load().build();
168+
refBuilder.build().setReferredSchema(referredSchema);
169+
return refBuilder;
170+
}
171+
175172
private JsonObject initJsonObjectById(URI id) {
176173
JsonObject o = JsonValue.of(ls.config.schemasByURI.get(id)).requireObject();
177174
new LoadingState(ls.config, ls.pointerSchemas, o, o, id, SchemaLocation.parseURI(id.toString()));

core/src/test/java/org/everit/json/schema/loader/ReferenceLookupTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,10 @@ public void schemaVersionChange() {
9595
assertTrue(actual.isExclusiveMinimum());
9696
}
9797

98+
@Test
99+
public void idAsJsonPointerWorks() {
100+
Schema actual = performLookup("#/properties/pointerToIdIsJsonPointer");
101+
assertEquals("the ID can be a JSON pointer", actual.getDescription());
102+
}
103+
98104
}

core/src/test/resources/org/everit/jsonvalidator/ref-lookup-tests.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
},
1818
"definitionInRemote": {
1919
"$ref": "http://localhost/child-ref#/definitions/SubSchema"
20+
},
21+
"pointerToIdIsJsonPointer": {
22+
"$ref": "#/definitions/pointer"
2023
}
2124
},
2225
"definitions": {
@@ -30,6 +33,10 @@
3033
"HasId": {
3134
"$id": "has-id",
3235
"description": "it has document-local identifier"
36+
},
37+
"IdIsJsonPointer": {
38+
"$id": "#/definitions/pointer",
39+
"description": "the ID can be a JSON pointer"
3340
}
3441
}
3542
}

0 commit comments

Comments
 (0)