Added shutdown() methods for the socket-based PickManager code.
[vamsas.git] / src / uk / ac / vamsas / client / picking / SocketManager.java
index 5df3c43..ad12a71 100644 (file)
@@ -26,6 +26,8 @@ public class SocketManager implements IPickManager
        \r
        private IMessageHandler msgHandler;\r
        \r
+       private boolean isRunning = true;\r
+       \r
        /**\r
         * Constructs a new PickManager. This method will return immediately, while\r
         * a looping thread runs that attempts to run the server or connect to an\r
@@ -92,13 +94,18 @@ public class SocketManager implements IPickManager
         */\r
        private void forwardMessage(PickEndPoint origin, Message message)\r
        {\r
-               ListIterator itor = clients.listIterator();\r
-               while (itor.hasNext())\r
+               for (int i = clients.size()-1; i >= 0; i--)\r
                {\r
-                       PickEndPoint client = (PickEndPoint) itor.next();\r
-                       \r
-                       if (client != origin)\r
-                               client.send(message);\r
+                       try\r
+                       {\r
+                               PickEndPoint client = (PickEndPoint) clients.get(i);\r
+                               if (client != origin)\r
+                                       client.send(message);\r
+                       }\r
+                       catch (Exception e)\r
+                       {\r
+                               System.out.println("FORWARD: " + e);\r
+                       }\r
                }\r
        }\r
        \r
@@ -130,8 +137,8 @@ public class SocketManager implements IPickManager
                //logger.info("List now contains " + clients.size() + " client(s)");\r
                \r
                // If there's no endpoints left, then we've lost all connections and\r
-               // need to reinitialize\r
-               if (clients.size() == 0)\r
+               // need to reinitialize - but only if we've not been told to stop\r
+               if (clients.size() == 0 && isRunning)\r
                        new InitializeThread().start();\r
        }\r
        \r
@@ -142,7 +149,7 @@ public class SocketManager implements IPickManager
        {\r
                public void run()\r
                {\r
-                       //logger.info("Initializing connection...");\r
+                       logger.info("Initializing connection...");\r
                        boolean connected = false;\r
                        \r
                        // Loop until we can get a connection (one way or the other)\r
@@ -163,17 +170,18 @@ public class SocketManager implements IPickManager
                        }\r
                }\r
        }\r
-  public void haltManager() {\r
-    // TODO: FIX this method\r
-    if (server==null)\r
-      throw new Error("Client Implementation Error: haltManager called on uninitialized SocketManager.");\r
-    logger.debug("Halting PickManager threads...");\r
-    while (clients.size()>0) {\r
-      ((PickEndPoint)clients.getFirst()).haltEndpoint();\r
-    }\r
-    server.haltServer();\r
-    \r
-    logger.debug("Halted PickManager threads.");\r
-    \r
-  }\r
+       \r
+       public void shutdown()\r
+       {\r
+               if (server == null)\r
+                       throw new Error("Client Implementation Error: shutdown() called on uninitialized SocketManager.");\r
+               \r
+               isRunning = false;\r
+               \r
+               if (server.isServer())\r
+                       server.terminate();\r
+\r
+               while (clients.size() > 0)\r
+                       ((PickEndPoint)clients.getFirst()).terminate();\r
+       }\r
 }
\ No newline at end of file