Comparator for MastershipEvent

Change-Id: I35099e1c7eff9f0d994134801bc45c6d665f5a70
diff --git a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
index 45578db..f23a9ca 100644
--- a/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipEvent.java
@@ -1,7 +1,11 @@
 package net.onrc.onos.core.topology;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Comparator;
 import java.util.Objects;
 
 import net.floodlightcontroller.core.IFloodlightProviderService.Role;
@@ -9,7 +13,6 @@
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.OnosInstanceId;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
@@ -137,6 +140,37 @@
             Objects.equals(onosInstanceId, other.onosInstanceId);
     }
 
+    /**
+     * Comparator to bring {@link MastershipEvent} with MASTER role up front.
+     * <p>
+     * Note: expected to be used against Collection of MastershipEvents
+     * about same Dpid.
+     */
+    public static final class MasterFirstComparator
+                implements Comparator<MastershipEvent>, Serializable {
+        @Override
+        public int compare(MastershipEvent o1, MastershipEvent o2) {
+            // MastershipEvent for same ONOS Instance
+            //  => treat as equal regardless of Role
+            // Note: MastershipEvent#equals() does not use Role
+            if (o1.equals(o2)) {
+                return 0;
+            }
+
+            // MASTER Role instance is considered smaller.
+            // (appears earlier in SortedSet iteration, etc.)
+            if (o1.getRole() == Role.MASTER) {
+                return -1;
+            }
+            if (o2.getRole() == Role.MASTER) {
+                return 1;
+            }
+
+            return o1.getOnosInstanceId().toString()
+                    .compareTo(o2.getOnosInstanceId().toString());
+        }
+    }
+
     @Override
     public String toString() {
         return "[MastershipEvent " + getDpid() + "@" + getOnosInstanceId() +