ONOS-248 Added ability to visualize counts of device flows along egress links.

Change-Id: I4587c4a285025fb12e616391cdae91966d976c97
diff --git a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
index 99e9aeb..104fa95 100644
--- a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
+++ b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
@@ -42,6 +42,7 @@
 import org.onlab.osgi.ServiceDirectory;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -167,6 +168,7 @@
             processMessage((ObjectNode) mapper.reader().readTree(data));
         } catch (Exception e) {
             log.warn("Unable to parse GUI request {} due to {}", data, e);
+            log.warn("Boom!!!!", e);
         }
     }
 
@@ -183,6 +185,8 @@
             requestTraffic(event);
         } else if (type.equals("requestAllTraffic")) {
             requestAllTraffic(event);
+        } else if (type.equals("requestDeviceLinkFlows")) {
+            requestDeviceLinkFlows(event);
         } else if (type.equals("cancelTraffic")) {
             cancelTraffic(event);
         }
@@ -263,6 +267,26 @@
         sendMessage(trafficSummaryMessage(sid));
     }
 
+    private void requestDeviceLinkFlows(ObjectNode event) {
+        ObjectNode payload = payload(event);
+        long sid = number(event, "sid");
+        monitorRequest = event;
+
+        // Get the set of selected hosts and their intents.
+        ArrayNode ids = (ArrayNode) payload.path("ids");
+        Set<Host> hosts = new HashSet<>();
+        Set<Device> devices = getDevices(ids);
+
+        // If there is a hover node, include it in the hosts and find intents.
+        String hover = string(payload, "hover");
+        Set<Intent> hoverIntents;
+        if (!isNullOrEmpty(hover)) {
+            addHover(hosts, devices, hover);
+        }
+        sendMessage(flowSummaryMessage(sid, devices));
+    }
+
+
     // Subscribes for host traffic messages.
     private synchronized void requestTraffic(ObjectNode event) {
         ObjectNode payload = payload(event);
@@ -374,6 +398,8 @@
                 String type = string(monitorRequest, "event", "unknown");
                 if (type.equals("requestAllTraffic")) {
                     requestAllTraffic(monitorRequest);
+                } else if (type.equals("requestDeviceLinkFlows")) {
+                    requestDeviceLinkFlows(monitorRequest);
                 } else {
                     requestTraffic(monitorRequest);
                 }