ONOS-3539 Insert optional delay for showing highlights

Change-Id: I289d54fc2b401da397fa97e912e98177d108df23
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
index 12d3b62..909bbbb 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.ui.topo;
 
+import com.google.common.base.Preconditions;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -34,6 +36,7 @@
     private static final String MIN = "min";
     private static final String MAX = "max";
 
+
     /**
      * A notion of amount.
      */
@@ -43,6 +46,7 @@
         MAXIMALLY(MAX);
 
         private final String s;
+
         Amount(String str) {
             s = str;
         }
@@ -58,7 +62,30 @@
     private final Map<String, LinkHighlight> links = new HashMap<>();
 
     private Amount subdueLevel = Amount.ZERO;
+    private int delayMs = 0;
 
+    //TODO: Think of a better solution for topology events race conditions
+    /**
+     * Sets the number of milliseconds to delay processing of highlights
+     * events on the client side.
+     *
+     * @param ms milliseconds to delay
+     * @return self, for chaining
+     */
+    public Highlights delay(int ms) {
+        Preconditions.checkArgument(ms >= 0, "Delay cannot be lower than 0");
+        delayMs = ms;
+        return this;
+    }
+
+    /**
+     * Return the delay for the highlight event.
+     *
+     * @return delay in milliseconds
+     */
+    public int delayMs() {
+        return delayMs;
+    }
 
     /**
      * Adds highlighting information for a device.
@@ -186,4 +213,5 @@
     public LinkHighlight getLink(String id) {
         return links.get(id);
     }
+
 }
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/TopoJson.java b/core/api/src/main/java/org/onosproject/ui/topo/TopoJson.java
index efe69f5..bd07d6c 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/TopoJson.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/TopoJson.java
@@ -33,6 +33,7 @@
     static final String HOSTS = "hosts";
     static final String LINKS = "links";
     static final String SUBDUE = "subdue";
+    static final String DELAY = "delay";
 
     static final String ID = "id";
     static final String LABEL = "label";
@@ -99,6 +100,10 @@
         if (!toSubdue.equals(Highlights.Amount.ZERO)) {
             payload.put(SUBDUE, toSubdue.toString());
         }
+        int delay = highlights.delayMs();
+        if (delay > 0) {
+            payload.put(DELAY, delay);
+        }
         return payload;
     }