Switched to using pure java Apache Zip implementation
[vamsas.git] / src / uk / ac / vamsas / client / picking / SocketManager.java
index 5df3c43..bc9dd59 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
@@ -33,7 +35,7 @@ public class SocketManager implements IPickManager
         */\r
        public SocketManager()\r
        {\r
-//             logger.setLevel(Level.OFF);\r
+       //logger.setLevel(Level.OFF);\r
                \r
                server = new PickServer(this);\r
                clients = new LinkedList();\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,15 +149,15 @@ public class SocketManager implements IPickManager
        {\r
                public void run()\r
                {\r
-                       //logger.info("Initializing connection...");\r
+                       logger.debug("Initializing connection...");\r
                        boolean connected = false;\r
                        \r
                        // Loop until we can get a connection (one way or the other)\r
-                       while (!connected)\r
+                       while (!connected && isRunning)\r
                        {\r
                                // Sleep for a rnd time so we don't end up with all the VAMSAS\r
                                // apps trying to initialize servers at the same time\r
-                               try { Thread.sleep((int)Math.random()); }\r
+                               try { Thread.sleep((int)(10*Math.random())); }\r
                                catch (InterruptedException e) {}\r
                                        \r
                                // Attempt to open the server port...\r
@@ -161,19 +168,25 @@ public class SocketManager implements IPickManager
                                else if (addEndPoint(null))\r
                                        connected = true;\r
                        }\r
+      logger.debug("Completed initializing connection.");\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
+       public void shutdown()\r
+       {\r
+               logger.debug("Shutting down socket manager.");\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
+                       logger.debug("Closing endpoint.");\r
+      ((PickEndPoint)clients.getFirst()).terminate();\r
+               }\r
+    logger.debug("Shutdown of socketmanager completed.");\r
   }\r
 }
\ No newline at end of file