blob: 42aacdf07c2ec5acaf839875c418f63dfaf681f5 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.store.impl;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070017
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070018import static com.google.common.base.Preconditions.checkArgument;
19
20import java.util.Objects;
21
Brian O'Connorabafb502014-12-02 22:26:20 -080022import org.onosproject.store.Timestamp;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070023
24import com.google.common.base.MoreObjects;
25import com.google.common.collect.ComparisonChain;
26
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070027/**
Madan Jampanifd26ffb2014-10-13 14:08:55 -070028 * A logical timestamp that derives its value from two things:
29 * <ul>
30 * <li> The current mastership term of the device.</li>
31 * <li> The value of the counter used for tracking topology events observed from
32 * the device during that current time of a device. </li>
33 * </ul>
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070034 */
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070035public final class MastershipBasedTimestamp implements Timestamp {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070036
Madan Jampani15d773c2015-02-25 15:31:55 -080037 private final long termNumber;
38 private final long sequenceNumber;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070039
40 /**
Ray Milkey3071c162016-02-22 10:11:30 -080041 * Default constructor for serialization.
42 */
43 protected MastershipBasedTimestamp() {
44 this.termNumber = -1;
45 this.sequenceNumber = -1;
46 }
47
48 /**
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070049 * Default version tuple.
50 *
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070051 * @param termNumber the mastership termNumber
52 * @param sequenceNumber the sequenceNumber number within the termNumber
53 */
Madan Jampani15d773c2015-02-25 15:31:55 -080054 public MastershipBasedTimestamp(long termNumber, long sequenceNumber) {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070055 this.termNumber = termNumber;
56 this.sequenceNumber = sequenceNumber;
57 }
58
59 @Override
60 public int compareTo(Timestamp o) {
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070061 checkArgument(o instanceof MastershipBasedTimestamp,
62 "Must be MastershipBasedTimestamp", o);
63 MastershipBasedTimestamp that = (MastershipBasedTimestamp) o;
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070064
65 return ComparisonChain.start()
66 .compare(this.termNumber, that.termNumber)
67 .compare(this.sequenceNumber, that.sequenceNumber)
68 .result();
69 }
70
71 @Override
72 public int hashCode() {
Madan Jampani61056bc2014-09-27 09:07:26 -070073 return Objects.hash(termNumber, sequenceNumber);
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070074 }
75
76 @Override
77 public boolean equals(Object obj) {
78 if (this == obj) {
79 return true;
80 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070081 if (!(obj instanceof MastershipBasedTimestamp)) {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070082 return false;
83 }
Yuta HIGUCHI273dcc82014-10-03 00:32:12 -070084 MastershipBasedTimestamp that = (MastershipBasedTimestamp) obj;
Madan Jampani61056bc2014-09-27 09:07:26 -070085 return Objects.equals(this.termNumber, that.termNumber) &&
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070086 Objects.equals(this.sequenceNumber, that.sequenceNumber);
87 }
88
89 @Override
90 public String toString() {
91 return MoreObjects.toStringHelper(getClass())
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070092 .add("termNumber", termNumber)
93 .add("sequenceNumber", sequenceNumber)
94 .toString();
95 }
96
97 /**
Yuta HIGUCHI497c8842014-09-25 14:23:34 -070098 * Returns the termNumber.
99 *
100 * @return termNumber
101 */
Madan Jampani15d773c2015-02-25 15:31:55 -0800102 public long termNumber() {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -0700103 return termNumber;
104 }
105
106 /**
107 * Returns the sequenceNumber number.
108 *
109 * @return sequenceNumber
110 */
Madan Jampani15d773c2015-02-25 15:31:55 -0800111 public long sequenceNumber() {
Yuta HIGUCHI497c8842014-09-25 14:23:34 -0700112 return sequenceNumber;
113 }
Yuta HIGUCHI67a527f2014-10-02 22:23:54 -0700114
Yuta HIGUCHI2e963892014-09-27 13:00:39 -0700115}