Newer
Older
democall3 / src / server / RequestThread.java
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);
		}

	}

}