X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fstore%2Fimpl%2Ftree%2Fdata%2FNodeModification.java;h=e7e79f891687592db4ac45a14eb558dae20c085b;hp=f2720b57aebe7267a7ed377a89dc4cf12322aa45;hb=da4cff5c3a5bc732fb046b563b886a7aaab67c30;hpb=0056335cf28bcb8cbab8be0fe7eae5913ce0c009 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java index f2720b57ae..e7e79f8916 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NodeModification.java @@ -7,228 +7,38 @@ */ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; -import static com.google.common.base.Preconditions.checkState; - -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.annotation.concurrent.GuardedBy; - import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import com.google.common.base.Optional; -import com.google.common.base.Predicate; /** - * Node Modification Node and Tree - * - * Tree which structurally resembles data tree and captures client modifications - * to the data store tree. - * - * This tree is lazily created and populated via {@link #modifyChild(PathArgument)} - * and {@link StoreMetadataNode} which represents original state {@link #getOriginal()}. + * Internal interface representing a modification action of a particular node. + * It is used by the validation code to allow for a read-only view of the + * modification tree as we should never modify that during validation. */ -final class NodeModification implements StoreTreeNode, Identifiable { - - public static final Predicate IS_TERMINAL_PREDICATE = new Predicate() { - @Override - public boolean apply(final NodeModification input) { - return input.getModificationType() == ModificationType.WRITE // - || input.getModificationType() == ModificationType.DELETE // - || input.getModificationType() == ModificationType.MERGE; - } - }; - private final PathArgument identifier; - private ModificationType modificationType = ModificationType.UNMODIFIED; - - - private final Optional original; - - private NormalizedNode value; - - private Optional snapshotCache; - - private final Map childModification; - - @GuardedBy("this") - private boolean sealed = false; - - protected NodeModification(final PathArgument identifier, final Optional original) { - this.identifier = identifier; - this.original = original; - childModification = new LinkedHashMap<>(); - } - +interface NodeModification extends Identifiable { /** + * Get the type of modification. * - * - * @return - */ - public NormalizedNode getWrittenValue() { - return value; - } - - @Override - public PathArgument getIdentifier() { - return identifier; - } - - /** - * - * Returns original store metadata - * @return original store metadata - */ - public final Optional getOriginal() { - return original; - } - - /** - * Returns modification type - * - * @return modification type + * @return Modification type. */ - public final ModificationType getModificationType() { - return modificationType; - } + ModificationType getType(); /** + * Get the original tree node to which the modification is to be applied. * - * Returns child modification if child was modified - * - * @return Child modification if direct child or it's subtree - * was modified. - * + * @return The original node, or {@link Optional#absent()} if the node is + * a new node. */ - @Override - public Optional getChild(final PathArgument child) { - return Optional. fromNullable(childModification.get(child)); - } + Optional getOriginal(); /** + * Get a read-only view of children nodes. * - * Returns child modification if child was modified, creates {@link NodeModification} - * for child otherwise. - * - * If this node's {@link ModificationType} is {@link ModificationType#UNMODIFIED} - * changes modification type to {@link ModificationType#SUBTREE_MODIFIED} - * - * @param child - * @return {@link NodeModification} for specified child, with {@link #getOriginal()} - * containing child metadata if child was present in original data. + * @return Iterable of all children nodes. */ - public synchronized NodeModification modifyChild(final PathArgument child) { - checkSealed(); - clearSnapshot(); - if(modificationType == ModificationType.UNMODIFIED) { - updateModificationType(ModificationType.SUBTREE_MODIFIED); - } - final NodeModification potential = childModification.get(child); - if (potential != null) { - return potential; - } - Optional currentMetadata = Optional.absent(); - if(original.isPresent()) { - currentMetadata = original.get().getChild(child); - } - NodeModification newlyCreated = new NodeModification(child,currentMetadata); - childModification.put(child, newlyCreated); - return newlyCreated; - } - - /** - * - * Returns all recorded direct child modification - * - * @return all recorded direct child modifications - */ - public Iterable getModifications() { - return childModification.values(); - } - - - /** - * - * Records a delete for associated node. - * - */ - public synchronized void delete() { - checkSealed(); - clearSnapshot(); - updateModificationType(ModificationType.DELETE); - childModification.clear(); - this.value = null; - } - - /** - * - * Records a write for associated node. - * - * @param value - */ - public synchronized void write(final NormalizedNode value) { - checkSealed(); - clearSnapshot(); - updateModificationType(ModificationType.WRITE); - childModification.clear(); - this.value = value; - } - - public synchronized void merge(final NormalizedNode data) { - checkSealed(); - clearSnapshot(); - updateModificationType(ModificationType.MERGE); - // FIXME: Probably merge with previous value. - this.value = data; - } - - @GuardedBy("this") - private void checkSealed() { - checkState(!sealed, "Node Modification is sealed. No further changes allowed."); - } - - public synchronized void seal() { - sealed = true; - clearSnapshot(); - for(NodeModification child : childModification.values()) { - child.seal(); - } - } - - private void clearSnapshot() { - snapshotCache = null; - } - - public Optional storeSnapshot(final Optional snapshot) { - snapshotCache = snapshot; - return snapshot; - } - - public Optional> getSnapshotCache() { - return Optional.fromNullable(snapshotCache); - } - - public boolean hasAdditionalModifications() { - return !childModification.isEmpty(); - } - - @GuardedBy("this") - private void updateModificationType(final ModificationType type) { - modificationType = type; - clearSnapshot(); - } - - @Override - public String toString() { - return "NodeModification [identifier=" + identifier + ", modificationType=" - + modificationType + ", childModification=" + childModification + "]"; - } - - public static NodeModification createUnmodified(final StoreMetadataNode metadataTree) { - return new NodeModification(metadataTree.getIdentifier(), Optional.of(metadataTree)); - } - + Iterable getChildren(); }