blob: f994e02303655e1caeb1deeb72514427e43c238e [file] [log] [blame]
Yuta HIGUCHI497c8842014-09-25 14:23:34 -07001package org.onlab.onos.store.impl;
2
3import static com.google.common.base.Preconditions.checkNotNull;
4import static com.google.common.base.Preconditions.checkArgument;
5
6import java.util.Objects;
7
8import org.onlab.onos.net.ElementId;
9import org.onlab.onos.store.Timestamp;
10
11import com.google.common.base.MoreObjects;
12import com.google.common.collect.ComparisonChain;
13
14// If it is store specific, implement serializable interfaces?
15/**
16 * Default implementation of Timestamp.
17 */
18public final class OnosTimestamp implements Timestamp {
19
20 private final ElementId id;
21 private final int termNumber;
22 private final int sequenceNumber;
23
24 /**
25 * Default version tuple.
26 *
27 * @param id identifier of the element
28 * @param termNumber the mastership termNumber
29 * @param sequenceNumber the sequenceNumber number within the termNumber
30 */
31 public OnosTimestamp(ElementId id, int termNumber, int sequenceNumber) {
32 this.id = checkNotNull(id);
33 this.termNumber = termNumber;
34 this.sequenceNumber = sequenceNumber;
35 }
36
37 @Override
38 public int compareTo(Timestamp o) {
39 checkArgument(o instanceof OnosTimestamp, "Must be OnosTimestamp", o);
40 OnosTimestamp that = (OnosTimestamp) o;
41 checkArgument(this.id.equals(that.id),
42 "Cannot compare version for different element this:%s, that:%s",
43 this, that);
44
45 return ComparisonChain.start()
46 .compare(this.termNumber, that.termNumber)
47 .compare(this.sequenceNumber, that.sequenceNumber)
48 .result();
49 }
50
51 @Override
52 public int hashCode() {
53 return Objects.hash(id, termNumber, sequenceNumber);
54 }
55
56 @Override
57 public boolean equals(Object obj) {
58 if (this == obj) {
59 return true;
60 }
61 if (!(obj instanceof OnosTimestamp)) {
62 return false;
63 }
64 OnosTimestamp that = (OnosTimestamp) obj;
65 return Objects.equals(this.id, that.id) &&
66 Objects.equals(this.termNumber, that.termNumber) &&
67 Objects.equals(this.sequenceNumber, that.sequenceNumber);
68 }
69
70 @Override
71 public String toString() {
72 return MoreObjects.toStringHelper(getClass())
73 .add("id", id)
74 .add("termNumber", termNumber)
75 .add("sequenceNumber", sequenceNumber)
76 .toString();
77 }
78
79 /**
80 * Returns the element.
81 *
82 * @return element identifier
83 */
84 public ElementId id() {
85 return id;
86 }
87
88 /**
89 * Returns the termNumber.
90 *
91 * @return termNumber
92 */
93 public int termNumber() {
94 return termNumber;
95 }
96
97 /**
98 * Returns the sequenceNumber number.
99 *
100 * @return sequenceNumber
101 */
102 public int sequenceNumber() {
103 return sequenceNumber;
104 }
105}