From: Robert Varga Date: Thu, 22 May 2014 21:35:02 +0000 (+0200) Subject: BUG-509: introduce Version concept X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~30^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=81adbd659a7d7684c8b72376c55e7198b23ddb5c BUG-509: introduce Version concept This patch introduces the concept of a Version, which is disconnected from any ordinal number. This is useful for saving memory, as the versioning of TreeNodes needs to only detect version mismatches and not which version is historically newer. Change-Id: I625d9d945ff3fd416dd82bb3f1ff4268f2001e5a Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java index 7f66f7ff7e..15479be462 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java @@ -1,11 +1,11 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedLong; /** * An implementation of apply operation which fails to do anything, @@ -16,7 +16,7 @@ import com.google.common.primitives.UnsignedLong; final class AlwaysFailOperation implements ModificationApplyOperation { @Override public Optional apply(final ModifiedNode modification, - final Optional storeMeta, final UnsignedLong subtreeVersion) { + final Optional storeMeta, final Version subtreeVersion) { throw new IllegalStateException("Schema Context is not available."); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java index ae71ed9adf..d3495b542a 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java @@ -101,7 +101,8 @@ final class InMemoryDataTree implements DataTree { rwLock.writeLock().lock(); try { - final Optional newRoot = m.getStrategy().apply(m.getRootModification(), Optional.of(rootNode), StoreUtils.increase(rootNode.getSubtreeVersion())); + final Optional newRoot = m.getStrategy().apply(m.getRootModification(), + Optional.of(rootNode), rootNode.getSubtreeVersion().next()); Preconditions.checkState(newRoot.isPresent(), "Apply strategy failed to produce root node"); return new InMemoryDataTreeCandidate(PUBLIC_ROOT_PATH, root, rootNode, newRoot.get()); } finally { diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java index 82ffad507d..4640be43e7 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java @@ -2,13 +2,12 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeFactory; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.primitives.UnsignedLong; - /** * A factory for creating in-memory data trees. */ @@ -24,7 +23,7 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory { final NodeIdentifier root = new NodeIdentifier(SchemaContext.NAME); final NormalizedNode data = Builders.containerBuilder().withNodeIdentifier(root).build(); - return new InMemoryDataTree(TreeNodeFactory.createTreeNode(data, UnsignedLong.ZERO), null); + return new InMemoryDataTree(TreeNodeFactory.createTreeNode(data, Version.initial()), null); } /** diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java index d3e4bf0714..c05ed4b442 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java @@ -12,7 +12,6 @@ import java.util.Map.Entry; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; -import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreUtils; import org.opendaylight.controller.md.sal.dom.store.impl.tree.TreeNodeUtils; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; @@ -109,7 +108,7 @@ final class InMemoryDataTreeModification implements DataTreeModification { try { return resolveModificationStrategy(path).apply(modification, modification.getOriginal(), - StoreUtils.increase(snapshot.getRootNode().getSubtreeVersion())); + snapshot.getRootNode().getSubtreeVersion().next()); } catch (Exception e) { LOG.error("Could not create snapshot for {}:{}", path,modification,e); throw e; diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java index a72d4fb579..10f39a8cef 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java @@ -10,11 +10,11 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; 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.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedLong; /** * @@ -58,7 +58,7 @@ interface ModificationApplyOperation extends StoreTreeNode apply(ModifiedNode modification, Optional storeMeta, UnsignedLong subtreeVersion); + Optional apply(ModifiedNode modification, Optional storeMeta, Version subtreeVersion); /** * diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java index c5037bc0c6..3a3af5ecab 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java @@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.ValueNodeModi import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.MutableTreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; @@ -46,7 +47,6 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; -import com.google.common.primitives.UnsignedLong; abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareApplyOperation { @@ -95,10 +95,10 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @Override protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final UnsignedLong subtreeVersion) { - final UnsignedLong nodeVersion; + final Optional currentMeta, final Version subtreeVersion) { + final Version nodeVersion; if (currentMeta.isPresent()) { - nodeVersion = StoreUtils.increase(currentMeta.get().getVersion()); + nodeVersion = currentMeta.get().getVersion().next(); } else { nodeVersion = subtreeVersion; } @@ -132,7 +132,7 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @SuppressWarnings({ "rawtypes", "unchecked" }) private TreeNode mutateChildren(final MutableTreeNode meta, final NormalizedNodeContainerBuilder data, - final UnsignedLong nodeVersion, final Iterable modifications) { + final Version nodeVersion, final Iterable modifications) { for (ModifiedNode mod : modifications) { final PathArgument id = mod.getIdentifier(); @@ -155,16 +155,16 @@ abstract class NormalizedNodeContainerModificationStrategy extends SchemaAwareAp @Override protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final UnsignedLong subtreeVersion) { + final Version subtreeVersion) { // For Node Containers - merge is same as subtree change - we only replace children. return applySubtreeChange(modification, currentMeta, subtreeVersion); } @Override public TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final UnsignedLong subtreeVersion) { + final TreeNode currentMeta, final Version subtreeVersion) { // Bump subtree version to its new target - final UnsignedLong updatedSubtreeVersion = StoreUtils.increase(currentMeta.getSubtreeVersion()); + final Version updatedSubtreeVersion = currentMeta.getSubtreeVersion().next(); final MutableTreeNode newMeta = currentMeta.mutable(); newMeta.setSubtreeVersion(updatedSubtreeVersion); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java index 0a5fad3e8b..ff90d57f49 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java @@ -8,11 +8,11 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; 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.primitives.UnsignedLong; final class OperationWithModification { @@ -44,7 +44,7 @@ final class OperationWithModification { return applyOperation; } - public Optional apply(final Optional data, final UnsignedLong subtreeVersion) { + public Optional apply(final Optional data, final Version subtreeVersion) { return applyOperation.apply(modification, data, subtreeVersion); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java index a0730e44da..bdf5667b67 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java @@ -22,6 +22,7 @@ import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.NormalizedNod import org.opendaylight.controller.md.sal.dom.store.impl.tree.data.ValueNodeModificationStrategy.LeafModificationStrategy; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.AugmentationIdentifier; @@ -42,7 +43,6 @@ import org.slf4j.LoggerFactory; import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedLong; abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareApplyOperation.class); @@ -184,7 +184,7 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { @Override public final Optional apply(final ModifiedNode modification, - final Optional currentMeta, final UnsignedLong subtreeVersion) { + final Optional currentMeta, final Version subtreeVersion) { switch (modification.getType()) { case DELETE: @@ -208,13 +208,13 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } protected abstract TreeNode applyMerge(ModifiedNode modification, - TreeNode currentMeta, UnsignedLong subtreeVersion); + TreeNode currentMeta, Version subtreeVersion); protected abstract TreeNode applyWrite(ModifiedNode modification, - Optional currentMeta, UnsignedLong subtreeVersion); + Optional currentMeta, Version subtreeVersion); protected abstract TreeNode applySubtreeChange(ModifiedNode modification, - TreeNode currentMeta, UnsignedLong subtreeVersion); + TreeNode currentMeta, Version subtreeVersion); protected abstract void checkSubtreeModificationApplicable(InstanceIdentifier path, final NodeModification modification, final Optional current) throws DataPreconditionFailedException; @@ -231,19 +231,19 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { @Override protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final UnsignedLong subtreeVersion) { + final Version subtreeVersion) { return applyWrite(modification, Optional.of(currentMeta), subtreeVersion); } @Override protected TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final UnsignedLong subtreeVersion) { + final TreeNode currentMeta, final Version subtreeVersion) { throw new UnsupportedOperationException("UnkeyedList does not support subtree change."); } @Override protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final UnsignedLong subtreeVersion) { + final Optional currentMeta, final Version subtreeVersion) { return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), subtreeVersion); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java index 6250b30702..5f68782a2e 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java @@ -12,6 +12,7 @@ import static com.google.common.base.Preconditions.checkArgument; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataPreconditionFailedException; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; @@ -22,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedLong; abstract class ValueNodeModificationStrategy extends SchemaAwareApplyOperation { @@ -48,21 +48,21 @@ abstract class ValueNodeModificationStrategy extends S @Override protected TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final UnsignedLong subtreeVersion) { + final TreeNode currentMeta, final Version subtreeVersion) { throw new UnsupportedOperationException("Node " + schema.getPath() + "is leaf type node. Subtree change is not allowed."); } @Override protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final UnsignedLong subtreeVersion) { + final Version subtreeVersion) { // Just overwrite whatever was there return applyWrite(modification, null, subtreeVersion); } @Override protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final UnsignedLong subtreeVersion) { + final Optional currentMeta, final Version subtreeVersion) { return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), subtreeVersion); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java index 1cf28a36d1..1444f0c6a8 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java @@ -11,16 +11,15 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedLong; /* * A very basic data tree node. */ abstract class AbstractTreeNode implements TreeNode { private final NormalizedNode data; - private final UnsignedLong version; + private final Version version; - protected AbstractTreeNode(final NormalizedNode data, final UnsignedLong version) { + protected AbstractTreeNode(final NormalizedNode data, final Version version) { this.data = Preconditions.checkNotNull(data); this.version = Preconditions.checkNotNull(version); } @@ -31,7 +30,7 @@ abstract class AbstractTreeNode implements TreeNode { } @Override - public final UnsignedLong getVersion() { + public final Version getVersion() { return version; } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java index 20bf61914f..8f74f60498 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java @@ -18,7 +18,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.OrderedNodeContainer; import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedLong; /** * A TreeNode capable of holding child nodes. The fact that any of the children @@ -26,17 +25,17 @@ import com.google.common.primitives.UnsignedLong; */ final class ContainerNode extends AbstractTreeNode { private final Map children; - private final UnsignedLong subtreeVersion; + private final Version subtreeVersion; - protected ContainerNode(final NormalizedNode data, final UnsignedLong version, - final Map children, final UnsignedLong subtreeVersion) { + protected ContainerNode(final NormalizedNode data, final Version version, + final Map children, final Version subtreeVersion) { super(data, version); this.children = Preconditions.checkNotNull(children); this.subtreeVersion = Preconditions.checkNotNull(subtreeVersion); } @Override - public UnsignedLong getSubtreeVersion() { + public Version getSubtreeVersion() { return subtreeVersion; } @@ -52,9 +51,9 @@ final class ContainerNode extends AbstractTreeNode { private static final class Mutable implements MutableTreeNode { private final Map children; - private final UnsignedLong version; + private final Version version; private NormalizedNode data; - private UnsignedLong subtreeVersion; + private Version subtreeVersion; private Mutable(final ContainerNode parent) { this.data = parent.getData(); @@ -69,7 +68,7 @@ final class ContainerNode extends AbstractTreeNode { } @Override - public void setSubtreeVersion(final UnsignedLong subtreeVersion) { + public void setSubtreeVersion(final Version subtreeVersion) { this.subtreeVersion = Preconditions.checkNotNull(subtreeVersion); } @@ -102,7 +101,8 @@ final class ContainerNode extends AbstractTreeNode { } } - private static ContainerNode create(final UnsignedLong version, final NormalizedNode data, final Iterable> children) { + private static ContainerNode create(final Version version, final NormalizedNode data, + final Iterable> children) { final Map map = new HashMap<>(); for (NormalizedNode child : children) { @@ -112,11 +112,11 @@ final class ContainerNode extends AbstractTreeNode { return new ContainerNode(data, version, map, version); } - public static ContainerNode create(final UnsignedLong version, final NormalizedNodeContainer> container) { + public static ContainerNode create(final Version version, final NormalizedNodeContainer> container) { return create(version, container, container.getValue()); } - public static ContainerNode create(final UnsignedLong version, final OrderedNodeContainer> container) { + public static ContainerNode create(final Version version, final OrderedNodeContainer> container) { return create(version, container, container.getValue()); } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java index 84300a9fd0..dd3672cf11 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java @@ -11,11 +11,9 @@ import org.opendaylight.controller.md.sal.dom.store.impl.tree.StoreTreeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import com.google.common.primitives.UnsignedLong; - public interface MutableTreeNode extends StoreTreeNode { void setData(NormalizedNode data); - void setSubtreeVersion(UnsignedLong subtreeVersion); + void setSubtreeVersion(Version subtreeVersion); void addChild(TreeNode child); void removeChild(PathArgument id); TreeNode seal(); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java index e3c35917e2..b0beb8168b 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java @@ -12,8 +12,6 @@ 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.primitives.UnsignedLong; - /* * A very basic data tree node. It has a version (when it was last modified), * a subtree version (when any of its children were modified) and some read-only @@ -25,14 +23,14 @@ public interface TreeNode extends Identifiable, StoreTreeNode data, final UnsignedLong version) { + public static final TreeNode createTreeNode(final NormalizedNode data, final Version version) { if (data instanceof NormalizedNodeContainer) { @SuppressWarnings("unchecked") NormalizedNodeContainer> container = (NormalizedNodeContainer>) data; diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java index cbd2a17081..7194faadf6 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java @@ -13,12 +13,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedLong; final class ValueNode extends AbstractTreeNode { private static final Logger LOG = LoggerFactory.getLogger(ValueNode.class); - protected ValueNode(final NormalizedNode data, final UnsignedLong version) { + protected ValueNode(final NormalizedNode data, final Version version) { super(data, version); } @@ -29,7 +28,7 @@ final class ValueNode extends AbstractTreeNode { } @Override - public UnsignedLong getSubtreeVersion() { + public Version getSubtreeVersion() { return getVersion(); } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java new file mode 100644 index 0000000000..09a35d3b1a --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.md.sal.dom.store.impl.tree.spi; + +/** + * The concept of a version, either node version, or a subtree version. The + * only interface contract this class has is that no two versions are the + * same. + */ +public final class Version { + private Version() { + + } + + /** + * Create a new version, distinct from any other version. + * + * @return a new version. + */ + public Version next() { + return new Version(); + } + + /** + * Create an initial version. + * + * @return a new version. + */ + public static final Version initial() { + return new Version(); + } +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java index abaa4d1eca..4fb190fc82 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java +++ b/opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java @@ -30,6 +30,7 @@ import org.opendaylight.controller.md.sal.dom.store.impl.TestModel; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTree; import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeModification; import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNodeFactory; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.Version; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -41,7 +42,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableCo import org.opendaylight.yangtools.yang.model.api.SchemaContext; import com.google.common.base.Optional; -import com.google.common.primitives.UnsignedLong; /** * @@ -150,7 +150,7 @@ public class ModificationMetadataTreeTest { @Test public void basicReadWrites() { DataTreeModification modificationTree = new InMemoryDataTreeModification(new InMemoryDataTreeSnapshot(schemaContext, - TreeNodeFactory.createTreeNode(createDocumentOne(), UnsignedLong.valueOf(5)), applyOper), + TreeNodeFactory.createTreeNode(createDocumentOne(), Version.initial()), applyOper), new SchemaAwareApplyOperationRoot(schemaContext)); Optional> originalBarNode = modificationTree.readNode(OUTER_LIST_2_PATH); assertTrue(originalBarNode.isPresent());