Madan Jampani
Committed by Gerrit Code Review

DocumentTreeNode: add support for a version

Change-Id: Ib07503beda17b904ce6b6f52d7bf9d3622085a24
...@@ -16,24 +16,25 @@ ...@@ -16,24 +16,25 @@
16 16
17 package org.onosproject.store.primitives; 17 package org.onosproject.store.primitives;
18 18
19 -import com.google.common.base.MoreObjects; 19 +import static com.google.common.base.Preconditions.checkNotNull;
20 -import com.google.common.collect.Sets;
21 -import org.onosproject.store.service.DocumentPath;
22 20
23 import java.util.Comparator; 21 import java.util.Comparator;
24 import java.util.Iterator; 22 import java.util.Iterator;
25 import java.util.Objects; 23 import java.util.Objects;
26 import java.util.TreeSet; 24 import java.util.TreeSet;
27 25
28 -import static com.google.common.base.Preconditions.checkNotNull; 26 +import org.onosproject.store.service.DocumentPath;
27 +
28 +import com.google.common.base.MoreObjects;
29 +import com.google.common.collect.Sets;
29 30
30 /** 31 /**
31 - * A tree node made for {@code DocumentTree} 32 + * A {@code DocumentTree} node.
32 - * implementations that keeps records of its parent and children.
33 */ 33 */
34 public class DocumentTreeNode<V> { 34 public class DocumentTreeNode<V> {
35 private final DocumentPath key; 35 private final DocumentPath key;
36 private V value; 36 private V value;
37 + private long version;
37 private final TreeSet<DocumentTreeNode<V>> children = 38 private final TreeSet<DocumentTreeNode<V>> children =
38 Sets.newTreeSet(new Comparator<DocumentTreeNode<V>>() { 39 Sets.newTreeSet(new Comparator<DocumentTreeNode<V>>() {
39 @Override 40 @Override
...@@ -42,17 +43,20 @@ public class DocumentTreeNode<V> { ...@@ -42,17 +43,20 @@ public class DocumentTreeNode<V> {
42 return o1.getKey().compareTo(o2.getKey()); 43 return o1.getKey().compareTo(o2.getKey());
43 } 44 }
44 }); 45 });
45 - private DocumentTreeNode parent; 46 + private final DocumentTreeNode<V> parent;
46 47
47 - public DocumentTreeNode(DocumentPath key, V value, 48 + public DocumentTreeNode(DocumentPath key,
48 - DocumentTreeNode parent) { 49 + V value,
50 + long version,
51 + DocumentTreeNode<V> parent) {
49 this.key = checkNotNull(key); 52 this.key = checkNotNull(key);
50 this.value = checkNotNull(value); 53 this.value = checkNotNull(value);
54 + this.version = version;
51 this.parent = parent; 55 this.parent = parent;
52 } 56 }
53 57
54 /** 58 /**
55 - * Returns this objects key. 59 + * Returns this node's key.
56 * 60 *
57 * @return the key 61 * @return the key
58 */ 62 */
...@@ -61,7 +65,7 @@ public class DocumentTreeNode<V> { ...@@ -61,7 +65,7 @@ public class DocumentTreeNode<V> {
61 } 65 }
62 66
63 /** 67 /**
64 - * Returns this objects value. 68 + * Returns this node's value.
65 * 69 *
66 * @return the value 70 * @return the value
67 */ 71 */
...@@ -70,18 +74,29 @@ public class DocumentTreeNode<V> { ...@@ -70,18 +74,29 @@ public class DocumentTreeNode<V> {
70 } 74 }
71 75
72 /** 76 /**
73 - * Sets this objects value. 77 + * Returns this node's version.
78 + *
79 + * @return the version
80 + */
81 + public long getVersion() {
82 + return version;
83 + }
84 +
85 + /**
86 + * Updates this node.
74 * 87 *
75 - * @param value the value to be set 88 + * @param newValue new value to be set
89 + * @param newVersion new version to be set
76 */ 90 */
77 - public void setValue(V value) { 91 + public void update(V newValue, long newVersion) {
78 - this.value = value; 92 + this.value = newValue;
93 + this.version = newVersion;
79 } 94 }
80 95
81 /** 96 /**
82 * Returns a collection of the children of this node. 97 * Returns a collection of the children of this node.
83 * 98 *
84 - * @return a sorted iterator for the children of this node. 99 + * @return iterator for the children of this node.
85 */ 100 */
86 public Iterator<DocumentTreeNode<V>> getChildren() { 101 public Iterator<DocumentTreeNode<V>> getChildren() {
87 return children.iterator(); 102 return children.iterator();
...@@ -91,19 +106,17 @@ public class DocumentTreeNode<V> { ...@@ -91,19 +106,17 @@ public class DocumentTreeNode<V> {
91 * Adds a child to this node. 106 * Adds a child to this node.
92 * 107 *
93 * @param child the child node to be added 108 * @param child the child node to be added
94 - * @return true if the child set was modified as a result of this call, 109 + * @return {@code true} if the child set was modified as a result of this call, {@code false} otherwise
95 - * false otherwise
96 */ 110 */
97 public boolean addChild(DocumentTreeNode<V> child) { 111 public boolean addChild(DocumentTreeNode<V> child) {
98 return children.add(child); 112 return children.add(child);
99 } 113 }
100 114
101 /** 115 /**
102 - * Removes a child from the children of this node. 116 + * Removes a child node.
103 * 117 *
104 * @param child the child node to be removed 118 * @param child the child node to be removed
105 - * @return true if the child set was modified as a result of this call, 119 + * @return {@code true} if the child set was modified as a result of this call, {@code false} otherwise
106 - * false otherwise
107 */ 120 */
108 public boolean removeChild(String child) { 121 public boolean removeChild(String child) {
109 return children.remove(child); 122 return children.remove(child);
...@@ -126,10 +139,10 @@ public class DocumentTreeNode<V> { ...@@ -126,10 +139,10 @@ public class DocumentTreeNode<V> {
126 @Override 139 @Override
127 public boolean equals(Object obj) { 140 public boolean equals(Object obj) {
128 if (obj instanceof DocumentTreeNode) { 141 if (obj instanceof DocumentTreeNode) {
129 - DocumentTreeNode that = (DocumentTreeNode) obj; 142 + DocumentTreeNode<V> that = (DocumentTreeNode<V>) obj;
130 if (this.parent.equals(that.parent)) { 143 if (this.parent.equals(that.parent)) {
131 if (this.children.size() == that.children.size()) { 144 if (this.children.size() == that.children.size()) {
132 - for (DocumentTreeNode child : this.children) { 145 + for (DocumentTreeNode<V> child : this.children) {
133 if (!that.children.contains(child)) { 146 if (!that.children.contains(child)) {
134 return false; 147 return false;
135 } 148 }
...@@ -148,7 +161,7 @@ public class DocumentTreeNode<V> { ...@@ -148,7 +161,7 @@ public class DocumentTreeNode<V> {
148 .add("parent", this.parent) 161 .add("parent", this.parent)
149 .add("key", this.key) 162 .add("key", this.key)
150 .add("value", this.value); 163 .add("value", this.value);
151 - for (DocumentTreeNode child : children) { 164 + for (DocumentTreeNode<V> child : children) {
152 helper = helper.add("child", child.key); 165 helper = helper.add("child", child.key);
153 } 166 }
154 return helper.toString(); 167 return helper.toString();
......
...@@ -72,6 +72,28 @@ public interface DocumentTree<V> { ...@@ -72,6 +72,28 @@ public interface DocumentTree<V> {
72 boolean createNode(DocumentPath path, V value); 72 boolean createNode(DocumentPath path, V value);
73 73
74 /** 74 /**
75 + * Conditionally updates a tree node if the current version matches a specified version.
76 + *
77 + * @param path path for the node to create
78 + * @param newValue the non-null value to be associated with the key
79 + * @param version current version of the value for update to occur
80 + * @return returns {@code true} if the update was made, {@code false} otherwise
81 + * @throws NoSuchDocumentPathException if the parent node (for the node to create) does not exist
82 + */
83 + boolean replace(DocumentPath path, V newValue, long version);
84 +
85 + /**
86 + * Conditionally updates a tree node if the current value matches a specified value.
87 + *
88 + * @param path path for the node to create
89 + * @param newValue the non-null value to be associated with the key
90 + * @param currentValue current value for update to occur
91 + * @return returns {@code true} if the update was made, {@code false} otherwise
92 + * @throws NoSuchDocumentPathException if the parent node (for the node to create) does not exist
93 + */
94 + boolean replace(DocumentPath path, V newValue, V currentValue);
95 +
96 + /**
75 * Removes the node with the specified path. 97 * Removes the node with the specified path.
76 * 98 *
77 * is not a leaf node i.e has one or more children 99 * is not a leaf node i.e has one or more children
......