ensured backups are only made when backup==true
[vamsas.git] / src / uk / ac / vamsas / client / picking / PickEndPoint.java
index e62c79e..2c3c194 100644 (file)
@@ -4,15 +4,19 @@ import java.io.*;
 import java.net.*;\r
 import java.util.logging.*;\r
 \r
+import org.apache.commons.logging.Log;\r
+\r
 class PickEndPoint extends Thread\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.PickEndPoint.class);\r
        \r
        private Socket socket;\r
        private int rPort;\r
        private BufferedWriter os;\r
        private BufferedReader in;\r
-\r
+       /**\r
+   * reference to server or null if no comms session active\r
+   */\r
        private SocketManager manager;  \r
        \r
        PickEndPoint(SocketManager manager, Socket s)\r
@@ -56,7 +60,7 @@ class PickEndPoint extends Thread
                {\r
                        String str = message.getRawMessage();\r
                        \r
-                       logger.info("CLIENT: send " + str + " to " + rPort);\r
+                       //logger.info("CLIENT: send " + str + " to " + rPort);\r
                        os.write(str);\r
                        \r
                        // We use a newline to terminate the message\r
@@ -65,9 +69,9 @@ class PickEndPoint extends Thread
                }\r
                catch (Exception e)\r
                {\r
-                       logger.info("CLIENT: failed to send");\r
+                       //logger.info("CLIENT: failed to send");\r
                        \r
-                       // TODO: terminate the connection on a failed send or retry?\r
+                       // TODO: terminate the connection on a failed send or retry? (Has this been done? JBP)\r
                        terminate();\r
                }\r
        }\r
@@ -77,10 +81,10 @@ class PickEndPoint extends Thread
        {\r
                try\r
                {\r
-                       while (true)\r
+                       while (manager!=null)\r
                        {\r
                                String str = in.readLine();                             \r
-                               logger.info("CLIENT: recv " + str + " from " + rPort);\r
+                               //logger.info("CLIENT: recv " + str + " from " + rPort);\r
                                \r
                                // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
                                \r
@@ -96,34 +100,45 @@ class PickEndPoint extends Thread
                {\r
                        // Means the other end of the connection has (probably died) so we need\r
                        // terminate this endpoint (if this is server side)\r
-                       logger.info("CLIENT: read failed: " + e);\r
+                       //logger.info("CLIENT: read failed: " + e);\r
                                                \r
-                       terminate();\r
+                       terminate(); // this may not be necessary - probably caused infinite loop on terminate() without null checks\r
                }\r
        }\r
        \r
-       private void terminate()\r
+       void terminate()\r
        {\r
-               try { socket.close(); }\r
-               catch (IOException e) {}\r
-               \r
-               logger.info("CLIENT: closing connection to port " + socket.getPort());\r
-               manager.removeEndPoint(this);\r
+    SocketManager mgr=manager;\r
+    manager=null; // stops receive thread\r
+               if (socket!=null) {\r
+      try { socket.close(); }\r
+      catch (IOException e) {}\r
+      socket=null;\r
+    }\r
+    //logger.info("CLIENT: closing connection to port " + socket.getPort());\r
+               // terminate() can be called by the socket manager to shutdown the connection,\r
+    // or the receive thread after an exception has been received\r
+    // (which includes the above case when the socket is closed.\r
+    //  so we only want to removeEndPoint once - for the initial call to terminate()\r
+    if (mgr!=null)\r
+      mgr.removeEndPoint(this);\r
        }\r
        \r
        private Message strToMessage(String str)\r
        {\r
                try\r
                {\r
-                       if (str.startsWith("CUSTOM_"))\r
-                               return new CustomMessage(str.substring(7));\r
+      if (str==null || str.length()==1)\r
+        return null;\r
+                       if (str.startsWith("CUSTOM"))\r
+                               return new CustomMessage(str.substring(6));\r
                \r
-                       if (str.startsWith("MOUSEOVER_"))\r
+                       if (str.startsWith("MOUSEOVER"))\r
                                return new MouseOverMessage(str);\r
                }\r
                catch (Exception e)\r
                {\r
-                       logger.info("Unable to reconstruct message: " + e);\r
+                       //logger.info("Unable to reconstruct message: " + e);\r
                }\r
                \r
                return null;\r