Merge "BUG-509: introduce Version concept"
authorTony Tkacik <ttkacik@cisco.com>
Fri, 23 May 2014 14:09:24 +0000 (14:09 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 23 May 2014 14:09:24 +0000 (14:09 +0000)
17 files changed:
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/AlwaysFailOperation.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTree.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeFactory.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeModification.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationApplyOperation.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/NormalizedNodeContainerModificationStrategy.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/OperationWithModification.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/SchemaAwareApplyOperation.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ValueNodeModificationStrategy.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/AbstractTreeNode.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ContainerNode.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/MutableTreeNode.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNode.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/TreeNodeFactory.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/ValueNode.java
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/spi/Version.java [new file with mode: 0644]
opendaylight/md-sal/sal-dom-broker/src/test/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/ModificationMetadataTreeTest.java

index 7f66f7ff7e54090a9b101246c14cba338ba09403..15479be462ac6580ddc50f2ec19de45ae0b1fd45 100644 (file)
@@ -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<TreeNode> apply(final ModifiedNode modification,
-            final Optional<TreeNode> storeMeta, final UnsignedLong subtreeVersion) {
+            final Optional<TreeNode> storeMeta, final Version subtreeVersion) {
         throw new IllegalStateException("Schema Context is not available.");
     }
 
index ae71ed9adfdb43ac3d53f92313cf3747c2f4c11b..d3495b542a25f4a05ffa1a2f83e92808c56e6ca3 100644 (file)
@@ -101,7 +101,8 @@ final class InMemoryDataTree implements DataTree {
 
         rwLock.writeLock().lock();
         try {
-            final Optional<TreeNode> newRoot = m.getStrategy().apply(m.getRootModification(), Optional.<TreeNode>of(rootNode), StoreUtils.increase(rootNode.getSubtreeVersion()));
+            final Optional<TreeNode> newRoot = m.getStrategy().apply(m.getRootModification(),
+                    Optional.<TreeNode>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 {
index 82ffad507d4a8490efd6abd0aaedc8ca0c1edeee..4640be43e71cc431e327e45711ec3999862d73fa 100644 (file)
@@ -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);
     }
 
     /**
index d3e4bf07144e0e99ebe3be6e8e322c5fb9cf4b1d..c05ed4b442d0fa964fa94d88fb9526a5c88673c6 100644 (file)
@@ -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;
index a72d4fb5791e9b10a48151274a964ffafc48a2ce..10f39a8cefa045bfce6b356b63d3c1c0b3782c4f 100644 (file)
@@ -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<ModificationApplyOper
      *         node, {@link Optional#absent()} if {@link ModifiedNode}
      *         resulted in deletion of this node.
      */
-    Optional<TreeNode> apply(ModifiedNode modification, Optional<TreeNode> storeMeta, UnsignedLong subtreeVersion);
+    Optional<TreeNode> apply(ModifiedNode modification, Optional<TreeNode> storeMeta, Version subtreeVersion);
 
     /**
      *
index c5037bc0c64714cb10de717a6c46954f8d5cf78b..3a3af5ecab966049196c576df7f6c7bd24b560a2 100644 (file)
@@ -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<TreeNode> currentMeta, final UnsignedLong subtreeVersion) {
-        final UnsignedLong nodeVersion;
+            final Optional<TreeNode> 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<ModifiedNode> modifications) {
+            final Version nodeVersion, final Iterable<ModifiedNode> 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);
index 0a5fad3e8b485cf344fbeba19732996cdc45725e..ff90d57f49795ef0927e5c7bd00f89684078d004 100644 (file)
@@ -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<TreeNode> apply(final Optional<TreeNode> data, final UnsignedLong subtreeVersion) {
+    public Optional<TreeNode> apply(final Optional<TreeNode> data, final Version subtreeVersion) {
         return applyOperation.apply(modification, data, subtreeVersion);
     }
 
index a0730e44daec0ae5bc5a11117140d398d0ab1c20..bdf5667b67d92568c5b538d294ee417aabbe76df 100644 (file)
@@ -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<TreeNode> apply(final ModifiedNode modification,
-            final Optional<TreeNode> currentMeta, final UnsignedLong subtreeVersion) {
+            final Optional<TreeNode> 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<TreeNode> currentMeta, UnsignedLong subtreeVersion);
+            Optional<TreeNode> 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<TreeNode> 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<TreeNode> currentMeta, final UnsignedLong subtreeVersion) {
+                final Optional<TreeNode> currentMeta, final Version subtreeVersion) {
             return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), subtreeVersion);
         }
 
index 6250b307026b72a2f480f2646e236e2ddf7e1440..5f68782a2e70a309abfff0ff2b99c5a1321b6fce 100644 (file)
@@ -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<T extends DataSchemaNode> extends SchemaAwareApplyOperation {
 
@@ -48,21 +48,21 @@ abstract class ValueNodeModificationStrategy<T extends DataSchemaNode> 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<TreeNode> currentMeta, final UnsignedLong subtreeVersion) {
+            final Optional<TreeNode> currentMeta, final Version subtreeVersion) {
         return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), subtreeVersion);
     }
 
index 1cf28a36d1bdc2fcb162467d118e631293eaf7c2..1444f0c6a859c43bfc39c39c8b1ad26e3374bc63 100644 (file)
@@ -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;
     }
 
index 20bf61914f57af53e98a9250a3be0877611e9767..8f74f60498aeb515435e65b5fb4d5dd3725d9be2 100644 (file)
@@ -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<PathArgument, TreeNode> children;
-    private final UnsignedLong subtreeVersion;
+    private final Version subtreeVersion;
 
-    protected ContainerNode(final NormalizedNode<?, ?> data, final UnsignedLong version,
-            final Map<PathArgument, TreeNode> children, final UnsignedLong subtreeVersion) {
+    protected ContainerNode(final NormalizedNode<?, ?> data, final Version version,
+            final Map<PathArgument, TreeNode> 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<PathArgument, TreeNode> 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<NormalizedNode<?, ?>> children) {
+    private static ContainerNode create(final Version version, final NormalizedNode<?, ?> data,
+            final Iterable<NormalizedNode<?, ?>> children) {
         final Map<PathArgument, TreeNode> 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<?, ?, NormalizedNode<?, ?>> container) {
+    public static ContainerNode create(final Version version, final NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>> container) {
         return create(version, container, container.getValue());
     }
 
-    public static ContainerNode create(final UnsignedLong version, final OrderedNodeContainer<NormalizedNode<?, ?>> container) {
+    public static ContainerNode create(final Version version, final OrderedNodeContainer<NormalizedNode<?, ?>> container) {
         return create(version, container, container.getValue());
     }
 }
index 84300a9fd0314f395f91437e9f052e6fadd21c2f..dd3672cf113e8a785acfa434ba112079fa305f90 100644 (file)
@@ -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<TreeNode> {
     void setData(NormalizedNode<?, ?> data);
-    void setSubtreeVersion(UnsignedLong subtreeVersion);
+    void setSubtreeVersion(Version subtreeVersion);
     void addChild(TreeNode child);
     void removeChild(PathArgument id);
     TreeNode seal();
index e3c35917e226f4c7505bcbb3e3ce13dcac6c407b..b0beb8168befede9c70bdee711ec05084997887a 100644 (file)
@@ -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<PathArgument>, StoreTreeNode<Tree
      *
      * @return Current data node version.
      */
-    UnsignedLong getVersion();
+    Version getVersion();
 
     /**
      * Get the subtree version.
      *
      * @return Current subtree version.
      */
-    UnsignedLong getSubtreeVersion();
+    Version getSubtreeVersion();
 
     /**
      * Get a read-only view of the underlying data.
index 03c3ab8447955db9982fdfb833864ad9c9565670..c5d174caad9dcbe35ac81d83dcce39e7291f0364 100644 (file)
@@ -11,8 +11,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
 import org.opendaylight.yangtools.yang.data.api.schema.OrderedNodeContainer;
 
-import com.google.common.primitives.UnsignedLong;
-
 public final class TreeNodeFactory {
     private TreeNodeFactory() {
         throw new UnsupportedOperationException("Utility class should not be instantiated");
@@ -26,7 +24,7 @@ public final class TreeNodeFactory {
      * @param version data node version
      * @return new AbstractTreeNode instance, covering the data tree provided
      */
-    public static final TreeNode createTreeNode(final NormalizedNode<?, ?> data, final UnsignedLong version) {
+    public static final TreeNode createTreeNode(final NormalizedNode<?, ?> data, final Version version) {
         if (data instanceof NormalizedNodeContainer<?, ?, ?>) {
             @SuppressWarnings("unchecked")
             NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>> container = (NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) data;
index cbd2a17081a8e9d877a9f484775ee6c6a40cd25b..7194faadf650a73b7cdd0cd6434592254889ec93 100644 (file)
@@ -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 (file)
index 0000000..09a35d3
--- /dev/null
@@ -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();
+    }
+}
index abaa4d1eca00e1756a1bba0b2a8a9f434f970eeb..4fb190fc8201853e094ac87ec5f1a659ab1e19bf 100644 (file)
@@ -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<NormalizedNode<?, ?>> originalBarNode = modificationTree.readNode(OUTER_LIST_2_PATH);
         assertTrue(originalBarNode.isPresent());