package server; import discovery.server.KnownClients; import gui.processors.RequestProcessor; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import network.MessageGenerator; /** * * @author Mark */ public class RequestThread extends Thread { private static final Logger LOG = Logger.getLogger(RequestThread.class.getName()); private static final Set<PrintWriter> tutorClients = new HashSet<PrintWriter>(); private final RequestProcessor processor; private final Socket socket; private boolean dontClose = false; public RequestThread(final RequestProcessor processor, final Socket socket) { super(); super.setDaemon(true); this.processor = processor; this.socket = socket; } @Override public void run() { try { final BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); final String message = reader.readLine(); if (message != null) { // readLine returns null if buffer is empty processMessage(message); } if (!dontClose) { socket.close(); } } catch (IOException ex) { LOG.log(Level.SEVERE, null, ex); } } public void processMessage(final String message) { System.out.println(message); final String[] messageBits = message.split(" "); final String performative = messageBits[0]; final int machineId = Integer.parseInt(messageBits[1]); if ("help".equals(performative)) { processor.requestHelp(machineId); } else if ("marking".equals(performative)) { processor.requestMarking(machineId); } else if ("cancelhelp".equals(performative)) { processor.cancelHelp(machineId); } else if ("cancelmarking".equals(performative)) { processor.cancelMarking(machineId); // } else if ("queue".equals(performative)) { // try { // final ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); // oos.writeObject(processor.getQueue()); // oos.close(); // } catch (IOException ex) { // LOG.log(Level.SEVERE, null, ex); // } } else if ("register".equals(performative)) { try { // send the current state of the queues back to the connecting client final PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); Collection<Integer> helpQueue = processor.getHelpQueue(); for (Integer i : helpQueue) { writer.println(new MessageGenerator().requestHelp(String.valueOf(i))); } Collection<Integer> markingQueue = processor.getMarkingQueue(); for (Integer i : markingQueue) { writer.println(new MessageGenerator().requestMarking(String.valueOf(i))); } writer.flush(); KnownClients.addClient(writer); dontClose = true; } catch (IOException ex) { LOG.log(Level.SEVERE, null, ex); } } else { LOG.log(Level.SEVERE, "Unknown command: {0}", performative); } } }