Skip to content

Commit d8bacf2

Browse files
committed
escaping json pointers in ValidationException
1 parent 50d5010 commit d8bacf2

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

core/src/main/java/org/everit/json/schema/ValidationException.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public ValidationException(final Schema violatedSchema, final String message) {
126126
* a (possibly empty) list of validation failures. It is used if multiple schema
127127
* violations are found by violatedSchema
128128
*/
129-
public ValidationException(final Schema violatedSchema, final StringBuilder pointerToViolation,
129+
ValidationException(final Schema violatedSchema, final StringBuilder pointerToViolation,
130130
final String message,
131131
final List<ValidationException> causingExceptions) {
132132
super(message);
@@ -153,6 +153,10 @@ private ValidationException(final StringBuilder pointerToViolation,
153153
this(violatedSchema, pointerToViolation, message, causingExceptions);
154154
}
155155

156+
private String escapeFragment(final String fragment) {
157+
return fragment.replace("~", "~0").replace("/", "~1");
158+
}
159+
156160
public List<ValidationException> getCausingExceptions() {
157161
return causingExceptions;
158162
}
@@ -201,10 +205,11 @@ public ValidationException prepend(final String fragment) {
201205
* @return the new {@code ViolationException} instance
202206
*/
203207
public ValidationException prepend(final String fragment, final Schema violatedSchema) {
204-
Objects.requireNonNull(fragment, "fragment cannot be null");
205-
StringBuilder newPointer = this.pointerToViolation.insert(1, '/').insert(2, fragment);
208+
String escapedFragment = escapeFragment(
209+
Objects.requireNonNull(fragment, "fragment cannot be null"));
210+
StringBuilder newPointer = this.pointerToViolation.insert(1, '/').insert(2, escapedFragment);
206211
List<ValidationException> prependedCausingExceptions = causingExceptions.stream()
207-
.map(exc -> exc.prepend(fragment))
212+
.map(exc -> exc.prepend(escapedFragment))
208213
.collect(Collectors.toList());
209214
return new ValidationException(newPointer, violatedSchema, super.getMessage(),
210215
prependedCausingExceptions);

core/src/test/java/org/everit/json/schema/ValidationExceptionTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ private ValidationException createDummyException(final String pointer) {
3737
"stuff went wrong", Collections.emptyList());
3838
}
3939

40+
@Test
41+
public void fragmentEscapingBoth() {
42+
ValidationException subject = createDummyException("#/aaa").prepend("x~y/z");
43+
Assert.assertEquals("#/x~0y~1z/aaa", subject.getPointerToViolation());
44+
}
45+
46+
@Test
47+
public void fragmentEscapingSlash() {
48+
ValidationException subject = createDummyException("#/aaa").prepend("x/y");
49+
Assert.assertEquals("#/x~1y/aaa", subject.getPointerToViolation());
50+
}
51+
52+
@Test
53+
public void fragmentEscapingTilde() {
54+
ValidationException subject = createDummyException("#/aaa").prepend("x~y");
55+
Assert.assertEquals("#/x~0y/aaa", subject.getPointerToViolation());
56+
}
57+
4058
@Test
4159
public void getMessageAfterPrepend() {
4260
ValidationException subject = createDummyException("#/a").prepend("obj");

0 commit comments

Comments
 (0)