Modified MouseOverMessage.java so that tabs are used to separate message elements...
[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 class PickEndPoint extends Thread\r
8 {\r
9         private Logger logger = Logger.getLogger("uk.ac.vamsas.client.picking");\r
10         \r
11         private Socket socket;\r
12         private int rPort;\r
13         private BufferedWriter os;\r
14         private BufferedReader in;\r
15 \r
16         private SocketManager manager;  \r
17         \r
18         PickEndPoint(SocketManager manager, Socket s)\r
19         {\r
20                 this.manager = manager;\r
21                 socket = s;\r
22         }\r
23         \r
24         boolean openConnection()\r
25         {\r
26                 try\r
27                 {\r
28                         // Create the socket if it doesn't already exist\r
29                         if (socket == null)\r
30                                 socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);\r
31                         \r
32                         rPort = socket.getPort();\r
33                         socket.setKeepAlive(true);\r
34                                                 \r
35                         // Open the streams for reading/writing\r
36                         os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));\r
37                         in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r
38                 \r
39                         // Start the thread to listen for incoming messages\r
40 //                      logger.info("CLIENT: connection successful to port "\r
41 //                              + socket.getPort() + " via port " + socket.getLocalPort());\r
42                         start();\r
43                         \r
44                         return true;\r
45                 }\r
46                 catch (Exception e)\r
47                 {\r
48                         //logger.info("CLIENT: connection failed: " + e);\r
49                         return false;\r
50                 }\r
51         }\r
52         \r
53         void send(Message message)\r
54         {\r
55                 try\r
56                 {\r
57                         String str = message.getRawMessage();\r
58                         \r
59                         //logger.info("CLIENT: send " + str + " to " + rPort);\r
60                         os.write(str);\r
61                         \r
62                         // We use a newline to terminate the message\r
63                         os.newLine();\r
64                         os.flush();\r
65                 }\r
66                 catch (Exception e)\r
67                 {\r
68                         //logger.info("CLIENT: failed to send");\r
69                         \r
70                         // TODO: terminate the connection on a failed send or retry?\r
71                         terminate();\r
72                 }\r
73         }\r
74         \r
75         // void receive() (threaded)\r
76         public void run()\r
77         {\r
78                 try\r
79                 {\r
80                         while (true)\r
81                         {\r
82                                 String str = in.readLine();                             \r
83                                 //logger.info("CLIENT: recv " + str + " from " + rPort);\r
84                                 \r
85                                 // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
86                                 \r
87                                 // Convert the string back into something API friendly\r
88                                 Message message = strToMessage(str);\r
89                                 \r
90                                 // Ignore corrupted or unknown message types\r
91                                 if (message != null)                            \r
92                                         manager.processMessage(this, message);\r
93                         }\r
94                 }\r
95                 catch (Exception e)\r
96                 {\r
97                         // Means the other end of the connection has (probably died) so we need\r
98                         // terminate this endpoint (if this is server side)\r
99                         //logger.info("CLIENT: read failed: " + e);\r
100                                                 \r
101                         terminate();\r
102                 }\r
103         }\r
104         \r
105         private void terminate()\r
106         {\r
107                 try { socket.close(); }\r
108                 catch (IOException e) {}\r
109                 \r
110                 //logger.info("CLIENT: closing connection to port " + socket.getPort());\r
111                 manager.removeEndPoint(this);\r
112         }\r
113         \r
114         private Message strToMessage(String str)\r
115         {\r
116                 try\r
117                 {\r
118                         if (str.startsWith("CUSTOM"))\r
119                                 return new CustomMessage(str.substring(6));\r
120                 \r
121                         if (str.startsWith("MOUSEOVER"))\r
122                                 return new MouseOverMessage(str);\r
123                 }\r
124                 catch (Exception e)\r
125                 {\r
126                         //logger.info("Unable to reconstruct message: " + e);\r
127                 }\r
128                 \r
129                 return null;\r
130         }\r
131 }