blob: c80806fa949c5d034a4b15ecb09ca84a5b1245f6 [file] [log] [blame]
Madan Jampanidbe67032015-07-08 22:48:09 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampanidbe67032015-07-08 22:48:09 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Madan Jampanif4c88502016-01-21 12:35:36 -080016package org.onosproject.store.primitives.impl;
Madan Jampani3d76c942015-06-29 23:37:10 -070017
18import org.onosproject.store.Timestamp;
Madan Jampanidbe67032015-07-08 22:48:09 -070019
Madan Jampani3d76c942015-06-29 23:37:10 -070020import com.google.common.base.MoreObjects;
Madan Jampanidbe67032015-07-08 22:48:09 -070021import com.google.common.base.Objects;
Madan Jampani3d76c942015-06-29 23:37:10 -070022
Brian O'Connor777b0ae2015-12-08 19:38:18 -080023import static com.google.common.base.Preconditions.checkNotNull;
24
Madan Jampani3d76c942015-06-29 23:37:10 -070025/**
26 * Representation of a value in EventuallyConsistentMap.
27 *
28 * @param <V> value type
29 */
30public class MapValue<V> implements Comparable<MapValue<V>> {
31 private final Timestamp timestamp;
32 private final V value;
Madan Jampani29f52a32016-04-18 15:20:52 -070033 private long creationTime;
Madan Jampani3d76c942015-06-29 23:37:10 -070034
Madan Jampani43f37952015-07-02 12:54:08 -070035 /**
36 * Creates a tombstone value with the specified timestamp.
sangyun-han72fd0e92016-04-26 20:50:08 +090037 *
Madan Jampani43f37952015-07-02 12:54:08 -070038 * @param timestamp timestamp for tombstone
39 * @return tombstone MapValue
40 *
41 * @param <U> value type
42 */
43 public static <U> MapValue<U> tombstone(Timestamp timestamp) {
Madan Jampani29f52a32016-04-18 15:20:52 -070044 return new MapValue<>(null, timestamp, System.currentTimeMillis());
Madan Jampani43f37952015-07-02 12:54:08 -070045 }
46
sangyun-han72fd0e92016-04-26 20:50:08 +090047 /**
48 * Constructor automatically to create the system time of construction.
49 *
50 * @param value value
51 * @param timestamp value timestamp
52 */
Madan Jampani3d76c942015-06-29 23:37:10 -070053 public MapValue(V value, Timestamp timestamp) {
Madan Jampani29f52a32016-04-18 15:20:52 -070054 this(value, timestamp, System.currentTimeMillis());
55 }
56
57 /**
sangyun-han72fd0e92016-04-26 20:50:08 +090058 * Creates a map value using value, timestamp, and creation time.
Madan Jampani29f52a32016-04-18 15:20:52 -070059 *
60 * @param value value
61 * @param timestamp value timestamp.
62 * @param creationTime the system time (on local instance) of construction
63 */
64 public MapValue(V value, Timestamp timestamp, long creationTime) {
Madan Jampani3d76c942015-06-29 23:37:10 -070065 this.value = value;
Brian O'Connor777b0ae2015-12-08 19:38:18 -080066 this.timestamp = checkNotNull(timestamp, "Timestamp cannot be null");
Madan Jampani29f52a32016-04-18 15:20:52 -070067 this.creationTime = creationTime;
68 }
69
70 /**
71 * Creates a copy of MapValue.
72 * <p>
73 * The copy will have an updated creation time corresponding to when the copy was constructed.
74 *
75 * @return MapValue copy
76 */
77 public MapValue<V> copy() {
78 return new MapValue<>(this.value, this.timestamp, System.currentTimeMillis());
Madan Jampani3d76c942015-06-29 23:37:10 -070079 }
80
sangyun-han72fd0e92016-04-26 20:50:08 +090081 /**
82 * Tests if this value is tombstone value with the specified timestamp.
83 *
84 * @return true if this value is null, otherwise false
85 */
Madan Jampani3d76c942015-06-29 23:37:10 -070086 public boolean isTombstone() {
87 return value == null;
88 }
89
sangyun-han72fd0e92016-04-26 20:50:08 +090090 /**
91 * Tests if this value is alive.
92 *
93 * @return true if this value is not null, otherwise false
94 */
Madan Jampani3d76c942015-06-29 23:37:10 -070095 public boolean isAlive() {
96 return value != null;
97 }
98
sangyun-han72fd0e92016-04-26 20:50:08 +090099 /**
100 * Returns the timestamp of this value.
101 *
102 * @return timestamp
103 */
Madan Jampani3d76c942015-06-29 23:37:10 -0700104 public Timestamp timestamp() {
105 return timestamp;
106 }
107
sangyun-han72fd0e92016-04-26 20:50:08 +0900108 /**
109 * Returns this value.
110 *
111 * @return value
112 */
Madan Jampani3d76c942015-06-29 23:37:10 -0700113 public V get() {
114 return value;
115 }
116
sangyun-han72fd0e92016-04-26 20:50:08 +0900117 /**
118 * Returns the creation time of this value.
119 *
120 * @return creationTime
121 */
Madan Jampani29f52a32016-04-18 15:20:52 -0700122 public long creationTime() {
123 return creationTime;
124 }
125
sangyun-han72fd0e92016-04-26 20:50:08 +0900126 /**
127 * Tests if this value is newer than the specified MapValue.
128 *
129 * @param other the value to be compared
130 * @return true if this value is newer than other
131 */
Madan Jampani3d76c942015-06-29 23:37:10 -0700132 public boolean isNewerThan(MapValue<V> other) {
Brian O'Connor777b0ae2015-12-08 19:38:18 -0800133 if (other == null) {
134 return true;
135 }
136 return this.timestamp.isNewerThan(other.timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -0700137 }
138
sangyun-han72fd0e92016-04-26 20:50:08 +0900139 /**
140 * Tests if this timestamp is newer than the specified timestamp.
141 *
142 * @param timestamp timestamp to be compared
143 * @return true if this instance is newer
144 */
Madan Jampani3d76c942015-06-29 23:37:10 -0700145 public boolean isNewerThan(Timestamp timestamp) {
Madan Jampanidbe67032015-07-08 22:48:09 -0700146 return this.timestamp.isNewerThan(timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -0700147 }
148
sangyun-han72fd0e92016-04-26 20:50:08 +0900149 /**
150 * Returns summary of a MapValue for use during Anti-Entropy exchanges.
151 *
152 * @return Digest with timestamp and whether this value is null or not
153 */
Madan Jampani3d76c942015-06-29 23:37:10 -0700154 public Digest digest() {
155 return new Digest(timestamp, isTombstone());
156 }
157
158 @Override
sangyun-han72fd0e92016-04-26 20:50:08 +0900159 public int compareTo(MapValue<V> o) {
160 return this.timestamp.compareTo(o.timestamp);
161 }
162
163 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -0700164 public int hashCode() {
165 return Objects.hashCode(timestamp, value);
166 }
167
Madan Jampani92c64eb2015-07-23 15:37:07 -0700168 @SuppressWarnings("unchecked")
Madan Jampanidbe67032015-07-08 22:48:09 -0700169 @Override
170 public boolean equals(Object other) {
171 if (other instanceof MapValue) {
Madan Jampani92c64eb2015-07-23 15:37:07 -0700172 MapValue<V> that = (MapValue<V>) other;
Madan Jampanidbe67032015-07-08 22:48:09 -0700173 return Objects.equal(this.timestamp, that.timestamp) &&
174 Objects.equal(this.value, that.value);
175 }
176 return false;
177 }
178
179 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700180 public String toString() {
181 return MoreObjects.toStringHelper(getClass())
182 .add("timestamp", timestamp)
183 .add("value", value)
184 .toString();
185 }
186
187 @SuppressWarnings("unused")
188 private MapValue() {
189 this.timestamp = null;
190 this.value = null;
191 }
192
193 /**
194 * Digest or summary of a MapValue for use during Anti-Entropy exchanges.
195 */
196 public static class Digest {
197 private final Timestamp timestamp;
198 private final boolean isTombstone;
199
200 public Digest(Timestamp timestamp, boolean isTombstone) {
201 this.timestamp = timestamp;
202 this.isTombstone = isTombstone;
203 }
204
205 public Timestamp timestamp() {
206 return timestamp;
207 }
208
209 public boolean isTombstone() {
210 return isTombstone;
211 }
212
213 public boolean isNewerThan(Digest other) {
214 return timestamp.isNewerThan(other.timestamp);
215 }
216
217 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -0700218 public int hashCode() {
219 return Objects.hashCode(timestamp, isTombstone);
220 }
221
222 @Override
223 public boolean equals(Object other) {
224 if (other instanceof Digest) {
225 Digest that = (Digest) other;
226 return Objects.equal(this.timestamp, that.timestamp) &&
227 Objects.equal(this.isTombstone, that.isTombstone);
228 }
229 return false;
230 }
231
232 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700233 public String toString() {
234 return MoreObjects.toStringHelper(getClass())
235 .add("timestamp", timestamp)
236 .add("isTombstone", isTombstone)
237 .toString();
238 }
239 }
240}