X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftree%2FModifiedNode.java;h=bc6b46d46f6c05f186b5d9511cf9561bb532bec8;hb=176d3470b9d995c9d5fd44f65deb3159f2befc24;hp=27b42cc8fe55116e8a979f8602cf87cd0acc84cb;hpb=4efe0ec503f2aaecc3eac1878f76611ba27c4810;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java index 27b42cc8fe..bc6b46d46f 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java @@ -8,8 +8,14 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -17,10 +23,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; -import javax.annotation.concurrent.GuardedBy; -import java.util.LinkedHashMap; -import java.util.Map; - /** * Node Modification Node and Tree * @@ -30,11 +32,13 @@ import java.util.Map; * This tree is lazily created and populated via {@link #modifyChild(PathArgument)} * and {@link StoreMetadataNode} which represents original state {@link #getOriginal()}. */ +@NotThreadSafe final class ModifiedNode implements StoreTreeNode, Identifiable, NodeModification { public static final Predicate IS_TERMINAL_PREDICATE = new Predicate() { @Override - public boolean apply(final ModifiedNode input) { + public boolean apply(final @Nonnull ModifiedNode input) { + Preconditions.checkNotNull(input); switch (input.getType()) { case DELETE: case MERGE: @@ -56,7 +60,7 @@ final class ModifiedNode implements StoreTreeNode, Identifiable snapshotCache; private NormalizedNode value; - private ModifiedNode(final PathArgument identifier, final Optional original, boolean isOrdered) { + private ModifiedNode(final PathArgument identifier, final Optional original, final boolean isOrdered) { this.identifier = identifier; this.original = original; @@ -126,7 +130,7 @@ final class ModifiedNode implements StoreTreeNode, Identifiable, Identifiable, Identifiable it = children.values().iterator(); + while (it.hasNext()) { + final ModifiedNode child = it.next(); child.seal(); + + if (child.modificationType == ModificationType.UNMODIFIED) { + it.remove(); + } + } + + // A SUBTREE_MODIFIED node without any children is a no-op + if (modificationType == ModificationType.SUBTREE_MODIFIED && children.isEmpty()) { + updateModificationType(ModificationType.UNMODIFIED); } } @@ -212,7 +259,6 @@ final class ModifiedNode implements StoreTreeNode, Identifiable, Identifiable value) { + final ModifiedNode ret = new ModifiedNode(getIdentifier(), Optional.absent(), false); + ret.write(value); + return ret; + } + + public static ModifiedNode createUnmodified(final TreeNode metadataTree, final boolean isOrdered) { return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree), isOrdered); } }