com.github.fge.jsonpatch.JsonPatchOperation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of json-patch Show documentation
Show all versions of json-patch Show documentation
JSON Patch (RFC 6902) and JSON Merge Patch (RFC 7386) implementation in Java
/*
* Copyright (c) 2014, Francis Galiegue ([email protected])
*
* 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
*
* Two more abstract classes extend this one according to the arguments of
* the operation:
*
*
* - {@link DualPathOperation} for operations taking a second pointer as
* an argument ({@code copy} and {@code move});
* - {@link PathValueOperation} for operations taking a value as an
* argument ({@code add}, {@code replace} and {@code test}).
*
*/
@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;
@Override
public abstract String toString();
}