ONOS-3182 Modify mode and Icons

Change-Id: Ibcfc1ffb5e91856899b10e7d156b8108653b047a
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 d9b6f76..521507c 100644
--- a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
+++ b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainterTopovMessageHandler.java
@@ -18,6 +18,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
@@ -33,6 +34,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
@@ -54,6 +56,7 @@
     private static final String MODE = "mode";
 
     private Set<Link> allPathLinks;
+    private Set<Link> selectedPathLinks;
 
     private enum Mode {
         SHORTEST, DISJOINT, SRLG
@@ -63,9 +66,8 @@
 
     private PathService pathService;
 
-    private Mode currentMode = Mode.SHORTEST;
     private ElementId src, dst;
-    private Mode mode = Mode.SHORTEST;
+    private Mode currentMode = Mode.SHORTEST;
     private List<Path> paths;
     private int pathIndex;
 
@@ -86,7 +88,8 @@
                 new SetDstHandler(),
                 new SwapSrcDstHandler(),
                 new NextPathHandler(),
-                new PrevPathHandler()
+                new PrevPathHandler(),
+                new SetModeHandler()
         );
     }
 
@@ -163,6 +166,26 @@
         }
     }
 
+    private final class SetModeHandler extends RequestHandler {
+        public SetModeHandler() {
+            super(PAINTER_SET_MODE);
+        }
+
+        @Override
+        public void process(long sid, ObjectNode payload) {
+            String mode = string(payload, MODE);
+            currentMode = (mode.equals("shortest") ?
+                    Mode.SHORTEST : (mode.equals("disjoint") ?
+                    Mode.DISJOINT : Mode.SRLG));
+            //TODO: add support for SRLG
+            if (currentMode.equals(Mode.SHORTEST)) {
+                findAndSendPaths();
+            } else {
+                findAndSendDisjointPaths();
+            }
+        }
+    }
+
     // === ------------
 
     private ElementId elementId(String id) {
@@ -174,7 +197,6 @@
     }
 
     private void findAndSendPaths() {
-        log.info("src={}; dst={}; mode={}", src, dst, mode);
         if (src != null && dst != null) {
             paths = ImmutableList.copyOf(pathService.getPaths(src, dst));
             pathIndex = 0;
@@ -189,15 +211,43 @@
         hilightAndSendPaths();
     }
 
+    private void findAndSendDisjointPaths() {
+        log.info("src={}; dst={}; mode={}", src, dst, currentMode);
+        if (src != null && dst != null) {
+            log.info("test" + src + dst);
+            paths = null;
+            paths = new ArrayList<>();
+            pathService.getDisjointPaths(src, dst).forEach(djp -> {
+                paths.add(djp.primary());
+                paths.add(djp.backup());
+            });
+            pathIndex = 0;
+
+            ImmutableSet.Builder<Link> builder = ImmutableSet.builder();
+            paths.forEach(path -> path.links().forEach(builder::add));
+            allPathLinks = builder.build();
+        } else {
+            paths = ImmutableList.of();
+            allPathLinks = ImmutableSet.of();
+        }
+        hilightAndSendPaths();
+    }
+
     private void hilightAndSendPaths() {
         PathLinkMap linkMap = new PathLinkMap();
         allPathLinks.forEach(linkMap::add);
 
         // Prepare two working sets; one containing selected path links and
         // the other containing all paths links.
-        Set<Link> selectedPathLinks = paths.isEmpty() ?
-                ImmutableSet.of() : ImmutableSet.copyOf(paths.get(pathIndex).links());
-
+        if (currentMode.equals(Mode.DISJOINT)) {
+            //FIXME: find a way to skip 2 paths for disjoint
+            selectedPathLinks = paths.isEmpty() ?
+                ImmutableSet.of() : Sets.newHashSet(paths.get(pathIndex * 2).links());
+            selectedPathLinks.addAll(Sets.newHashSet(paths.get(pathIndex * 2  + 1).links()));
+        } else {
+            selectedPathLinks = paths.isEmpty() ?
+                    ImmutableSet.of() : Sets.newHashSet(paths.get(pathIndex).links());
+        }
         Highlights highlights = new Highlights();
         for (PathLink plink : linkMap.biLinks()) {
             plink.computeHilight(selectedPathLinks, allPathLinks);