1 package uk.ac.vamsas.client.picking;
\r
5 import java.util.logging.*;
\r
7 import org.apache.commons.logging.Log;
\r
9 class PickEndPoint extends Thread
\r
11 private Log logger = org.apache.commons.logging.LogFactory.getLog(uk.ac.vamsas.client.picking.PickEndPoint.class);
\r
13 private Socket socket;
\r
15 private BufferedWriter os;
\r
16 private BufferedReader in;
\r
18 private SocketManager manager;
\r
20 PickEndPoint(SocketManager manager, Socket s)
\r
22 this.manager = manager;
\r
26 boolean openConnection()
\r
30 // Create the socket if it doesn't already exist
\r
32 socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);
\r
34 rPort = socket.getPort();
\r
35 socket.setKeepAlive(true);
\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
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
50 //logger.info("CLIENT: connection failed: " + e);
\r
55 void send(Message message)
\r
59 String str = message.getRawMessage();
\r
61 //logger.info("CLIENT: send " + str + " to " + rPort);
\r
64 // We use a newline to terminate the message
\r
70 //logger.info("CLIENT: failed to send");
\r
72 // TODO: terminate the connection on a failed send or retry?
\r
77 * state of server thread - running or not running
\r
79 private boolean running=false;
\r
81 * condition for server thread to stop
\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
90 logger.debug("Disabling pick endpoint.");
\r
96 } catch (Exception e) {
\r
99 logger.debug("Pick endpoint has stopped.");
\r
102 // void receive() (threaded)
\r
111 String str = in.readLine();
\r
112 //logger.info("CLIENT: recv " + str + " from " + rPort);
\r
114 // TODO: Spawn this off into the GUI Event-Dispatch thread...
\r
116 // Convert the string back into something API friendly
\r
118 Message message = strToMessage(str);
\r
120 // Ignore corrupted or unknown message types
\r
121 if (message != null)
\r
122 manager.processMessage(this, message);
\r
126 catch (Exception e)
\r
128 // Means the other end of the connection has (probably) died
\r
129 logger.debug("Exception in receiver loop: "+e.getMessage());
\r
131 // terminate this endpoint (if this is server side)
\r
132 //logger.info("CLIENT: read failed: " + e);
\r
139 private void terminate()
\r
142 if (socket.isConnected())
\r
145 catch (IOException e) {}
\r
147 //logger.info("CLIENT: closing connection to port " + socket.getPort());
\r
148 manager.removeEndPoint(this);
\r
151 private Message strToMessage(String str)
\r
153 // TODO: generalize message class
\r
156 if (str.startsWith("CUSTOM"))
\r
157 return new CustomMessage(str.substring(6));
\r
159 if (str.startsWith("MOUSEOVER"))
\r
160 return new MouseOverMessage(str);
\r
162 catch (Exception e)
\r
164 //logger.info("Unable to reconstruct message: " + e);
\r