diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java index 2179f42e6e..8bb6244f2c 100644 --- a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java +++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java @@ -25,6 +25,7 @@ import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.ControllerNode; import org.onosproject.ui.GlyphConstants; import org.onosproject.ui.UiConnection; +import org.onosproject.ui.UiExtension; import org.onosproject.ui.UiExtensionService; import org.onosproject.ui.UiMessageHandler; import org.onosproject.ui.UiMessageHandlerFactory; @@ -33,6 +34,7 @@ import org.onosproject.ui.UiTopoLayoutService; import org.onosproject.ui.UiTopoOverlayFactory; import org.onosproject.ui.impl.topo.Topo2Jsonifier; import org.onosproject.ui.impl.topo.Topo2OverlayCache; +import org.onosproject.ui.impl.topo.Topo2TrafficMessageHandler; import org.onosproject.ui.impl.topo.Topo2ViewMessageHandler; import org.onosproject.ui.impl.topo.UiTopoSession; import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel; @@ -249,6 +251,8 @@ public class UiWebSocket overlayCache = new TopoOverlayCache(); overlay2Cache = new Topo2OverlayCache(); + Map, UiMessageHandler> handlerInstances = new HashMap<>(); + UiExtensionService service = directory.get(UiExtensionService.class); service.getExtensions().forEach(ext -> { UiMessageHandlerFactory factory = ext.messageHandlerFactory(); @@ -257,33 +261,55 @@ public class UiWebSocket try { handler.init(this, directory); handler.messageTypes().forEach(type -> handlers.put(type, handler)); + handlerInstances.put(handler.getClass(), handler); - // need to inject the overlay cache into topology message handler - if (handler instanceof TopologyViewMessageHandler) { - ((TopologyViewMessageHandler) handler).setOverlayCache(overlayCache); - } - - if (handler instanceof Topo2ViewMessageHandler) { - ((Topo2ViewMessageHandler) handler).setOverlayCache(overlay2Cache); - } } catch (Exception e) { log.warn("Unable to setup handler {} due to", handler, e); } }); } - UiTopoOverlayFactory overlayFactory = ext.topoOverlayFactory(); - if (overlayFactory != null) { - overlayFactory.newOverlays().forEach(overlayCache::add); - } - - UiTopo2OverlayFactory overlay2Factory = ext.topo2OverlayFactory(); - if (overlay2Factory != null) { - overlay2Factory.newOverlays().forEach(overlay2Cache::add); - } + registerOverlays(ext); }); - log.debug("#handlers = {}, #overlays = {}", handlers.size(), - overlayCache.size()); + + handlerCrossConnects(handlerInstances); + + log.debug("#handlers = {}, #overlays = {}", handlers.size(), overlayCache.size()); + } + + private void registerOverlays(UiExtension ext) { + UiTopoOverlayFactory overlayFactory = ext.topoOverlayFactory(); + if (overlayFactory != null) { + overlayFactory.newOverlays().forEach(overlayCache::add); + } + + UiTopo2OverlayFactory overlay2Factory = ext.topo2OverlayFactory(); + if (overlay2Factory != null) { + overlay2Factory.newOverlays().forEach(overlay2Cache::add); + } + } + + private void handlerCrossConnects(Map, UiMessageHandler> handlers) { + TopologyViewMessageHandler topomh = (TopologyViewMessageHandler) + handlers.get(TopologyViewMessageHandler.class); + if (topomh != null) { + topomh.setOverlayCache(overlayCache); + } + + Topo2ViewMessageHandler topo2mh = (Topo2ViewMessageHandler) + handlers.get(Topo2ViewMessageHandler.class); + if (topo2mh != null) { + topo2mh.setOverlayCache(overlay2Cache); + + // We also need a link to Topo2Traffic + Topo2TrafficMessageHandler topo2traffic = (Topo2TrafficMessageHandler) + handlers.get(Topo2TrafficMessageHandler.class); + if (topo2traffic != null) { + topo2mh.setTrafficHandler(topo2traffic); + } else { + log.error("No topo2 traffic handler found"); + } + } } // Destroys message handlers. @@ -325,4 +351,3 @@ public class UiWebSocket } } - diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2TrafficMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2TrafficMessageHandler.java index 2fa3701613..182fbfb7f0 100644 --- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2TrafficMessageHandler.java +++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2TrafficMessageHandler.java @@ -85,6 +85,13 @@ public class Topo2TrafficMessageHandler extends UiMessageHandler { ); } + /** + * Shuts down the background traffic monitoring task. + */ + void ceaseAndDesist() { + traffic.stopMonitoring(); + } + // ================================================================== private final class Topo2AllTraffic extends RequestHandler { diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java index e577f45261..cac0b8ddfb 100644 --- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java +++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2ViewMessageHandler.java @@ -72,6 +72,7 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { private UiTopoSession topoSession; private Topo2Jsonifier t2json; private Topo2OverlayCache overlay2Cache; + private Topo2TrafficMessageHandler trafficHandler; @Override @@ -93,6 +94,15 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { this.overlay2Cache = overlay2Cache; } + /** + * Sets a reference to the traffic message handler. + * + * @param traffic the traffic message handler instance + */ + public void setTrafficHandler(Topo2TrafficMessageHandler traffic) { + trafficHandler = traffic; + } + @Override protected Collection createRequestHandlers() { @@ -202,12 +212,10 @@ public class Topo2ViewMessageHandler extends UiMessageHandler { // client view has gone away; so shut down server-side processing log.debug("topo2Stop: {}", payload); - // TODO: tell traffic monitor to stop monitoring... - // this requires this handler to know about traffic handler!! + trafficHandler.ceaseAndDesist(); // OLD CODE DID THE FOLLOWING... // stopSummaryMonitoring(); -// traffic.stopMonitoring(); } }