rename topology related objects: Device -> Host

- KVDevice to be renamed later.
- Use fully qualified name for topology's Host. (HostManager.java)

Change-Id: I1538f96d7ca93ca2197d23e5a69b85d284611412
diff --git a/src/main/java/net/onrc/onos/core/topology/HostImpl.java b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
new file mode 100644
index 0000000..8ddca10
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/HostImpl.java
@@ -0,0 +1,138 @@
+package net.onrc.onos.core.topology;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.Validate;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.util.SwitchPort;
+
+/**
+ * Host Object stored in In-memory Topology.
+ */
+public class HostImpl extends TopologyObject implements Host {
+
+    //////////////////////////////////////////////////////
+    /// Topology element attributes
+    ///  - any changes made here needs to be replicated.
+    //////////////////////////////////////////////////////
+    private HostEvent deviceObj;
+
+    ///////////////////
+    /// In-memory index
+    ///////////////////
+
+    // none
+
+    /**
+     * Creates a Host object based on {@link HostEvent}.
+     *
+     * @param topology Topology instance this object belongs to
+     * @param scHost self contained {@link HostEvent}
+     */
+    public HostImpl(Topology topology, HostEvent scHost) {
+        super(topology);
+        Validate.notNull(scHost);
+
+        // TODO should we assume deviceObj is already frozen before this call
+        //      or expect attribute update will happen after .
+        if (scHost.isFrozen()) {
+            this.deviceObj = scHost;
+        } else {
+            this.deviceObj = new HostEvent(scHost);
+            this.deviceObj.freeze();
+        }
+    }
+
+    /**
+     * Creates a Host object with empty attributes.
+     *
+     * @param topology Topology instance this object belongs to
+     * @param mac MAC address of the host
+     */
+    public HostImpl(Topology topology, MACAddress mac) {
+        this(topology, new HostEvent(mac).freeze());
+    }
+
+    @Override
+    public MACAddress getMacAddress() {
+        return this.deviceObj.getMac();
+    }
+
+    @Override
+    public Iterable<Port> getAttachmentPoints() {
+        List<Port> ports = new ArrayList<>();
+        topology.acquireReadLock();
+        try {
+            for (SwitchPort swp : this.deviceObj.getAttachmentPoints()) {
+                Port p = this.topology.getPort(swp);
+                if (p != null) {
+                    ports.add(p);
+                }
+            }
+        } finally {
+            topology.releaseReadLock();
+        }
+        return ports;
+    }
+
+    @Override
+    public long getLastSeenTime() {
+        return deviceObj.getLastSeenTime();
+    }
+
+    @Override
+    public String toString() {
+        return getMacAddress().toString();
+    }
+
+    // TODO we may no longer need this. confirm and delete later.
+    void setLastSeenTime(long lastSeenTime) {
+        // XXX Following will make this instance thread unsafe. Need to use AtomicRef.
+        HostEvent updated = new HostEvent(this.deviceObj);
+        updated.setLastSeenTime(lastSeenTime);
+        updated.freeze();
+        this.deviceObj = updated;
+    }
+
+    /**
+     * Only {@link TopologyManager} should use this method.
+     *
+     * @param port the port that the device is attached to
+     */
+    void addAttachmentPoint(Port port) {
+        // XXX Following will make this instance thread unsafe. Need to use AtomicRef.
+        HostEvent updated = new HostEvent(this.deviceObj);
+        updated.removeAttachmentPoint(port.asSwitchPort());
+        updated.addAttachmentPoint(port.asSwitchPort());
+        updated.freeze();
+        this.deviceObj = updated;
+    }
+
+    /**
+     * Only {@link TopologyManager} should use this method.
+     *
+     * @param port the port that the device is attached to
+     */
+    boolean removeAttachmentPoint(Port port) {
+        // XXX Following will make this instance thread unsafe. Need to use AtomicRef.
+        HostEvent updated = new HostEvent(this.deviceObj);
+        final boolean result = updated.removeAttachmentPoint(port.asSwitchPort());
+        updated.freeze();
+        this.deviceObj = updated;
+        return result;
+    }
+
+
+    /**
+     * Returns the type of topology object.
+     *
+     * @return the type of the topology object
+     */
+    @Override
+    public String getType() {
+        // FIXME assuming device is always in packet layer for now.
+        return TopologyElement.TYPE_PACKET_LAYER;
+    }
+}