Carry previous location information in HostEvent

Change-Id: I06957d368a8a547cc3adb36bce4aaf96c432f4c8
diff --git a/core/api/src/main/java/org/onosproject/net/host/HostEvent.java b/core/api/src/main/java/org/onosproject/net/host/HostEvent.java
index 98329df..58ac0bb 100644
--- a/core/api/src/main/java/org/onosproject/net/host/HostEvent.java
+++ b/core/api/src/main/java/org/onosproject/net/host/HostEvent.java
@@ -15,8 +15,12 @@
  */
 package org.onosproject.net.host;
 
+import org.joda.time.LocalDateTime;
 import org.onosproject.event.AbstractEvent;
 import org.onosproject.net.Host;
+import org.onosproject.net.HostLocation;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
  * Describes end-station host event.
@@ -48,6 +52,8 @@
         HOST_MOVED
     }
 
+    private HostLocation prevLocation;
+
     /**
      * Creates an event of a given type and for the specified host and the
      * current time.
@@ -70,4 +76,35 @@
         super(type, host, time);
     }
 
+    /**
+     * Creates an event with HOST_MOVED type along with the previous location
+     * of the host.
+     *
+     * @param host event host subject
+     * @param prevLocation previous location of the host
+     */
+    public HostEvent(Host host, HostLocation prevLocation) {
+        super(Type.HOST_MOVED, host);
+        this.prevLocation = prevLocation;
+    }
+
+    /**
+     * Gets the previous location information in this host event.
+     *
+     * @return the previous location, or null if previous location is not
+     *         specified.
+     */
+    public HostLocation prevLocation() {
+        return this.prevLocation;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("time", new LocalDateTime(time()))
+                .add("type", type())
+                .add("subject", subject())
+                .add("prevLocation", prevLocation())
+                .toString();
+    }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
index 7066b21..391a88f 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
@@ -20,7 +20,6 @@
 import static org.onosproject.net.DefaultAnnotations.merge;
 import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
 import static org.onosproject.net.host.HostEvent.Type.HOST_REMOVED;
-import static org.onosproject.net.host.HostEvent.Type.HOST_MOVED;
 import static org.onosproject.net.host.HostEvent.Type.HOST_UPDATED;
 import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT;
 import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.REMOVE;
@@ -89,7 +88,7 @@
 
     private EventuallyConsistentMap<HostId, DefaultHost> hosts;
 
-    private final ConcurrentHashMap<HostId, ConnectPoint> locations =
+    private final ConcurrentHashMap<HostId, HostLocation> locations =
             new ConcurrentHashMap<>();
 
     private EventuallyConsistentMapListener<HostId, DefaultHost> hostLocationTracker =
@@ -254,11 +253,11 @@
         public void event(EventuallyConsistentMapEvent<HostId, DefaultHost> event) {
             DefaultHost host = checkNotNull(event.value());
             if (event.type() == PUT) {
-                ConnectPoint prevLocation = locations.put(host.id(), host.location());
+                HostLocation prevLocation = locations.put(host.id(), host.location());
                 if (prevLocation == null) {
                     notifyDelegate(new HostEvent(HOST_ADDED, host));
                 } else if (!Objects.equals(prevLocation, host.location())) {
-                    notifyDelegate(new HostEvent(HOST_MOVED, host));
+                    notifyDelegate(new HostEvent(host, prevLocation));
                 } else {
                     notifyDelegate(new HostEvent(HOST_UPDATED, host));
                 }