Added GUI to intent perf app to monitor performance stats in real-time.

Fixed app ids for metrics app.

Change-Id: Icea99991ad71c80c53a832c236dcc05fefbb9b02
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
index 90eb9d7..8683f3f 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
@@ -65,7 +65,7 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected IntentPerfUi ui;
 
     // Auxiliary structures used to accrue data for normalized time interval
@@ -99,6 +99,7 @@
             nodeToIndex.put(nodes[i].id(), i);
         }
 
+        ui.setHeaders(getSampleHeaders());
         clearSamples();
         log.info("Started");
     }
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
index 02aa1b3..96f2b32 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
@@ -99,7 +99,7 @@
     private static final int DEFAULT_NUM_NEIGHBORS = 0;
 
     private static final int START_DELAY = 5_000; // ms
-    private static final int REPORT_PERIOD = 5_000; //ms
+    private static final int REPORT_PERIOD = 1_000; //ms
 
     private static final String START = "start";
     private static final String STOP = "stop";
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
index d30fe4e..f50ed3b 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.intentperf;
 
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -23,6 +24,7 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.intentperf.IntentPerfCollector.Sample;
 import org.onosproject.ui.UiConnection;
@@ -34,14 +36,17 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Random;
 import java.util.Set;
+import java.util.TimerTask;
 
 import static java.util.Collections.synchronizedSet;
 
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = false)
+@Component(immediate = true, enabled = true)
+@Service(value = IntentPerfUi.class)
 public class IntentPerfUi {
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -53,9 +58,25 @@
     private UiExtension uiExtension = new UiExtension(views, this::newHandlers,
                                                       getClass().getClassLoader());
 
+    private List<String> headers = ImmutableList.of("One", "Two", "Three", "Four", "Five");
+
+    private Random random = new Random();
+    private TimerTask task;
+
     @Activate
     protected void activate() {
         uiExtensionService.register(uiExtension);
+//        task = new TimerTask() {
+//            @Override
+//            public void run() {
+//                Sample sample = new Sample(System.currentTimeMillis(), headers.size());
+//                for (int i = 0; i < headers.size(); i++) {
+//                    sample.data[i] = 25_000 + random.nextInt(20_000) - 5_000;
+//                }
+//                reportSample(sample);
+//            }
+//        };
+//        SharedExecutors.getTimer().scheduleAtFixedRate(task, 1000, 1000);
     }
 
     @Deactivate
@@ -74,6 +95,15 @@
         }
     }
 
+    /**
+     * Sets the headers for the subsequently reported samples.
+     *
+     * @param headers list of headers for future samples
+     */
+    public void setHeaders(List<String> headers) {
+        this.headers = headers;
+    }
+
     // Creates and returns session specific message handler.
     private Collection<UiMessageHandler> newHandlers() {
         return ImmutableList.of(new StreamingControl());
@@ -90,7 +120,22 @@
 
         @Override
         public void process(ObjectNode message) {
-            streamingEnabled = message.path("event").asText("unknown").equals("initPerfStart");
+            streamingEnabled = message.path("event").asText("unknown").equals("intentPerfStart");
+            if (streamingEnabled) {
+                sendHeaders();
+            }
+        }
+
+        private void sendHeaders() {
+            ArrayNode an = mapper.createArrayNode();
+            for (String header : headers) {
+                an.add(header);
+            }
+
+            ObjectNode sn = mapper.createObjectNode();
+            sn.set("headers", an);
+
+            connection().sendMessage("intentPerfHeaders", 0, sn);
         }
 
         @Override
@@ -106,10 +151,18 @@
         }
 
         private void send(Sample sample) {
-            // FIXME: finish this
-            ObjectNode sn = mapper.createObjectNode()
-                    .put("time", sample.time);
-            connection().sendMessage("intentPerf", 0, sn);
+            if (streamingEnabled) {
+                ArrayNode an = mapper.createArrayNode();
+                for (double d : sample.data) {
+                    an.add(d);
+                }
+
+                ObjectNode sn = mapper.createObjectNode();
+                sn.put("time", sample.time);
+                sn.set("data", an);
+
+                connection().sendMessage("intentPerfSample", 0, sn);
+            }
         }
     }