Generalize the MultiValuedTimestamp.

Change-Id: I691730d59f440778856afd0e4808ba775eccba0a
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index c99f874..e8cccf4 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -15,17 +15,6 @@
  */
 package org.onosproject.net.device.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.MastershipRole.*;
-import static org.onlab.util.Tools.namedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-
 import com.google.common.collect.Lists;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -65,6 +54,18 @@
 import org.onosproject.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
 
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.namedThreads;
+import static org.onosproject.net.MastershipRole.MASTER;
+import static org.onosproject.net.MastershipRole.NONE;
+import static org.onosproject.net.MastershipRole.STANDBY;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the device SB & NB APIs.
  */
@@ -234,7 +235,7 @@
         log.debug("Checking mastership");
         for (Device device : getDevices()) {
             final DeviceId deviceId = device.id();
-            log.debug("Checking device {}", deviceId);
+            log.trace("Checking device {}", deviceId);
 
             if (!isReachable(deviceId)) {
                 continue;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java b/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java
index 46c416e..f460dbd 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java
@@ -22,26 +22,28 @@
 import java.util.Objects;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
- * A logical timestamp that derives its value from two input values. Value1
- * always takes precedence over value2 when comparing timestamps.
+ * A logical timestamp that derives its value from two input values. The first
+ * value always takes precedence over the second value when comparing timestamps.
  */
-public class MultiValuedTimestamp implements Timestamp {
+public class MultiValuedTimestamp<T extends Comparable<T>, U extends Comparable<U>>
+        implements Timestamp {
 
-    private final Timestamp timestamp;
-    private final long value2;
+    private final T value1;
+    private final U value2;
 
     /**
      * Creates a new timestamp based on two values. The first value has higher
      * precedence than the second when comparing timestamps.
      *
-     * @param timestamp first value
+     * @param value1 first value
      * @param value2 second value
      */
-    public MultiValuedTimestamp(Timestamp timestamp, long value2) {
-        this.timestamp = timestamp;
-        this.value2 = value2;
+    public MultiValuedTimestamp(T value1, U value2) {
+        this.value1 = checkNotNull(value1);
+        this.value2 = checkNotNull(value2);
     }
 
     @Override
@@ -51,14 +53,14 @@
         MultiValuedTimestamp that = (MultiValuedTimestamp) o;
 
         return ComparisonChain.start()
-                .compare(this.timestamp, that.timestamp)
+                .compare(this.value1, that.value1)
                 .compare(this.value2, that.value2)
                 .result();
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(timestamp, value2);
+        return Objects.hash(value1, value2);
     }
 
     @Override
@@ -70,14 +72,14 @@
             return false;
         }
         MultiValuedTimestamp that = (MultiValuedTimestamp) obj;
-        return Objects.equals(this.timestamp, that.timestamp) &&
+        return Objects.equals(this.value1, that.value1) &&
                 Objects.equals(this.value2, that.value2);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                .add("timestamp", timestamp)
+                .add("value1", value1)
                 .add("value2", value2)
                 .toString();
     }
@@ -87,8 +89,8 @@
      *
      * @return first value
      */
-    public Timestamp timestamp() {
-        return timestamp;
+    public T value1() {
+        return value1;
     }
 
     /**
@@ -96,14 +98,14 @@
      *
      * @return second value
      */
-    public long sequenceNumber() {
+    public U value2() {
         return value2;
     }
 
     // Default constructor for serialization
     @SuppressWarnings("unused")
     private MultiValuedTimestamp() {
-        this.timestamp = null;
-        this.value2 = -1;
+        this.value1 = null;
+        this.value2 = null;
     }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
index 950cfde..4636cd7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
@@ -31,6 +31,7 @@
 
     @Override
     public Timestamp getTimestamp(K key, IntentData intentData) {
-        return new MultiValuedTimestamp(intentData.version(), sequenceNumber.getAndIncrement());
+        return new MultiValuedTimestamp<>(intentData.version(),
+                                          sequenceNumber.getAndIncrement());
     }
 }