1864874e005b5514310aa7c8d98496a3d6f1c9ee
[vamsas.git] / src / uk / ac / vamsas / client / picking / PickEndPoint.java
1 package uk.ac.vamsas.client.picking;\r
2 \r
3 import java.io.*;\r
4 import java.net.*;\r
5 import java.util.logging.*;\r
6 \r
7 import org.apache.commons.logging.Log;\r
8 \r
9 class PickEndPoint extends Thread\r
10 {\r
11         private Log logger = org.apache.commons.logging.LogFactory.getLog(uk.ac.vamsas.client.picking.PickEndPoint.class);\r
12         \r
13         private Socket socket;\r
14         private int rPort;\r
15         private BufferedWriter os;\r
16         private BufferedReader in;\r
17 \r
18         private SocketManager manager;  \r
19         \r
20         PickEndPoint(SocketManager manager, Socket s)\r
21         {\r
22                 this.manager = manager;\r
23                 socket = s;\r
24         }\r
25         \r
26         boolean openConnection()\r
27         {\r
28                 try\r
29                 {\r
30                         // Create the socket if it doesn't already exist\r
31                         if (socket == null)\r
32                                 socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);\r
33                         \r
34                         rPort = socket.getPort();\r
35                         socket.setKeepAlive(true);\r
36                                                 \r
37                         // Open the streams for reading/writing\r
38                         os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));\r
39                         in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r
40                 \r
41                         // Start the thread to listen for incoming messages\r
42 //                      logger.info("CLIENT: connection successful to port "\r
43 //                              + socket.getPort() + " via port " + socket.getLocalPort());\r
44                         start();\r
45                         \r
46                         return true;\r
47                 }\r
48                 catch (Exception e)\r
49                 {\r
50                         //logger.info("CLIENT: connection failed: " + e);\r
51                         return false;\r
52                 }\r
53         }\r
54         \r
55         void send(Message message)\r
56         {\r
57                 try\r
58                 {\r
59                         String str = message.getRawMessage();\r
60                         \r
61                         //logger.info("CLIENT: send " + str + " to " + rPort);\r
62                         os.write(str);\r
63                         \r
64                         // We use a newline to terminate the message\r
65                         os.newLine();\r
66                         os.flush();\r
67                 }\r
68                 catch (Exception e)\r
69                 {\r
70                         //logger.info("CLIENT: failed to send");\r
71                         \r
72                         // TODO: terminate the connection on a failed send or retry?\r
73                         terminate();\r
74                 }\r
75         }\r
76   /**\r
77    * state of server thread - running or not running\r
78    */\r
79   private boolean running=false;\r
80   /**\r
81    * condition for server thread to stop\r
82    */\r
83   private boolean enabled=true;\r
84   public void haltEndpoint() {\r
85   // TODO: FIX THIS METHOD\r
86     if (!running || !enabled) {\r
87       logger.debug("PickEndpoint is not running or already requested to halt.");\r
88       return;\r
89     }\r
90     logger.debug("Disabling pick endpoint.");\r
91     enabled=false;\r
92     terminate();\r
93     while (running) {\r
94       try {\r
95         Thread.sleep(1);\r
96       } catch (Exception e) {\r
97       }\r
98     }\r
99     logger.debug("Pick endpoint has stopped.");\r
100   }\r
101 \r
102         // void receive() (threaded)\r
103         public void run()\r
104         {\r
105     enabled=true;\r
106     running=true;\r
107                 try\r
108                 {\r
109                         while (enabled)\r
110                         {\r
111                                 String str = in.readLine();                             \r
112                                 //logger.info("CLIENT: recv " + str + " from " + rPort);\r
113                                 \r
114                                 // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
115                                 \r
116                                 // Convert the string back into something API friendly\r
117         if (str!=null) {\r
118                                 Message message = strToMessage(str);\r
119                                 \r
120                                 // Ignore corrupted or unknown message types\r
121                                 if (message != null)                            \r
122                                         manager.processMessage(this, message);\r
123         }\r
124                         }\r
125                 }\r
126                 catch (Exception e)\r
127                 {\r
128                         // Means the other end of the connection has (probably) died\r
129       logger.debug("Exception in receiver loop: "+e.getMessage());\r
130     }\r
131                 // terminate this endpoint (if this is server side)\r
132     //logger.info("CLIENT: read failed: " + e);\r
133           \r
134     terminate();\r
135   \r
136                 running=false;\r
137         }\r
138         \r
139         private void terminate()\r
140         {\r
141                 try { \r
142       if (socket.isConnected())\r
143         socket.close(); \r
144       }\r
145                 catch (IOException e) {}\r
146                 \r
147                 //logger.info("CLIENT: closing connection to port " + socket.getPort());\r
148                 manager.removeEndPoint(this);\r
149         }\r
150         \r
151         private Message strToMessage(String str)\r
152         {\r
153     // TODO: generalize message class \r
154                 try\r
155                 {\r
156                         if (str.startsWith("CUSTOM"))\r
157                                 return new CustomMessage(str.substring(6));\r
158                 \r
159                         if (str.startsWith("MOUSEOVER"))\r
160                                 return new MouseOverMessage(str);\r
161                 }\r
162                 catch (Exception e)\r
163                 {\r
164                         //logger.info("Unable to reconstruct message: " + e);\r
165                 }\r
166                 \r
167                 return null;\r
168         }\r
169 }