Yuta HIGUCHI

Timestamp, OnosTimestamp and it's serializer

Change-Id: I02e3563229ddae8fc4b705c708f4066d82e24cf4
1 +package org.onlab.onos.store;
2 +
3 +/**
4 + * Opaque version structure.
5 + */
6 +public interface Timestamp extends Comparable<Timestamp> {
7 +
8 +}
1 +package org.onlab.onos.store.impl;
2 +
3 +import static com.google.common.base.Preconditions.checkNotNull;
4 +import static com.google.common.base.Preconditions.checkArgument;
5 +
6 +import java.util.Objects;
7 +
8 +import org.onlab.onos.net.ElementId;
9 +import org.onlab.onos.store.Timestamp;
10 +
11 +import com.google.common.base.MoreObjects;
12 +import com.google.common.collect.ComparisonChain;
13 +
14 +// If it is store specific, implement serializable interfaces?
15 +/**
16 + * Default implementation of Timestamp.
17 + */
18 +public 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 +}
...@@ -4,7 +4,9 @@ import com.hazelcast.config.Config; ...@@ -4,7 +4,9 @@ import com.hazelcast.config.Config;
4 import com.hazelcast.config.FileSystemXmlConfig; 4 import com.hazelcast.config.FileSystemXmlConfig;
5 import com.hazelcast.core.Hazelcast; 5 import com.hazelcast.core.Hazelcast;
6 import com.hazelcast.core.HazelcastInstance; 6 import com.hazelcast.core.HazelcastInstance;
7 +
7 import de.javakaffee.kryoserializers.URISerializer; 8 import de.javakaffee.kryoserializers.URISerializer;
9 +
8 import org.apache.felix.scr.annotations.Activate; 10 import org.apache.felix.scr.annotations.Activate;
9 import org.apache.felix.scr.annotations.Component; 11 import org.apache.felix.scr.annotations.Component;
10 import org.apache.felix.scr.annotations.Deactivate; 12 import org.apache.felix.scr.annotations.Deactivate;
...@@ -26,6 +28,7 @@ import org.onlab.onos.store.serializers.DefaultPortSerializer; ...@@ -26,6 +28,7 @@ import org.onlab.onos.store.serializers.DefaultPortSerializer;
26 import org.onlab.onos.store.serializers.DeviceIdSerializer; 28 import org.onlab.onos.store.serializers.DeviceIdSerializer;
27 import org.onlab.onos.store.serializers.IpPrefixSerializer; 29 import org.onlab.onos.store.serializers.IpPrefixSerializer;
28 import org.onlab.onos.store.serializers.NodeIdSerializer; 30 import org.onlab.onos.store.serializers.NodeIdSerializer;
31 +import org.onlab.onos.store.serializers.OnosTimestampSerializer;
29 import org.onlab.onos.store.serializers.PortNumberSerializer; 32 import org.onlab.onos.store.serializers.PortNumberSerializer;
30 import org.onlab.onos.store.serializers.ProviderIdSerializer; 33 import org.onlab.onos.store.serializers.ProviderIdSerializer;
31 import org.onlab.packet.IpPrefix; 34 import org.onlab.packet.IpPrefix;
...@@ -90,6 +93,7 @@ public class StoreManager implements StoreService { ...@@ -90,6 +93,7 @@ public class StoreManager implements StoreService {
90 .register(DeviceId.class, new DeviceIdSerializer()) 93 .register(DeviceId.class, new DeviceIdSerializer())
91 .register(PortNumber.class, new PortNumberSerializer()) 94 .register(PortNumber.class, new PortNumberSerializer())
92 .register(DefaultPort.class, new DefaultPortSerializer()) 95 .register(DefaultPort.class, new DefaultPortSerializer())
96 + .register(OnosTimestamp.class, new OnosTimestampSerializer())
93 .build() 97 .build()
94 .populate(10); 98 .populate(10);
95 } 99 }
......
...@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer; ...@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer;
9 import com.esotericsoftware.kryo.io.Input; 9 import com.esotericsoftware.kryo.io.Input;
10 import com.esotericsoftware.kryo.io.Output; 10 import com.esotericsoftware.kryo.io.Output;
11 11
12 -// TODO move to util, etc.
13 /** 12 /**
14 * Kryo Serializer for {@link DefaultPort}. 13 * Kryo Serializer for {@link DefaultPort}.
15 */ 14 */
......
...@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer; ...@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer;
9 import com.esotericsoftware.kryo.io.Input; 9 import com.esotericsoftware.kryo.io.Input;
10 import com.esotericsoftware.kryo.io.Output; 10 import com.esotericsoftware.kryo.io.Output;
11 11
12 -//TODO move to util, etc.
13 /** 12 /**
14 * Kryo Serializer for {@link DeviceId}. 13 * Kryo Serializer for {@link DeviceId}.
15 */ 14 */
......
...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer; ...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
7 import com.esotericsoftware.kryo.io.Input; 7 import com.esotericsoftware.kryo.io.Input;
8 import com.esotericsoftware.kryo.io.Output; 8 import com.esotericsoftware.kryo.io.Output;
9 9
10 -// TODO move to util, etc.
11 /** 10 /**
12 * Kryo Serializer for {@link IpPrefix}. 11 * Kryo Serializer for {@link IpPrefix}.
13 */ 12 */
......
1 +package org.onlab.onos.store.serializers;
2 +
3 +import org.onlab.onos.net.ElementId;
4 +import org.onlab.onos.store.impl.OnosTimestamp;
5 +
6 +import com.esotericsoftware.kryo.Kryo;
7 +import com.esotericsoftware.kryo.Serializer;
8 +import com.esotericsoftware.kryo.io.Input;
9 +import com.esotericsoftware.kryo.io.Output;
10 +
11 +/**
12 + * Kryo Serializer for {@link OnosTimestamp}.
13 + */
14 +public class OnosTimestampSerializer extends Serializer<OnosTimestamp> {
15 +
16 + /**
17 + * Default constructor.
18 + */
19 + public OnosTimestampSerializer() {
20 + // non-null, immutable
21 + super(false, true);
22 + }
23 + @Override
24 + public void write(Kryo kryo, Output output, OnosTimestamp object) {
25 + kryo.writeClassAndObject(output, object.id());
26 + output.writeInt(object.termNumber());
27 + output.writeInt(object.sequenceNumber());
28 + }
29 +
30 + @Override
31 + public OnosTimestamp read(Kryo kryo, Input input, Class<OnosTimestamp> type) {
32 + ElementId id = (ElementId) kryo.readClassAndObject(input);
33 + final int term = input.readInt();
34 + final int sequence = input.readInt();
35 + return new OnosTimestamp(id, term, sequence);
36 + }
37 +}
...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer; ...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
7 import com.esotericsoftware.kryo.io.Input; 7 import com.esotericsoftware.kryo.io.Input;
8 import com.esotericsoftware.kryo.io.Output; 8 import com.esotericsoftware.kryo.io.Output;
9 9
10 -// TODO move to util, etc.
11 /** 10 /**
12 * Serializer for {@link PortNumber}. 11 * Serializer for {@link PortNumber}.
13 */ 12 */
......
...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer; ...@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
7 import com.esotericsoftware.kryo.io.Input; 7 import com.esotericsoftware.kryo.io.Input;
8 import com.esotericsoftware.kryo.io.Output; 8 import com.esotericsoftware.kryo.io.Output;
9 9
10 -//TODO move to util, etc.
11 /** 10 /**
12 * Serializer for {@link ProviderId}. 11 * Serializer for {@link ProviderId}.
13 */ 12 */
......