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%2FNodeModification.java;h=4f650c171107abdbffd552a11f7e5531a1f1f8b8;hp=764afcb3e185f3d48d09b192660c3cc882c36537;hb=84248dac9ed8aa37e996e39429c8aa8ece473eaf;hpb=659b8bf7cb541dee20c3f553a3308aedba99c812 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/NodeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/NodeModification.java index 764afcb3e1..4f650c1711 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/NodeModification.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/NodeModification.java @@ -12,11 +12,14 @@ import static com.google.common.base.Preconditions.checkState; import java.util.LinkedHashMap; import java.util.Map; +import javax.annotation.concurrent.GuardedBy; + 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 @@ -30,6 +33,14 @@ import com.google.common.base.Optional; */ public 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; @@ -38,10 +49,11 @@ public class NodeModification implements StoreTreeNode, Identi private NormalizedNode value; - private StoreMetadataNode snapshotCache; + private Optional snapshotCache; private final Map childModification; + @GuardedBy("this") private boolean sealed = false; protected NodeModification(final PathArgument identifier, final Optional original) { @@ -109,6 +121,7 @@ public class NodeModification implements StoreTreeNode, Identi */ public synchronized NodeModification modifyChild(final PathArgument child) { checkSealed(); + clearSnapshot(); if(modificationType == ModificationType.UNMODIFIED) { updateModificationType(ModificationType.SUBTREE_MODIFIED); } @@ -143,6 +156,7 @@ public class NodeModification implements StoreTreeNode, Identi */ public synchronized void delete() { checkSealed(); + clearSnapshot(); updateModificationType(ModificationType.DELETE); childModification.clear(); this.value = null; @@ -156,17 +170,28 @@ public class NodeModification implements StoreTreeNode, Identi */ 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(); } @@ -176,11 +201,21 @@ public class NodeModification implements StoreTreeNode, Identi 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(); } - public void updateModificationType(final ModificationType type) { + @GuardedBy("this") + private void updateModificationType(final ModificationType type) { modificationType = type; clearSnapshot(); } @@ -188,7 +223,7 @@ public class NodeModification implements StoreTreeNode, Identi @Override public String toString() { return "NodeModification [identifier=" + identifier + ", modificationType=" - + modificationType + ", value=" + value + ", childModification=" + childModification + "]"; + + modificationType + ", childModification=" + childModification + "]"; } public static NodeModification createUnmodified(final StoreMetadataNode metadataTree) {