blob: 457caeb2e76de7f4ae8f38078f8823e9861b4292 [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.
37 * @param timestamp timestamp for tombstone
38 * @return tombstone MapValue
39 *
40 * @param <U> value type
41 */
42 public static <U> MapValue<U> tombstone(Timestamp timestamp) {
Madan Jampani29f52a32016-04-18 15:20:52 -070043 return new MapValue<>(null, timestamp, System.currentTimeMillis());
Madan Jampani43f37952015-07-02 12:54:08 -070044 }
45
Madan Jampani3d76c942015-06-29 23:37:10 -070046 public MapValue(V value, Timestamp timestamp) {
Madan Jampani29f52a32016-04-18 15:20:52 -070047 this(value, timestamp, System.currentTimeMillis());
48 }
49
50 /**
51 * Constructor.
52 *
53 * @param value value
54 * @param timestamp value timestamp.
55 * @param creationTime the system time (on local instance) of construction
56 */
57 public MapValue(V value, Timestamp timestamp, long creationTime) {
Madan Jampani3d76c942015-06-29 23:37:10 -070058 this.value = value;
Brian O'Connor777b0ae2015-12-08 19:38:18 -080059 this.timestamp = checkNotNull(timestamp, "Timestamp cannot be null");
Madan Jampani29f52a32016-04-18 15:20:52 -070060 this.creationTime = creationTime;
61 }
62
63 /**
64 * Creates a copy of MapValue.
65 * <p>
66 * The copy will have an updated creation time corresponding to when the copy was constructed.
67 *
68 * @return MapValue copy
69 */
70 public MapValue<V> copy() {
71 return new MapValue<>(this.value, this.timestamp, System.currentTimeMillis());
Madan Jampani3d76c942015-06-29 23:37:10 -070072 }
73
74 public boolean isTombstone() {
75 return value == null;
76 }
77
78 public boolean isAlive() {
79 return value != null;
80 }
81
82 public Timestamp timestamp() {
83 return timestamp;
84 }
85
86 public V get() {
87 return value;
88 }
89
Madan Jampani29f52a32016-04-18 15:20:52 -070090 public long creationTime() {
91 return creationTime;
92 }
93
Madan Jampani3d76c942015-06-29 23:37:10 -070094 @Override
95 public int compareTo(MapValue<V> o) {
96 return this.timestamp.compareTo(o.timestamp);
97 }
98
99 public boolean isNewerThan(MapValue<V> other) {
Brian O'Connor777b0ae2015-12-08 19:38:18 -0800100 if (other == null) {
101 return true;
102 }
103 return this.timestamp.isNewerThan(other.timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -0700104 }
105
106 public boolean isNewerThan(Timestamp timestamp) {
Madan Jampanidbe67032015-07-08 22:48:09 -0700107 return this.timestamp.isNewerThan(timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -0700108 }
109
110 public Digest digest() {
111 return new Digest(timestamp, isTombstone());
112 }
113
114 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -0700115 public int hashCode() {
116 return Objects.hashCode(timestamp, value);
117 }
118
Madan Jampani92c64eb2015-07-23 15:37:07 -0700119 @SuppressWarnings("unchecked")
Madan Jampanidbe67032015-07-08 22:48:09 -0700120 @Override
121 public boolean equals(Object other) {
122 if (other instanceof MapValue) {
Madan Jampani92c64eb2015-07-23 15:37:07 -0700123 MapValue<V> that = (MapValue<V>) other;
Madan Jampanidbe67032015-07-08 22:48:09 -0700124 return Objects.equal(this.timestamp, that.timestamp) &&
125 Objects.equal(this.value, that.value);
126 }
127 return false;
128 }
129
130 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700131 public String toString() {
132 return MoreObjects.toStringHelper(getClass())
133 .add("timestamp", timestamp)
134 .add("value", value)
135 .toString();
136 }
137
138 @SuppressWarnings("unused")
139 private MapValue() {
140 this.timestamp = null;
141 this.value = null;
142 }
143
144 /**
145 * Digest or summary of a MapValue for use during Anti-Entropy exchanges.
146 */
147 public static class Digest {
148 private final Timestamp timestamp;
149 private final boolean isTombstone;
150
151 public Digest(Timestamp timestamp, boolean isTombstone) {
152 this.timestamp = timestamp;
153 this.isTombstone = isTombstone;
154 }
155
156 public Timestamp timestamp() {
157 return timestamp;
158 }
159
160 public boolean isTombstone() {
161 return isTombstone;
162 }
163
164 public boolean isNewerThan(Digest other) {
165 return timestamp.isNewerThan(other.timestamp);
166 }
167
168 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -0700169 public int hashCode() {
170 return Objects.hashCode(timestamp, isTombstone);
171 }
172
173 @Override
174 public boolean equals(Object other) {
175 if (other instanceof Digest) {
176 Digest that = (Digest) other;
177 return Objects.equal(this.timestamp, that.timestamp) &&
178 Objects.equal(this.isTombstone, that.isTombstone);
179 }
180 return false;
181 }
182
183 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700184 public String toString() {
185 return MoreObjects.toStringHelper(getClass())
186 .add("timestamp", timestamp)
187 .add("isTombstone", isTombstone)
188 .toString();
189 }
190 }
191}