ONOS-6259: Topo2 - Implement server-side highlighting model (WIP)
- Enhanced BiLink to allow a UiLinkId as its identifier.
- Corrected aggregation of traffic data for synthetic links in regions.
- Removed TrafficLink copy constructor (not needed).

Change-Id: Ia7d84f28ec69737e7474bfc100262b837effef73
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitorBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitorBase.java
index c59f2c5..4ab9796 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitorBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitorBase.java
@@ -270,7 +270,6 @@
         addEdgeLinks(linkMap);
 
         Set<TrafficLink> linksWithTraffic = new HashSet<>();
-        // TODO: consider whether a map would be better...
 
         for (TrafficLink tlink : linkMap.biLinks()) {
             if (type == TrafficLink.StatsType.FLOW_STATS) {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Traffic2Monitor.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Traffic2Monitor.java
index 60e7e83..bccc63c 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Traffic2Monitor.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Traffic2Monitor.java
@@ -31,6 +31,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import static org.onosproject.ui.model.topo.UiLinkId.uiLinkId;
+
 /**
  * Encapsulates the behavior of monitoring specific traffic patterns in the
  * Topology-2 view.
@@ -112,17 +114,13 @@
         Map<UiLinkId, TrafficLink> mappedByUiLinkId = new HashMap<>();
 
         for (TrafficLink tl : linksWithTraffic) {
-            UiLinkId tlid = UiLinkId.uiLinkId(tl.key());
+            UiLinkId tlid = uiLinkId(tl.key());
             UiSynthLink sl = synthLinkMap.get(tlid);
             if (sl != null) {
                 UiLinkId aggrid = sl.link().id();
-                TrafficLink aggregated = mappedByUiLinkId.get(aggrid);
-                if (aggregated == null) {
-                    aggregated = new TrafficLink(tl);
-                    mappedByUiLinkId.put(aggrid, aggregated);
-                } else {
-                    aggregated.mergeStats(tl);
-                }
+                TrafficLink aggregated =
+                        mappedByUiLinkId.computeIfAbsent(aggrid, TrafficLink::new);
+                aggregated.mergeStats(tl);
             }
         }
 
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/TrafficLink.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/TrafficLink.java
index f2643c6..02a8083 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/TrafficLink.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/util/TrafficLink.java
@@ -19,6 +19,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.statistic.Load;
+import org.onosproject.ui.model.topo.UiLinkId;
 import org.onosproject.ui.topo.BiLink;
 import org.onosproject.ui.topo.LinkHighlight;
 import org.onosproject.ui.topo.LinkHighlight.Flavor;
@@ -70,22 +71,17 @@
         super(key, link);
     }
 
+
     /**
-     * Copy constructor.
+     * Returns an "empty" traffic link (one with no underlying links or stats)
+     * with the given identifier. This is useful when we want to aggregate
+     * stats from other links into a single entity (such as a region-region
+     * link reporting the stats for the links that compose it).
      *
-     * @param copy the instance to copy
+     * @param id the link identifier
      */
-    public TrafficLink(TrafficLink copy) {
-        super(copy.key(), copy.one());
-        setOther(copy.two());
-        bytes = copy.bytes;
-        rate = copy.rate;
-        flows = copy.flows;
-        taggedFlavor = copy.taggedFlavor;
-        hasTraffic = copy.hasTraffic;
-        isOptical = copy.isOptical;
-        antMarch = copy.antMarch;
-        mods.addAll(copy.mods);
+    public TrafficLink(UiLinkId id) {
+        super(id);
     }
 
     @Override
@@ -121,7 +117,7 @@
     @Override
     public String toString() {
         return toStringHelper(this)
-                .add("key", key())
+                .add("linkId", linkId())
                 .add("bytes", bytes)
                 .add("rate", rate)
                 .add("flows", flows)