-
Notifications
You must be signed in to change notification settings - Fork 182
/
JsonPatchOperation.java
107 lines (94 loc) · 3.32 KB
/
JsonPatchOperation.java
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* Copyright (c) 2014, Francis Galiegue (fgaliegue@gmail.com)
*
* This software is dual-licensed under:
*
* - the Lesser General Public License (LGPL) version 3.0 or, at your option, any
* later version;
* - the Apache Software License (ASL) version 2.0.
*
* The text of this file and of both licenses is available at the root of this
* project or, if you have the jar distribution, in directory META-INF/, under
* the names LGPL-3.0.txt and ASL-2.0.txt respectively.
*
* Direct link to the sources:
*
* - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt
* - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
*/
package com.github.fge.jsonpatch;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonSerializable;
import com.github.fge.jackson.jsonpointer.JsonPointer;
import com.github.fge.msgsimple.bundle.MessageBundle;
import com.github.fge.msgsimple.load.MessageBundles;
import static com.fasterxml.jackson.annotation.JsonSubTypes.*;
import static com.fasterxml.jackson.annotation.JsonTypeInfo.*;
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "op")
@JsonSubTypes({
@Type(name = "add", value = AddOperation.class),
@Type(name = "copy", value = CopyOperation.class),
@Type(name = "move", value = MoveOperation.class),
@Type(name = "remove", value = RemoveOperation.class),
@Type(name = "replace", value = ReplaceOperation.class),
@Type(name = "test", value = TestOperation.class)
})
/**
* Base abstract class for one patch operation
*
* <p>Two more abstract classes extend this one according to the arguments of
* the operation:</p>
*
* <ul>
* <li>{@link DualPathOperation} for operations taking a second pointer as
* an argument ({@code copy} and {@code move});</li>
* <li>{@link PathValueOperation} for operations taking a value as an
* argument ({@code add}, {@code replace} and {@code test}).</li>
* </ul>
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class JsonPatchOperation
implements JsonSerializable
{
protected static final MessageBundle BUNDLE
= MessageBundles.getBundle(JsonPatchMessages.class);
protected final String op;
/*
* Note: no need for a custom deserializer, Jackson will try and find a
* constructor with a single string argument and use it.
*
* However, we need to serialize using .toString().
*/
protected final JsonPointer path;
/**
* Constructor
*
* @param op the operation name
* @param path the JSON Pointer for this operation
*/
protected JsonPatchOperation(final String op, final JsonPointer path)
{
this.op = op;
this.path = path;
}
/**
* Apply this operation to a JSON value
*
* @param node the value to patch
* @return the patched value
* @throws JsonPatchException operation failed to apply to this value
*/
public abstract JsonNode apply(final JsonNode node)
throws JsonPatchException;
public final String getOp() {
return op;
}
public final JsonPointer getPath() {
return path;
}
@Override
public abstract String toString();
}