2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.tree.impl;
10 import static java.util.Objects.requireNonNull;
12 import java.util.Optional;
13 import org.eclipse.jdt.annotation.Nullable;
14 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
15 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
16 import org.opendaylight.yangtools.yang.data.tree.impl.node.TreeNode;
17 import org.opendaylight.yangtools.yang.data.tree.impl.node.Version;
19 final class OperationWithModification {
20 private final ModificationApplyOperation applyOperation;
21 private final ModifiedNode modification;
23 private OperationWithModification(final ModificationApplyOperation op, final ModifiedNode mod) {
24 applyOperation = requireNonNull(op);
25 modification = requireNonNull(mod);
28 void write(final NormalizedNode value) {
29 modification.write(value);
31 * Fast validation of structure, full validation on written data will be run during seal.
33 applyOperation.quickVerifyStructure(value);
36 void merge(final NormalizedNode data, final Version version) {
38 * A merge operation will end up overwriting parts of the tree, retaining others. We want to
39 * make sure we do not validate the complete resulting structure, but rather just what was
40 * written. In order to do that, we first pretend the data was written, run verification and
41 * then perform the merge -- with the explicit assumption that adding the newly-validated
42 * data with the previously-validated data will not result in invalid data.
44 * We perform only quick validation here, full validation will be applied as-needed during
45 * preparation, as the merge is reconciled with current state.
47 applyOperation.quickVerifyStructure(data);
48 applyOperation.mergeIntoModifiedNode(modification, data, version);
52 modification.delete();
56 * Read a particular child. If the child has been modified and does not have a stable
57 * view, one will we instantiated with specified version.
59 Optional<NormalizedNode> read(final PathArgument child, final Version version) {
60 final ModifiedNode childNode = modification.childByArg(child);
61 if (childNode != null) {
62 var snapshot = childNode.getSnapshot();
63 if (snapshot == null) {
64 // Snapshot is not present, force instantiation
65 snapshot = Optional.ofNullable(
66 applyOperation.getChildByArg(child).apply(childNode, childNode.original(), version));
69 return snapshot.map(TreeNode::getData);
72 var snapshot = modification.getSnapshot();
73 if (snapshot == null) {
74 snapshot = Optional.ofNullable(apply(modification.original(), version));
77 if (snapshot.isPresent()) {
78 return snapshot.orElseThrow().findChildByArg(child).map(TreeNode::getData);
81 return Optional.empty();
84 public ModifiedNode getModification() {
88 public ModificationApplyOperation getApplyOperation() {
89 return applyOperation;
92 public @Nullable TreeNode apply(final @Nullable TreeNode data, final Version version) {
93 return applyOperation.apply(modification, data, version);
96 public static OperationWithModification from(final ModificationApplyOperation operation,
97 final ModifiedNode modification) {
98 return new OperationWithModification(operation, modification);