Skip to content

Commit 502f114

Browse files
authored
Merge pull request java-json-tools#1 from jasonchaffee/master
Adding a public accessor to JsonPatch to retrieve the contained operation and path
2 parents a81ae77 + da31a95 commit 502f114

File tree

8 files changed

+97
-16
lines changed

8 files changed

+97
-16
lines changed

src/main/java/com/github/fge/jsonpatch/JsonPatch.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,8 @@ public void serializeWithType(final JsonGenerator jgen,
177177
{
178178
serialize(jgen, provider);
179179
}
180+
181+
public List<JsonPatchOperation> getOperations() {
182+
return ImmutableList.copyOf(operations);
183+
}
180184
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.fge.jsonpatch;
2+
3+
import com.fasterxml.jackson.databind.jsontype.NamedType;
4+
import com.fasterxml.jackson.databind.module.SimpleModule;
5+
import com.github.fge.jsonpatch.operation.AddOperation;
6+
import com.github.fge.jsonpatch.operation.CopyOperation;
7+
import com.github.fge.jsonpatch.operation.MoveOperation;
8+
import com.github.fge.jsonpatch.operation.RemoveOperation;
9+
import com.github.fge.jsonpatch.operation.ReplaceOperation;
10+
import com.github.fge.jsonpatch.operation.TestOperation;
11+
12+
/**
13+
* This module registers the standard JSON-PATCH operations with Jackson.
14+
*/
15+
public class JsonPatchModule extends SimpleModule {
16+
private static final long serialVersionUID = 1L;
17+
18+
/**
19+
* Constructor
20+
*/
21+
public JsonPatchModule() {
22+
registerSubtypes(
23+
new NamedType(AddOperation.class, AddOperation.OPERATION_NAME),
24+
new NamedType(CopyOperation.class, CopyOperation.OPERATION_NAME),
25+
new NamedType(MoveOperation.class, MoveOperation.OPERATION_NAME),
26+
new NamedType(RemoveOperation.class, RemoveOperation.OPERATION_NAME),
27+
new NamedType(ReplaceOperation.class, ReplaceOperation.OPERATION_NAME),
28+
new NamedType(TestOperation.class, TestOperation.OPERATION_NAME)
29+
);
30+
}
31+
}

src/main/java/com/github/fge/jsonpatch/operation/DualPathOperation.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ protected DualPathOperation(final String op, final JsonPointer from,
6363
this.path = path;
6464
}
6565

66+
public String getOp() {
67+
return this.op;
68+
}
69+
70+
public JsonPointer getPath() {
71+
return this.path;
72+
}
73+
6674
@Override
6775
public final void serialize(final JsonGenerator jgen,
6876
final SerializerProvider provider)

src/main/java/com/github/fge/jsonpatch/operation/JsonPatchOperation.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.fasterxml.jackson.annotation.JsonTypeInfo;
2424
import com.fasterxml.jackson.databind.JsonNode;
2525
import com.fasterxml.jackson.databind.JsonSerializable;
26+
import com.github.fge.jackson.jsonpointer.JsonPointer;
2627
import com.github.fge.jsonpatch.JsonPatchException;
2728

2829
/**
@@ -55,6 +56,10 @@ public interface JsonPatchOperation
5556
public JsonNode apply(final JsonNode node)
5657
throws JsonPatchException;
5758

59+
public String getOp();
60+
61+
public JsonPointer getPath();
62+
5863
@Override
5964
public String toString();
6065
}

src/main/java/com/github/fge/jsonpatch/operation/PathDualValueOperation.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ protected PathDualValueOperation(final String op, final JsonPointer path,
5151
this.toValue = toValue;
5252
}
5353

54+
public String getOp() {
55+
return this.op;
56+
}
57+
58+
public JsonPointer getPath() {
59+
return this.path;
60+
}
61+
5462
@Override
5563
public final void serialize(final JsonGenerator jgen,
5664
final SerializerProvider provider)

src/main/java/com/github/fge/jsonpatch/operation/PathValueOperation.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
2828
import com.github.fge.jackson.jsonpointer.JsonPointer;
2929
import com.github.fge.jsonpatch.JsonPatchMessages;
30-
import com.github.fge.jsonpatch.operation.JsonPatchOperation;
3130
import com.github.fge.msgsimple.bundle.MessageBundle;
3231
import com.github.fge.msgsimple.load.MessageBundles;
3332

@@ -64,6 +63,14 @@ protected PathValueOperation(final String op, final JsonPointer path,
6463
this.value = value.deepCopy();
6564
}
6665

66+
public String getOp() {
67+
return this.op;
68+
}
69+
70+
public JsonPointer getPath() {
71+
return this.path;
72+
}
73+
6774
@Override
6875
public final void serialize(final JsonGenerator jgen,
6976
final SerializerProvider provider)

src/main/java/com/github/fge/jsonpatch/operation/RemoveOperationBase.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.fasterxml.jackson.annotation.JsonCreator;
2424
import com.fasterxml.jackson.annotation.JsonProperty;
2525
import com.fasterxml.jackson.core.JsonGenerator;
26-
import com.fasterxml.jackson.core.JsonProcessingException;
2726
import com.fasterxml.jackson.databind.JsonNode;
2827
import com.fasterxml.jackson.databind.SerializerProvider;
2928
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
@@ -33,7 +32,6 @@
3332
import com.github.fge.jackson.jsonpointer.JsonPointer;
3433
import com.github.fge.jsonpatch.JsonPatchException;
3534
import com.github.fge.jsonpatch.JsonPatchMessages;
36-
import com.github.fge.jsonpatch.operation.JsonPatchOperation;
3735
import com.github.fge.jsonpatch.operation.policy.PathMissingPolicy;
3836
import com.github.fge.msgsimple.bundle.MessageBundle;
3937
import com.github.fge.msgsimple.load.MessageBundles;
@@ -50,7 +48,7 @@ public abstract class RemoveOperationBase
5048
protected static final MessageBundle BUNDLE
5149
= MessageBundles.getBundle(JsonPatchMessages.class);
5250

53-
private PathMissingPolicy pathMissingPolicy;
51+
private final PathMissingPolicy pathMissingPolicy;
5452

5553
protected final String op;
5654

@@ -71,48 +69,56 @@ public JsonNode apply(final JsonNode node)
7169
throws JsonPatchException
7270
{
7371
final JsonNode ret = node.deepCopy();
74-
if (path.isEmpty())
72+
if (this.path.isEmpty())
7573
return MissingNode.getInstance();
76-
if (path.path(node).isMissingNode()) {
77-
switch (pathMissingPolicy) {
74+
if (this.path.path(node).isMissingNode()) {
75+
switch (this.pathMissingPolicy) {
7876
case THROW:
7977
throw new JsonPatchException(BUNDLE.getMessage(
8078
"jsonPatch.noSuchPath"));
8179
case SKIP:
8280
return ret;
8381
}
8482
}
85-
final JsonNode parentNode = path.parent().get(ret);
86-
final String raw = Iterables.getLast(path).getToken().getRaw();
83+
final JsonNode parentNode = this.path.parent().get(ret);
84+
final String raw = Iterables.getLast(this.path).getToken().getRaw();
8785
if (parentNode.isObject())
8886
((ObjectNode) parentNode).remove(raw);
8987
else
9088
((ArrayNode) parentNode).remove(Integer.parseInt(raw));
9189
return ret;
9290
}
9391

92+
@Override
93+
public String getOp() {
94+
return this.op;
95+
}
96+
97+
@Override
98+
public JsonPointer getPath() {
99+
return this.path;
100+
}
101+
94102
@Override
95103
public void serialize(final JsonGenerator jgen,
96104
final SerializerProvider provider)
97-
throws IOException, JsonProcessingException
98-
{
105+
throws IOException {
99106
jgen.writeStartObject();
100-
jgen.writeStringField("op", op);
101-
jgen.writeStringField("path", path.toString());
107+
jgen.writeStringField("op", this.op);
108+
jgen.writeStringField("path", this.path.toString());
102109
jgen.writeEndObject();
103110
}
104111

105112
@Override
106113
public void serializeWithType(final JsonGenerator jgen,
107114
final SerializerProvider provider, final TypeSerializer typeSer)
108-
throws IOException, JsonProcessingException
109-
{
115+
throws IOException {
110116
serialize(jgen, provider);
111117
}
112118

113119
@Override
114120
public String toString()
115121
{
116-
return "op: " + op + "; path: \"" + path + '"';
122+
return "op: " + this.op + "; path: \"" + this.path + '"';
117123
}
118124
}

src/test/java/com/github/fge/jsonpatch/JsonPatchTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.testng.annotations.Test;
3232

3333
import java.io.IOException;
34+
import java.util.List;
3435

3536
import static org.mockito.Mockito.*;
3637
import static org.testng.Assert.*;
@@ -120,4 +121,15 @@ public void whenOneOperationFailsNextOperationIsNotCalled()
120121

121122
verifyZeroInteractions(op2);
122123
}
124+
125+
@Test
126+
public void getOperationsReturnsTheCorrectOpsInTheCorrectOrder()
127+
{
128+
final JsonPatch patch = new JsonPatch(ImmutableList.of(op1, op2));
129+
130+
List<JsonPatchOperation> operations = patch.getOperations();
131+
assertEquals(operations.size(), 2);
132+
assertEquals(operations.get(0), op1);
133+
assertEquals(operations.get(1), op2);
134+
}
123135
}

0 commit comments

Comments
 (0)