+/*\r
+ * This file is part of the Vamsas Client version 0.1. \r
+ * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, \r
+ * Andrew Waterhouse and Dominik Lindner.\r
+ * \r
+ * Earlier versions have also been incorporated into Jalview version 2.4 \r
+ * since 2008, and TOPALi version 2 since 2007.\r
+ * \r
+ * The Vamsas Client is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU Lesser General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ * \r
+ * The Vamsas Client is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU Lesser General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU Lesser General Public License\r
+ * along with the Vamsas Client. If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
package uk.ac.vamsas.client.picking;\r
\r
import java.io.*;\r
\r
import org.apache.commons.logging.Log;\r
\r
-class PickEndPoint extends Thread\r
-{\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
+class PickEndPoint extends Thread {\r
+ private Log logger = org.apache.commons.logging.LogFactory\r
+ .getLog(uk.ac.vamsas.client.picking.PickEndPoint.class);\r
+\r
+ private Socket socket;\r
+\r
+ private int rPort;\r
+\r
+ private BufferedWriter os;\r
+\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
- {\r
- this.manager = manager;\r
- socket = s;\r
- }\r
- \r
- boolean openConnection()\r
- {\r
- try\r
- {\r
- // Create the socket if it doesn't already exist\r
- if (socket == null)\r
- socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);\r
- \r
- rPort = socket.getPort();\r
- socket.setKeepAlive(true);\r
- \r
- // Open the streams for reading/writing\r
- os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));\r
- in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r
- \r
- // Start the thread to listen for incoming messages\r
- logger.debug("CLIENT: connection successful to port "\r
- + socket.getPort() + " via port " + socket.getLocalPort());\r
- start();\r
- \r
- return true;\r
- }\r
- catch (Exception e)\r
- {\r
- logger.info("CLIENT: connection failed: " + e);\r
- return false;\r
- }\r
- }\r
- \r
- void send(Message message)\r
- {\r
- try\r
- {\r
- String str = message.getRawMessage();\r
- \r
- // System.err.println("CLIENT: send " + str + " to " + rPort);\r
- os.write(str);\r
- \r
- // We use a newline to terminate the message\r
- os.newLine();\r
- os.flush();\r
- }\r
- catch (Exception e)\r
- {\r
- //logger.info("CLIENT: failed to send");\r
- \r
- // TODO: terminate the connection on a failed send or retry? (Has this been done? JBP)\r
- terminate();\r
- }\r
- }\r
- \r
- // void receive() (threaded)\r
- public void run()\r
- {\r
- try\r
- {\r
- while (manager!=null)\r
- {\r
- String str = in.readLine(); \r
- //logger.info("CLIENT: recv " + str + " from " + rPort);\r
- \r
- // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
- \r
- // Convert the string back into something API friendly\r
- Message message = strToMessage(str);\r
- \r
- // Ignore corrupted or unknown message types\r
- if (message != null) \r
- manager.processMessage(this, message);\r
- }\r
- }\r
- catch (Exception e)\r
- {\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
- \r
- terminate(); // this may not be necessary - probably caused infinite loop on terminate() without null checks\r
- }\r
- }\r
- \r
- void terminate()\r
- {\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
+ private SocketManager manager;\r
+\r
+ PickEndPoint(SocketManager manager, Socket s) {\r
+ this.manager = manager;\r
+ socket = s;\r
+ }\r
+\r
+ boolean openConnection() {\r
+ try {\r
+ // Create the socket if it doesn't already exist\r
+ if (socket == null)\r
+ socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);\r
+\r
+ rPort = socket.getPort();\r
+ socket.setKeepAlive(true);\r
+\r
+ // Open the streams for reading/writing\r
+ os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));\r
+ in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r
+\r
+ // Start the thread to listen for incoming messages\r
+ logger.debug("CLIENT: connection successful to port " + socket.getPort()\r
+ + " via port " + socket.getLocalPort());\r
+ start();\r
+\r
+ return true;\r
+ } catch (Exception e) {\r
+ logger.info("CLIENT: connection failed: " + e);\r
+ return false;\r
+ }\r
+ }\r
+\r
+ void send(Message message) {\r
+ try {\r
+ String str = message.getRawMessage();\r
+\r
+ // System.err.println("CLIENT: send " + str + " to " + rPort);\r
+ os.write(str);\r
+\r
+ // We use a newline to terminate the message\r
+ os.newLine();\r
+ os.flush();\r
+ } catch (Exception e) {\r
+ // logger.info("CLIENT: failed to send");\r
+\r
+ // TODO: terminate the connection on a failed send or retry? (Has this\r
+ // been done? JBP)\r
+ terminate();\r
+ }\r
+ }\r
+\r
+ // void receive() (threaded)\r
+ public void run() {\r
+ try {\r
+ while (manager != null) {\r
+ String str = in.readLine();\r
+ // logger.info("CLIENT: recv " + str + " from " + rPort);\r
+\r
+ // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
+\r
+ // Convert the string back into something API friendly\r
+ Message message = strToMessage(str);\r
+\r
+ // Ignore corrupted or unknown message types\r
+ if (message != null)\r
+ manager.processMessage(this, message);\r
+ }\r
+ } catch (Exception e) {\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
+\r
+ terminate(); // this may not be necessary - probably caused infinite loop\r
+ // on terminate() without null checks\r
+ }\r
+ }\r
+\r
+ void terminate() {\r
+ SocketManager mgr = manager;\r
+ manager = null; // stops receive thread\r
+ if (socket != null) {\r
+ try {\r
+ socket.close();\r
+ } catch (IOException e) {\r
+ }\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
+ // logger.info("CLIENT: closing connection to port " + socket.getPort());\r
+ // terminate() can be called by the socket manager to shutdown the\r
+ // 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
+ // so we only want to removeEndPoint once - for the initial call to\r
+ // terminate()\r
+ if (mgr != null)\r
mgr.removeEndPoint(this);\r
- }\r
- \r
- private Message strToMessage(String str)\r
- {\r
- try\r
- {\r
- // System.err.println("Received Message\n*\n"+str+"*");\r
- if (str==null || str.length()==1)\r
+ }\r
+\r
+ private Message strToMessage(String str) {\r
+ try {\r
+ // System.err.println("Received Message\n*\n"+str+"*");\r
+ if (str == null || str.length() == 1)\r
return null;\r
- if (str.startsWith("CUSTOM"))\r
- return new CustomMessage(str.substring(6));\r
- if (str.startsWith("MOUSEOVER"))\r
- return new MouseOverMessage(str);\r
- if (str.startsWith("SELECTION"))\r
+ if (str.startsWith("CUSTOM"))\r
+ return new CustomMessage(str.substring(6));\r
+ if (str.startsWith("MOUSEOVER"))\r
+ return new MouseOverMessage(str);\r
+ if (str.startsWith("SELECTION"))\r
return new SelectionMessage(str);\r
- \r
- }\r
- catch (Exception e)\r
- {\r
- //logger.info("Unable to reconstruct message: " + e);\r
- }\r
- \r
- return null;\r
- }\r
-}
\ No newline at end of file
+\r
+ } catch (Exception e) {\r
+ // logger.info("Unable to reconstruct message: " + e);\r
+ }\r
+\r
+ return null;\r
+ }\r
+}\r