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() +