Rename {Switch,Port,Link,Host}Event -> {...}Data

Change-Id: I89d8bae8358409514132eeac00deb0c947ecf68f
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkData.java b/src/main/java/net/onrc/onos/core/topology/LinkData.java
new file mode 100644
index 0000000..59f69bd
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/LinkData.java
@@ -0,0 +1,208 @@
+package net.onrc.onos.core.topology;
+
+import java.nio.ByteBuffer;
+import java.util.Objects;
+
+import net.onrc.onos.core.topology.web.serializers.LinkDataSerializer;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.LinkTuple;
+import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.SwitchPort;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+/**
+ * Self-contained Link object.
+ */
+
+@JsonSerialize(using = LinkDataSerializer.class)
+public class LinkData extends TopologyElement<LinkData> {
+    public static final int LINKID_BYTES = 2 + PortData.PORTID_BYTES * 2;
+
+    private final LinkTuple id;
+    // TODO add LastSeenTime, Capacity if appropriate
+    protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
+    private Double capacity = DEFAULT_CAPACITY;
+
+    /**
+     * Default constructor for Serializer to use.
+     */
+    @Deprecated
+    protected LinkData() {
+        id = null;
+    }
+
+    /**
+     * Constructor for given LinkTuple.
+     *
+     * @param id the link tuple to identify the link
+     */
+    public LinkData(LinkTuple id) {
+        this.id = checkNotNull(id);
+    }
+
+    /**
+     * Constructor for given source and destination switch ports.
+     *
+     * @param src the source SwitchPort to use
+     * @param dst the destination SwitchPort to use
+     */
+    public LinkData(SwitchPort src, SwitchPort dst) {
+        this(new LinkTuple(src, dst));
+    }
+
+    /**
+     * Constructor for a given Link object.
+     * <p>
+     * TODO: This constructor should probably be removed.
+     *
+     * @param link the Link object to use.
+     */
+    public LinkData(Link link) {
+        this(link.getLinkTuple());
+        // FIXME losing attributes here
+    }
+
+    /**
+     * Copy constructor.
+     * <p>
+     * Creates an unfrozen copy of the given LinkData object.
+     *
+     * @param original the object ot make copy of
+     */
+    public LinkData(LinkData original) {
+        super(original);
+        this.id = original.id;
+    }
+
+    /**
+     * Gets the LinkTuple that identifies this link.
+     *
+     * @return the LinkTuple identifying this link
+     */
+    public LinkTuple getLinkTuple() {
+        return id;
+    }
+
+    /**
+     * Gets the link source SwitchPort.
+     *
+     * @return the link source SwitchPort
+     */
+    public SwitchPort getSrc() {
+        return getLinkTuple().getSrc();
+    }
+
+    /**
+     * Gets the link destination SwitchPort.
+     *
+     * @return the link destination SwitchPort
+     */
+    public SwitchPort getDst() {
+        return getLinkTuple().getDst();
+    }
+
+    /**
+     * Gets the link capacity.
+     * <p>
+     * TODO: What is the unit?
+     *
+     * @return the link capacity
+     */
+    public Double getCapacity() {
+        return capacity;
+    }
+
+    /**
+     * Sets the link capacity.
+     * <p>
+     * TODO: What is the unit?
+     *
+     * @param capacity the link capacity to set
+     */
+    void setCapacity(Double capacity) {
+        if (isFrozen()) {
+            throw new IllegalStateException("Tried to modify frozen instance: " + this);
+        }
+
+        this.capacity = capacity;
+    }
+
+    /**
+     * Computes the link ID for given source and destination switch DPID and
+     * port numbers.
+     *
+     * @param srcDpid the source switch DPID to use
+     * @param srcPortNo the source port number to use
+     * @param dstDpid the destination switch DPID to use
+     * @param dstPortNo the destination port number to use
+     * @return the link ID as a ByteBuffer
+     */
+    public static ByteBuffer getLinkID(Dpid srcDpid, PortNumber srcPortNo,
+                                       Dpid dstDpid, PortNumber dstPortNo) {
+        return getLinkID(srcDpid.value(), srcPortNo.value(),
+                         dstDpid.value(), dstPortNo.value());
+    }
+
+    /**
+     * Computes the link ID for given source and destination switch DPID and
+     * port numbers.
+     * <p>
+     * TODO: This method should be removed and replaced with the corresponding
+     * getLinkID(Dpid, PortNumber, Dpid, PortNumber) method.
+     *
+     * @param srcDpid the source switch DPID to use
+     * @param srcPortNo the source port number to use
+     * @param dstDpid the destination switch DPID to use
+     * @param dstPortNo the destination port number to use
+     * @return the link ID as a ByteBuffer
+     */
+    public static ByteBuffer getLinkID(Long srcDpid, Long srcPortNo,
+                                       Long dstDpid, Long dstPortNo) {
+        return (ByteBuffer) ByteBuffer.allocate(LinkData.LINKID_BYTES)
+                .putChar('L')
+                .put(PortData.getPortID(srcDpid, srcPortNo))
+                .put(PortData.getPortID(dstDpid, dstPortNo)).flip();
+    }
+
+    @Override
+    public Dpid getOriginDpid() {
+        return this.id.getDst().getDpid();
+    }
+
+    @Override
+    public ByteBuffer getIDasByteBuffer() {
+        return getLinkID(getSrc().getDpid(), getSrc().getPortNumber(),
+                getDst().getDpid(), getDst().getPortNumber());
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + Objects.hashCode(id);
+    }
+
+    @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;
+        }
+
+        LinkData other = (LinkData) o;
+        return Objects.equals(this.id, other.id);
+    }
+
+    @Override
+    public String toString() {
+        return "[LinkData " + getSrc() + "->" + getDst() + "]";
+    }
+}