1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 package com.linecorp.centraldogma.internal.jsonpatch;
36
37 import java.io.IOException;
38
39 import com.fasterxml.jackson.core.JsonGenerator;
40 import com.fasterxml.jackson.core.JsonPointer;
41 import com.fasterxml.jackson.databind.JsonNode;
42 import com.fasterxml.jackson.databind.SerializerProvider;
43 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
44 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
45 import com.google.common.base.Equivalence;
46
47
48
49
50 abstract class PathValueOperation extends JsonPatchOperation {
51
52 private static final Equivalence<JsonNode> EQUIVALENCE = JsonNumEquals.getInstance();
53
54 @JsonSerialize
55 private final JsonNode value;
56
57
58
59
60
61
62
63
64 PathValueOperation(final String op, final JsonPointer path, final JsonNode value) {
65 super(op, path);
66 this.value = value.deepCopy();
67 }
68
69 public JsonNode value() {
70 return value;
71 }
72
73 JsonNode valueCopy() {
74 return value.deepCopy();
75 }
76
77 void ensureEquivalence(JsonNode actual) {
78 if (!EQUIVALENCE.equivalent(actual, value)) {
79 throw new JsonPatchException("mismatching value at '" + path + "': " +
80 actual + " (expected: " + value + ')');
81 }
82 }
83
84 @Override
85 public final void serialize(final JsonGenerator jgen,
86 final SerializerProvider provider) throws IOException {
87 jgen.writeStartObject();
88 jgen.writeStringField("op", op);
89 jgen.writeStringField("path", path.toString());
90 jgen.writeFieldName("value");
91 jgen.writeTree(value);
92 jgen.writeEndObject();
93 }
94
95 @Override
96 public final void serializeWithType(final JsonGenerator jgen,
97 final SerializerProvider provider, final TypeSerializer typeSer)
98 throws IOException {
99 serialize(jgen, provider);
100 }
101
102 @Override
103 public final String toString() {
104 return "op: " + op + "; path: \"" + path + "\"; value: " + value;
105 }
106 }