ISIS protocol manual merge from 1.6 due to cherry pick merge conflict

Change-Id: I6c3abf6a83ddaeba76293dc7864fcec88e9b4e7e
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/Controller.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/Controller.java
index 7cd7785..406d09c 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/Controller.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/Controller.java
@@ -30,6 +30,9 @@
 import org.onosproject.isis.controller.IsisNetworkType;
 import org.onosproject.isis.controller.IsisProcess;
 import org.onosproject.isis.controller.IsisRouterType;
+import org.onosproject.isis.controller.topology.IsisAgent;
+import org.onosproject.isis.controller.topology.IsisLink;
+import org.onosproject.isis.controller.topology.IsisRouter;
 import org.onosproject.isis.io.util.IsisConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,6 +46,7 @@
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
 import static org.onlab.util.Tools.groupedThreads;
@@ -64,15 +68,29 @@
     private ScheduledExecutorService connectExecutor = null;
     private int connectRetryCounter = 0;
     private int connectRetryTime;
+    private ScheduledFuture future = null;
+    private IsisAgent agent;
 
     /**
      * Deactivates ISIS controller.
      */
     public void isisDeactivate() {
+        disconnectExecutor();
+        processes = null;
         peerExecFactory.shutdown();
     }
 
     /**
+     * Sets ISIS agent.
+     *
+     * @param agent ISIS agent instance
+     */
+    public void setAgent(IsisAgent agent) {
+        this.agent = agent;
+    }
+
+
+    /**
      * Updates the processes configuration.
      *
      * @param jsonNode json node instance
@@ -134,17 +152,17 @@
         peerBootstrap.setOption("keepAlive", true);
         peerBootstrap.setOption("receiveBufferSize", Controller.BUFFER_SIZE);
         peerBootstrap.setOption("receiveBufferSizePredictorFactory",
-                                new FixedReceiveBufferSizePredictorFactory(
-                                        Controller.BUFFER_SIZE));
+                new FixedReceiveBufferSizePredictorFactory(
+                        Controller.BUFFER_SIZE));
         peerBootstrap.setOption("receiveBufferSizePredictor",
-                                new AdaptiveReceiveBufferSizePredictor(64, 1024, 65536));
+                new AdaptiveReceiveBufferSizePredictor(64, 1024, 65536));
         peerBootstrap.setOption("child.keepAlive", true);
         peerBootstrap.setOption("child.tcpNoDelay", true);
         peerBootstrap.setOption("child.sendBufferSize", Controller.BUFFER_SIZE);
         peerBootstrap.setOption("child.receiveBufferSize", Controller.BUFFER_SIZE);
         peerBootstrap.setOption("child.receiveBufferSizePredictorFactory",
-                                new FixedReceiveBufferSizePredictorFactory(
-                                        Controller.BUFFER_SIZE));
+                new FixedReceiveBufferSizePredictorFactory(
+                        Controller.BUFFER_SIZE));
         peerBootstrap.setOption("child.reuseAddress", true);
 
         isisChannelHandler = new IsisChannelHandler(this, processes);
@@ -236,8 +254,8 @@
                     continue;
                 }
                 isisInterface.setIntermediateSystemName(jsonNode1
-                                                                .path(IsisConstants.INTERMEDIATESYSTEMNAME)
-                                                                .asText());
+                        .path(IsisConstants.INTERMEDIATESYSTEMNAME)
+                        .asText());
                 String systemId = jsonNode1.path(IsisConstants.SYSTEMID).asText();
                 if (isValidSystemId(systemId)) {
                     isisInterface.setSystemId(systemId);
@@ -462,7 +480,8 @@
      */
     public void disconnectExecutor() {
         if (connectExecutor != null) {
-            connectExecutor.shutdown();
+            future.cancel(true);
+            connectExecutor.shutdownNow();
             connectExecutor = null;
         }
     }
@@ -480,10 +499,55 @@
      * @param retryDelay retry delay
      */
     private void scheduleConnectionRetry(long retryDelay) {
-        if (this.connectExecutor == null) {
-            this.connectExecutor = Executors.newSingleThreadScheduledExecutor();
+        if (connectExecutor == null) {
+            connectExecutor = Executors.newSingleThreadScheduledExecutor();
         }
-        this.connectExecutor.schedule(new ConnectionRetry(), retryDelay, TimeUnit.MINUTES);
+        future = connectExecutor.schedule(new ConnectionRetry(), retryDelay, TimeUnit.MINUTES);
+    }
+
+    /**
+     * Adds device details.
+     *
+     * @param isisRouter ISIS router instance
+     */
+    public void addDeviceDetails(IsisRouter isisRouter) {
+        agent.addConnectedRouter(isisRouter);
+    }
+
+    /**
+     * Removes device details.
+     *
+     * @param isisRouter Isis router instance
+     */
+    public void removeDeviceDetails(IsisRouter isisRouter) {
+        agent.removeConnectedRouter(isisRouter);
+    }
+
+    /**
+     * Adds link details.
+     *
+     * @param isisLink ISIS link instance
+     */
+    public void addLinkDetails(IsisLink isisLink) {
+        agent.addLink(isisLink);
+    }
+
+    /**
+     * Removes link details.
+     *
+     * @param isisLink ISIS link instance
+     */
+    public void removeLinkDetails(IsisLink isisLink) {
+        agent.deleteLink(isisLink);
+    }
+
+    /**
+     * Returns the isisAgent instance.
+     *
+     * @return agent
+     */
+    public IsisAgent agent() {
+        return this.agent;
     }
 
     /**
@@ -503,7 +567,7 @@
                         if (!future.isSuccess()) {
                             connectRetryCounter++;
                             log.error("Connection failed, ConnectRetryCounter {} remote host {}", connectRetryCounter,
-                                      IsisConstants.SHOST);
+                                    IsisConstants.SHOST);
                             /*
                              * Reconnect to peer on failure is exponential till 4 mins, later on retry after every 4
                              * mins.
@@ -517,7 +581,7 @@
                             isisChannelHandler.sentConfigPacket(configPacket);
                             connectRetryCounter++;
                             log.info("Connected to remote host {}, Connect Counter {}", IsisConstants.SHOST,
-                                     connectRetryCounter);
+                                    connectRetryCounter);
                             disconnectExecutor();
 
                             return;