package uk.ac.vamsas.client.simpleclient; import org.apache.commons.logging.*; import uk.ac.vamsas.client.picking.IMessageHandler; import uk.ac.vamsas.client.picking.IPickManager; import uk.ac.vamsas.client.picking.Message; import uk.ac.vamsas.client.picking.SocketManager; /** * Blocking message handler * @author * */ public class SimplePickManager implements IPickManager { private Log log = LogFactory.getLog(SimplePickManager.class); SocketManager manager=null; SimplePickManager(SocketManager manager) { this.manager=manager; final SimplePickManager me=this; /** * add a handler that calls the SimplePickManager message handler */ manager.registerMessageHandler(new IMessageHandler() { public void handleMessage(Message message) { me.handleMessage(message); } }); } /** * when false, messages are queued in a FIFO until thread can restart. */ private boolean passThru=true; /** * internal flag - set to true to sleep until passThru is true before passing on a message */ private boolean qUEUE=false; /** * the client apps message handler */ IMessageHandler pickHandler=null; public void registerMessageHandler(IMessageHandler handler) { pickHandler=handler; } public synchronized void sendMessage(Message message) { // throw away messages whilst we block if (passThru && manager!=null) manager.sendMessage(message); } /** * pass message onto the Apps handler, or wait until * passThru is true before passing message on. * @param message */ protected synchronized void handleMessage(Message message) { if (qUEUE) { while (!passThru && manager!=null) { log.debug("Not passing through."); try { Thread.sleep(5); } catch (InterruptedException e) {}; } } if (passThru && manager!=null) pickHandler.handleMessage(message); } /** * @return true if messages are being passed to handlers */ public boolean isPassThru() { return passThru; } /** * @param true to pass messages on to handlers, false to hold messages in queue */ public void setPassThru(boolean passThru) { this.passThru = passThru; } /** * shutdown the pickmanager and remove all references to it */ public void shutdown() { passThru=false; manager.registerMessageHandler(null); SocketManager dying = manager; manager=null; dying.shutdown(); } }