import java.util.*;\r
import java.util.logging.*;\r
\r
+import org.apache.commons.logging.Log;\r
+\r
/**\r
* Concrete implementation of the IPickManager interface that uses sockets for\r
* message communication. An instance of this class attempts to run the central\r
*/\r
public class SocketManager implements IPickManager\r
{\r
- private Logger logger = Logger.getLogger("uk.ac.vamsas.client.picking");\r
+ private Log logger = org.apache.commons.logging.LogFactory.getLog(uk.ac.vamsas.client.picking.SocketManager.class);\r
\r
// Maintains a list of client communication objects - each object represents\r
// a way of talking to either:\r
\r
private IMessageHandler msgHandler;\r
\r
+ private boolean isRunning = true;\r
+ \r
/**\r
* Constructs a new PickManager. This method will return immediately, while\r
* a looping thread runs that attempts to run the server or connect to an\r
*/\r
public SocketManager()\r
{\r
-// logger.setLevel(Level.OFF);\r
+ //logger.setLevel(Level.OFF);\r
\r
server = new PickServer(this);\r
clients = new LinkedList();\r
if (client.openConnection())\r
{\r
clients.add(client);\r
- logger.info("List now contains " + clients.size() + " client(s)");\r
+ //logger.info("List now contains " + clients.size() + " client(s)");\r
return true;\r
}\r
\r
*/\r
private void forwardMessage(PickEndPoint origin, Message message)\r
{\r
- ListIterator itor = clients.listIterator();\r
- while (itor.hasNext())\r
+ for (int i = clients.size()-1; i >= 0; i--)\r
{\r
- PickEndPoint client = (PickEndPoint) itor.next();\r
- \r
- if (client != origin)\r
- client.send(message);\r
+ try\r
+ {\r
+ PickEndPoint client = (PickEndPoint) clients.get(i);\r
+ if (client != origin)\r
+ client.send(message);\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ System.out.println("FORWARD: " + e);\r
+ }\r
}\r
}\r
\r
\r
if (msgHandler != null)\r
msgHandler.handleMessage(message);\r
- else\r
- logger.info("No handler available to deal with incoming message");\r
+// else\r
+// logger.info("No handler available to deal with incoming message");\r
}\r
\r
/**\r
synchronized void removeEndPoint(PickEndPoint client)\r
{\r
clients.remove(client);\r
- logger.info("List now contains " + clients.size() + " client(s)");\r
+ //logger.info("List now contains " + clients.size() + " client(s)");\r
\r
// If there's no endpoints left, then we've lost all connections and\r
- // need to reinitialize\r
- if (clients.size() == 0)\r
+ // need to reinitialize - but only if we've not been told to stop\r
+ if (clients.size() == 0 && isRunning)\r
new InitializeThread().start();\r
}\r
\r
{\r
public void run()\r
{\r
- logger.info("Initializing connection...");\r
+ logger.debug("Initializing connection...");\r
boolean connected = false;\r
\r
// Loop until we can get a connection (one way or the other)\r
- while (!connected)\r
+ while (!connected && isRunning)\r
{\r
// Sleep for a rnd time so we don't end up with all the VAMSAS\r
// apps trying to initialize servers at the same time\r
- try { Thread.sleep((int)Math.random()); }\r
+ try { Thread.sleep((int)(10*Math.random())); }\r
catch (InterruptedException e) {}\r
\r
// Attempt to open the server port...\r
else if (addEndPoint(null))\r
connected = true;\r
}\r
+ logger.debug("Completed initializing connection.");\r
}\r
}\r
+ \r
+ public void shutdown()\r
+ {\r
+ logger.debug("Shutting down socket manager.");\r
+ if (server == null)\r
+ throw new Error("Client Implementation Error: shutdown() called on uninitialized SocketManager.");\r
+ \r
+ isRunning = false;\r
+ \r
+ if (server.isServer())\r
+ server.terminate();\r
+ \r
+ while (clients.size() > 0) {\r
+ logger.debug("Closing endpoint.");\r
+ ((PickEndPoint)clients.getFirst()).terminate();\r
+ }\r
+ logger.debug("Shutdown of socketmanager completed.");\r
+ }\r
}
\ No newline at end of file