c8ebfec61439fcb1ceb332d402bd516d0dbe3de4
[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         // void receive() (threaded)\r
78         public void run()\r
79         {\r
80                 try\r
81                 {\r
82                         while (true)\r
83                         {\r
84                                 String str = in.readLine();                             \r
85                                 //logger.info("CLIENT: recv " + str + " from " + rPort);\r
86                                 \r
87                                 // TODO: Spawn this off into the GUI Event-Dispatch thread...\r
88                                 \r
89                                 // Convert the string back into something API friendly\r
90                                 Message message = strToMessage(str);\r
91                                 \r
92                                 // Ignore corrupted or unknown message types\r
93                                 if (message != null)                            \r
94                                         manager.processMessage(this, message);\r
95                         }\r
96                 }\r
97                 catch (Exception e)\r
98                 {\r
99                         // Means the other end of the connection has (probably died) so we need\r
100                         // terminate this endpoint (if this is server side)\r
101                         //logger.info("CLIENT: read failed: " + e);\r
102                                                 \r
103                         terminate();\r
104                 }\r
105         }\r
106         \r
107         void terminate()\r
108         {\r
109                 try { socket.close(); }\r
110                 catch (IOException e) {}\r
111                 \r
112                 //logger.info("CLIENT: closing connection to port " + socket.getPort());\r
113                 manager.removeEndPoint(this);\r
114         }\r
115         \r
116         private Message strToMessage(String str)\r
117         {\r
118                 try\r
119                 {\r
120       if (str==null || str.length()==1)\r
121         return null;\r
122                         if (str.startsWith("CUSTOM"))\r
123                                 return new CustomMessage(str.substring(6));\r
124                 \r
125                         if (str.startsWith("MOUSEOVER"))\r
126                                 return new MouseOverMessage(str);\r
127                 }\r
128                 catch (Exception e)\r
129                 {\r
130                         //logger.info("Unable to reconstruct message: " + e);\r
131                 }\r
132                 \r
133                 return null;\r
134         }\r
135 }