fix non-retrieval of vobject by vorba id on clientdoc interface
[vamsas.git] / src / uk / ac / vamsas / client / picking / SocketManager.java
index f4f4ab7..bc9dd59 100644 (file)
@@ -4,6 +4,8 @@ import java.net.*;
 import java.util.*;\r
 import java.util.logging.*;\r
 \r
+import org.apache.commons.logging.Log;\r
+\r
 /**\r
  * Concrete implementation of the IPickManager interface that uses sockets for\r
  * message communication. An instance of this class attempts to run the central\r
@@ -12,7 +14,7 @@ import java.util.logging.*;
  */\r
 public class SocketManager implements IPickManager\r
 {\r
-       private Logger logger = Logger.getLogger("uk.ac.vamsas.client.picking");\r
+       private Log logger = org.apache.commons.logging.LogFactory.getLog(uk.ac.vamsas.client.picking.SocketManager.class);\r
        \r
        // Maintains a list of client communication objects - each object represents\r
        // a way of talking to either:\r
@@ -24,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
@@ -31,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
@@ -64,7 +68,7 @@ public class SocketManager implements IPickManager
                if (client.openConnection())\r
                {\r
                        clients.add(client);\r
-                       logger.info("List now contains " + clients.size() + " client(s)");\r
+                       //logger.info("List now contains " + clients.size() + " client(s)");\r
                        return true;\r
                }\r
                \r
@@ -90,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
@@ -113,8 +122,8 @@ public class SocketManager implements IPickManager
                        \r
                if (msgHandler != null)\r
                        msgHandler.handleMessage(message);\r
-               else\r
-                       logger.info("No handler available to deal with incoming message");\r
+//             else\r
+//                     logger.info("No handler available to deal with incoming message");\r
        }\r
        \r
        /**\r
@@ -125,11 +134,11 @@ public class SocketManager implements IPickManager
        synchronized void removeEndPoint(PickEndPoint client)\r
        {\r
                clients.remove(client);\r
-               logger.info("List now contains " + clients.size() + " client(s)");\r
+               //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
@@ -140,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
@@ -159,6 +168,25 @@ public class SocketManager implements IPickManager
                                else if (addEndPoint(null))\r
                                        connected = true;\r
                        }\r
+      logger.debug("Completed initializing connection.");\r
                }\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