5f92d37f694a2d09b341091a9bcb5685341aac7a
[vamsas.git] / src / uk / ac / vamsas / client / simpleclient / SimplePickManager.java
1 package uk.ac.vamsas.client.simpleclient;\r
2 \r
3 import org.apache.commons.logging.*;\r
4 \r
5 import uk.ac.vamsas.client.picking.IMessageHandler;\r
6 import uk.ac.vamsas.client.picking.IPickManager;\r
7 import uk.ac.vamsas.client.picking.Message;\r
8 import uk.ac.vamsas.client.picking.SocketManager;\r
9 /**\r
10  * Blocking message handler\r
11  * @author\r
12  *\r
13  */\r
14 public class SimplePickManager implements IPickManager {\r
15   private Log log = LogFactory.getLog(SimplePickManager.class);\r
16   \r
17   SocketManager manager=null;\r
18   SimplePickManager(SocketManager manager) {\r
19     this.manager=manager;\r
20     final SimplePickManager me=this;\r
21     /**\r
22      * add a handler that calls the SimplePickManager message handler\r
23      */\r
24     manager.registerMessageHandler(new IMessageHandler() {\r
25       public void handleMessage(Message message) {\r
26         me.handleMessage(message);\r
27       }\r
28     });\r
29     \r
30   }\r
31   /**\r
32    * when false, messages are queued in a FIFO until thread can restart.\r
33    */\r
34   private boolean passThru=true;\r
35   /**\r
36    * internal flag - set to true to sleep until passThru is true before passing on a message\r
37    */\r
38   private boolean qUEUE=false;\r
39   /**\r
40    * the client apps message handler\r
41    */\r
42   IMessageHandler pickHandler=null;\r
43   public void registerMessageHandler(IMessageHandler handler) {\r
44     pickHandler=handler; \r
45     \r
46   }\r
47 \r
48   public synchronized void sendMessage(Message message) {\r
49     // throw away messages whilst we block\r
50     if (passThru && manager!=null)\r
51       manager.sendMessage(message);\r
52   }\r
53   /**\r
54    * pass message onto the Apps handler, or wait until\r
55    * passThru is true before passing message on.\r
56    * @param message\r
57    */\r
58   protected synchronized void handleMessage(Message message) {\r
59     if (qUEUE) {\r
60      while (!passThru && manager!=null) {\r
61       log.debug("Not passing through.");\r
62       try {\r
63         Thread.sleep(5);\r
64       } catch (InterruptedException e) {};\r
65     } \r
66     }\r
67     if (passThru && manager!=null)\r
68       pickHandler.handleMessage(message);\r
69   }\r
70 \r
71   /**\r
72    * @return true if messages are being passed to handlers\r
73    */\r
74   public boolean isPassThru() {\r
75     return passThru;\r
76   }\r
77 \r
78   /**\r
79    * @param true to pass messages on to handlers, false to hold messages in queue\r
80    */\r
81   public void setPassThru(boolean passThru) {\r
82     this.passThru = passThru;\r
83   }\r
84   /**\r
85    * shutdown the pickmanager and remove all references to it\r
86    */\r
87   public void shutdown() {\r
88     passThru=false;\r
89     manager.registerMessageHandler(null);\r
90     SocketManager dying = manager;\r
91     manager=null;\r
92         dying.shutdown();\r
93   }\r
94 }\r