Add listner for down paths to path painter App and highlights remove when changing overlay

Change-Id: I1bf94468a61bd1a7211532a5b8e9e6cdfbecbda5
diff --git a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
index 8ead8be..cf395e4 100644
--- a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
+++ b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
@@ -30,6 +30,9 @@
 import org.onosproject.net.topology.GeoDistanceLinkWeight;
 import org.onosproject.net.topology.LinkWeight;
 import org.onosproject.net.topology.PathService;
+import org.onosproject.net.topology.TopologyEvent;
+import org.onosproject.net.topology.TopologyListener;
+import org.onosproject.net.topology.TopologyService;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
@@ -50,6 +53,7 @@
  */
 public class PathPainterTopovMessageHandler extends UiMessageHandler {
 
+    private static final String PAINTER_CLEAR = "ppTopovClear";
     private static final String PAINTER_SET_SRC = "ppTopovSetSrc";
     private static final String PAINTER_SET_DST = "ppTopovSetDst";
     private static final String PAINTER_SWAP_SRC_DST = "ppTopovSwapSrcDst";
@@ -67,7 +71,10 @@
     public static final String SRC = "Src";
     private static LinkWeight linkData;
 
+    private final TopologyListener topologyListener = new InternalTopologyListener();
+
     private Set<Link> allPathLinks;
+    private boolean listenersRemoved;
 
     private enum Mode {
         SHORTEST, DISJOINT, GEODATA, SRLG, INVALID
@@ -83,6 +90,8 @@
     private List<Path> paths;
     private int pathIndex;
 
+    protected TopologyService topologyService;
+
 
     // ===============-=-=-=-=-=-======================-=-=-=-=-=-=-================================
 
@@ -91,12 +100,22 @@
     public void init(UiConnection connection, ServiceDirectory directory) {
         super.init(connection, directory);
         pathService = directory.get(PathService.class);
+        topologyService = directory.get(TopologyService.class);
         linkData = new GeoDistanceLinkWeight(directory.get(DeviceService.class));
+        addListeners();
+    }
+
+
+    @Override
+    public void destroy() {
+        removeListeners();
+        super.destroy();
     }
 
     @Override
     protected Collection<RequestHandler> createRequestHandlers() {
         return ImmutableSet.of(
+                new ClearHandler(),
                 new SetSrcHandler(),
                 new SetDstHandler(),
                 new SwapSrcDstHandler(),
@@ -109,6 +128,20 @@
     // === -------------------------
     // === Handler classes
 
+    private final class ClearHandler extends RequestHandler {
+
+        public ClearHandler() {
+            super(PAINTER_CLEAR);
+        }
+
+        @Override
+        public void process(long sid, ObjectNode payload) {
+            src = null;
+            dst = null;
+            sendMessage(TopoJson.highlightsMessage(new Highlights()));
+        }
+    }
+
     private final class SetSrcHandler extends RequestHandler {
 
         public SetSrcHandler() {
@@ -333,4 +366,23 @@
         return NodeBadge.text(type);
     }
 
+    private synchronized void addListeners() {
+        listenersRemoved = false;
+        topologyService.addListener(topologyListener);
+    }
+    private synchronized void removeListeners() {
+        if (!listenersRemoved) {
+            listenersRemoved = true;
+            topologyService.removeListener(topologyListener);
+        }
+    }
+
+    // Link event listener.
+    private class InternalTopologyListener implements TopologyListener {
+        @Override
+        public void event(TopologyEvent event) {
+            findAndSendPaths(currentMode);
+        }
+    }
+
 }
\ No newline at end of file