Rename MastershipEvent -> MastershipData

Change-Id: I24a290d65972cad0eaa1a1e687dc00adf5890cce
diff --git a/src/main/java/net/onrc/onos/core/topology/MastershipData.java b/src/main/java/net/onrc/onos/core/topology/MastershipData.java
new file mode 100644
index 0000000..9942f05
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/MastershipData.java
@@ -0,0 +1,175 @@
+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;
+import net.onrc.onos.core.topology.web.serializers.MastershipDataSerializer;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.OnosInstanceId;
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+/**
+ * Self-contained Switch Mastership object.
+ */
+@JsonSerialize(using = MastershipDataSerializer.class)
+public class MastershipData extends TopologyElement<MastershipData> {
+    private final Dpid dpid;
+    private final OnosInstanceId onosInstanceId;
+    private final Role role;
+
+    /**
+     * Default constructor for Serializer to use.
+     */
+    @Deprecated
+    protected MastershipData() {
+        dpid = null;
+        onosInstanceId = null;
+        role = Role.SLAVE;              // Default role is SLAVE
+    }
+
+    /**
+     * Constructor for given switch DPID, ONOS Instance ID, and ONOS instance
+     * role for the switch.
+     *
+     * @param dpid the switch DPID
+     * @param onosInstanceId the ONOS Instance ID
+     * @param role the ONOS instance role for the switch
+     */
+    public MastershipData(Dpid dpid, OnosInstanceId onosInstanceId,
+                           Role role) {
+        this.dpid = checkNotNull(dpid);
+        this.onosInstanceId = checkNotNull(onosInstanceId);
+        this.role = role;
+    }
+
+    /**
+     * Copy constructor.
+     * <p>
+     * Creates an unfrozen copy of the given Switch MastershipData object.
+     *
+     * @param original the object to make copy of
+     */
+    public MastershipData(MastershipData original) {
+        super(original);
+        this.dpid = original.dpid;
+        this.onosInstanceId = original.onosInstanceId;
+        this.role = original.role;
+    }
+
+    /**
+     * Gets the Switch DPID.
+     *
+     * @return the Switch DPID
+     */
+    public Dpid getDpid() {
+        return dpid;
+    }
+
+    /**
+     * Gets the ONOS Instance ID.
+     *
+     * @return the ONOS Instance ID
+     */
+    public OnosInstanceId getOnosInstanceId() {
+        return onosInstanceId;
+    }
+
+    /**
+     * Gets the ONOS Controller Role for the Switch.
+     *
+     * @return the ONOS Controller Role for the Switch
+     */
+    public Role getRole() {
+        return role;
+    }
+
+    @Override
+    public Dpid getOriginDpid() {
+        return this.dpid;
+    }
+
+    @Override
+    public ByteBuffer getIDasByteBuffer() {
+        String keyStr = "M" + getDpid() + "@" + getOnosInstanceId();
+        byte[] id = keyStr.getBytes(StandardCharsets.UTF_8);
+        ByteBuffer buf = ByteBuffer.wrap(id);
+        return buf;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(dpid, onosInstanceId);
+    }
+
+    /**
+     * Compares two MastershipData objects.
+     * MastershipData objects are equal if they have same DPID and same
+     * ONOS Instance ID.
+     *
+     * @param o another object to compare to this
+     * @return true if equal, false otherwise
+     */
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        // Compare attributes
+        if (!super.equals(o)) {
+            return false;
+        }
+
+        MastershipData other = (MastershipData) o;
+        return Objects.equals(dpid, other.dpid) &&
+            Objects.equals(onosInstanceId, other.onosInstanceId);
+    }
+
+    /**
+     * Comparator to bring {@link MastershipData} with MASTER role up front.
+     * <p>
+     * Note: expected to be used against Collection of MastershipData
+     * about same Dpid.
+     */
+    public static final class MasterFirstComparator
+                implements Comparator<MastershipData>, Serializable {
+        @Override
+        public int compare(MastershipData o1, MastershipData o2) {
+            // MastershipData for same ONOS Instance
+            //  => treat as equal regardless of Role
+            // Note: MastershipData#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 "[MastershipData " + getDpid() + "@" + getOnosInstanceId() +
+            "->" + getRole() + "]";
+    }
+}