blob: 8d98a23304f19c9ad5df193c8fa53426a131ef8e [file] [log] [blame]
Madan Jampanidbe67032015-07-08 22:48:09 -07001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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;
33
Madan Jampani43f37952015-07-02 12:54:08 -070034 /**
35 * Creates a tombstone value with the specified timestamp.
36 * @param timestamp timestamp for tombstone
37 * @return tombstone MapValue
38 *
39 * @param <U> value type
40 */
41 public static <U> MapValue<U> tombstone(Timestamp timestamp) {
42 return new MapValue<>(null, timestamp);
43 }
44
Madan Jampani3d76c942015-06-29 23:37:10 -070045 public MapValue(V value, Timestamp timestamp) {
46 this.value = value;
Brian O'Connor777b0ae2015-12-08 19:38:18 -080047 this.timestamp = checkNotNull(timestamp, "Timestamp cannot be null");
Madan Jampani3d76c942015-06-29 23:37:10 -070048 }
49
50 public boolean isTombstone() {
51 return value == null;
52 }
53
54 public boolean isAlive() {
55 return value != null;
56 }
57
58 public Timestamp timestamp() {
59 return timestamp;
60 }
61
62 public V get() {
63 return value;
64 }
65
66 @Override
67 public int compareTo(MapValue<V> o) {
68 return this.timestamp.compareTo(o.timestamp);
69 }
70
71 public boolean isNewerThan(MapValue<V> other) {
Brian O'Connor777b0ae2015-12-08 19:38:18 -080072 if (other == null) {
73 return true;
74 }
75 return this.timestamp.isNewerThan(other.timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -070076 }
77
78 public boolean isNewerThan(Timestamp timestamp) {
Madan Jampanidbe67032015-07-08 22:48:09 -070079 return this.timestamp.isNewerThan(timestamp);
Madan Jampani3d76c942015-06-29 23:37:10 -070080 }
81
82 public Digest digest() {
83 return new Digest(timestamp, isTombstone());
84 }
85
86 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -070087 public int hashCode() {
88 return Objects.hashCode(timestamp, value);
89 }
90
Madan Jampani92c64eb2015-07-23 15:37:07 -070091 @SuppressWarnings("unchecked")
Madan Jampanidbe67032015-07-08 22:48:09 -070092 @Override
93 public boolean equals(Object other) {
94 if (other instanceof MapValue) {
Madan Jampani92c64eb2015-07-23 15:37:07 -070095 MapValue<V> that = (MapValue<V>) other;
Madan Jampanidbe67032015-07-08 22:48:09 -070096 return Objects.equal(this.timestamp, that.timestamp) &&
97 Objects.equal(this.value, that.value);
98 }
99 return false;
100 }
101
102 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700103 public String toString() {
104 return MoreObjects.toStringHelper(getClass())
105 .add("timestamp", timestamp)
106 .add("value", value)
107 .toString();
108 }
109
110 @SuppressWarnings("unused")
111 private MapValue() {
112 this.timestamp = null;
113 this.value = null;
114 }
115
116 /**
117 * Digest or summary of a MapValue for use during Anti-Entropy exchanges.
118 */
119 public static class Digest {
120 private final Timestamp timestamp;
121 private final boolean isTombstone;
122
123 public Digest(Timestamp timestamp, boolean isTombstone) {
124 this.timestamp = timestamp;
125 this.isTombstone = isTombstone;
126 }
127
128 public Timestamp timestamp() {
129 return timestamp;
130 }
131
132 public boolean isTombstone() {
133 return isTombstone;
134 }
135
136 public boolean isNewerThan(Digest other) {
137 return timestamp.isNewerThan(other.timestamp);
138 }
139
140 @Override
Madan Jampanidbe67032015-07-08 22:48:09 -0700141 public int hashCode() {
142 return Objects.hashCode(timestamp, isTombstone);
143 }
144
145 @Override
146 public boolean equals(Object other) {
147 if (other instanceof Digest) {
148 Digest that = (Digest) other;
149 return Objects.equal(this.timestamp, that.timestamp) &&
150 Objects.equal(this.isTombstone, that.isTombstone);
151 }
152 return false;
153 }
154
155 @Override
Madan Jampani3d76c942015-06-29 23:37:10 -0700156 public String toString() {
157 return MoreObjects.toStringHelper(getClass())
158 .add("timestamp", timestamp)
159 .add("isTombstone", isTombstone)
160 .toString();
161 }
162 }
163}