1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.linecorp.centraldogma.internal.jsonpatch;
18
19 import java.io.IOException;
20
21 import com.fasterxml.jackson.annotation.JsonCreator;
22 import com.fasterxml.jackson.annotation.JsonProperty;
23 import com.fasterxml.jackson.core.JsonGenerator;
24 import com.fasterxml.jackson.core.JsonPointer;
25 import com.fasterxml.jackson.databind.JsonNode;
26 import com.fasterxml.jackson.databind.SerializerProvider;
27 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
28 import com.fasterxml.jackson.databind.node.ArrayNode;
29 import com.fasterxml.jackson.databind.node.MissingNode;
30 import com.fasterxml.jackson.databind.node.ObjectNode;
31
32
33
34
35
36
37
38 public final class RemoveIfExistsOperation extends JsonPatchOperation {
39
40 @JsonCreator
41 public RemoveIfExistsOperation(@JsonProperty("path") final JsonPointer path) {
42 super("removeIfExists", path);
43 }
44
45 @Override
46 JsonNode apply(final JsonNode node) {
47 if (path.toString().isEmpty()) {
48 return MissingNode.getInstance();
49 }
50
51 final JsonNode found = node.at(path);
52 if (found.isMissingNode()) {
53 return node;
54 }
55
56 final JsonNode parentNode = node.at(path.head());
57 final String raw = path.last().getMatchingProperty();
58 if (parentNode.isObject()) {
59 ((ObjectNode) parentNode).remove(raw);
60 } else if (parentNode.isArray()) {
61 ((ArrayNode) parentNode).remove(Integer.parseInt(raw));
62 }
63 return node;
64 }
65
66 @Override
67 public void serialize(final JsonGenerator jgen,
68 final SerializerProvider provider) throws IOException {
69 jgen.writeStartObject();
70 jgen.writeStringField("op", "removeIfExists");
71 jgen.writeStringField("path", path.toString());
72 jgen.writeEndObject();
73 }
74
75 @Override
76 public void serializeWithType(final JsonGenerator jgen,
77 final SerializerProvider provider, final TypeSerializer typeSer)
78 throws IOException {
79 serialize(jgen, provider);
80 }
81
82 @Override
83 public String toString() {
84 return "op: " + op + "; path: \"" + path + '"';
85 }
86 }