Newer
Older
democall3 / src / clients / TutorClient.java
geoma48p on 20 Jul 2015 6 KB Started transition to JMS.
package clients;

import constants.Constants;
import discovery.computername.ComputerNameResolver;
import discovery.computername.InvalidComputerNameException;
import discovery.computername.OtagoComputerNameResolver;
import discovery.server.multicast.ServiceLocator;
import discovery.server.multicast.ServiceNotFoundException;
import gui.Lab;
import gui.LabRegistry;
import gui.QueuePanel;
import gui.processors.TutorLabelProcessor;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.LinkedHashSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.LayoutStyle;
import network.sockets.RequestSender;

/**
 *
 * @author Mark
 */
public class TutorClient {

	private static final Logger LOG = Logger.getLogger(TutorClient.class.getName());

	private TutorLabelProcessor processor;

	private String serverIp;

	private Clip beep;
	
	@SuppressWarnings("rawtypes")
	public TutorClient(final ComputerNameResolver nameResolver) {

		JFrame frame = null;

		try {
			nameResolver.resolve();

			String labName = nameResolver.getLabName();

			final LabRegistry registry = new LabRegistry();
			final Lab[] labs = registry.getLabs().toArray(new Lab[registry.getLabs().size()]);
			final Lab currentLab = registry.getLab(labName);

			final Lab lab = (Lab) JOptionPane.showInputDialog(null, "Which lab?", "Which lab?", JOptionPane.QUESTION_MESSAGE, null, labs, currentLab);

			if (lab == null) {
				System.exit(0);
			} else {
				labName = lab.getLabName();
			}

			serverIp = new ServiceLocator().locateServer(labName);
			frame = new JFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setAlwaysOnTop(true);
			final JPanel mapPanel = lab.getPanel();

			QueuePanel helpPanel = new QueuePanel(new LinkedHashSet());
			QueuePanel markingPanel = new QueuePanel(new LinkedHashSet());

			processor = new TutorLabelProcessor(helpPanel, markingPanel, serverIp);
			processor.processLabels(mapPanel);
			frame.setTitle(String.format("Democall %1s - Tutor Client (%1s)", Constants.VERSION, lab.getLabDescription()));

			javax.swing.GroupLayout layout = new javax.swing.GroupLayout(frame.getContentPane());
			frame.getContentPane().setLayout(layout);

			layout.setHorizontalGroup(
					layout.createParallelGroup(GroupLayout.Alignment.LEADING)
					.addComponent(helpPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE)
					.addComponent(markingPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE)
					.addComponent(mapPanel, GroupLayout.Alignment.CENTER, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));

			layout.setVerticalGroup(
					layout.createParallelGroup(GroupLayout.Alignment.LEADING)
					.addGroup(layout.createSequentialGroup()
							.addComponent(helpPanel, Constants.QUEUE_MIN_HEIGHT, GroupLayout.DEFAULT_SIZE, Constants.QUEUE_MAX_HEIGHT)
							.addComponent(markingPanel, Constants.QUEUE_MIN_HEIGHT, GroupLayout.DEFAULT_SIZE, Constants.QUEUE_MAX_HEIGHT)
							.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
							.addComponent(mapPanel, 100, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)));

			frame.pack();
			frame.setVisible(true);

			final Socket socket = new RequestSender(serverIp).registerTutorClient();

			new Thread(new Runnable() {

				@Override
				public void run() {
					try {
						BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

						while (true) {

							final String message = reader.readLine();
							if (message != null) {  // readLine returns null if buffer is empty
								processMessage(message);
							}
						}
					} catch (IOException ex) {
						Logger.getLogger(TutorClient.class.getName()).log(Level.SEVERE, null, ex);
					}

				}
			}
			).start();


			// dynamic font resize based on window size
			final int defaultSize = Constants.DEFAULT_MAP_FONT_SIZE;
			final int defaultWidth = mapPanel.getWidth();

			frame.addComponentListener(
					new ComponentAdapter() {

						@Override
						public void componentResized(ComponentEvent e) {
							int newWidth = mapPanel.getWidth();
							float scaleFactor = (float) newWidth / (float) defaultWidth;
							int newFontSize = Math.round(defaultSize * scaleFactor);
							processor.resizeFonts(newFontSize);
						}

					}
			);

			// load the beep audio clip into the audio system sample bank
			AudioInputStream is = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/blip.wav"));
			beep = AudioSystem.getClip();
			beep.open(is);
			
		} catch (InvalidComputerNameException ex) {
			JOptionPane.showMessageDialog(frame, ex.getMessage(), "Error getting computer name.", JOptionPane.ERROR_MESSAGE);
		} catch (ServiceNotFoundException ex) {
			JOptionPane.showMessageDialog(frame, "Could not connect to server.", "Connection error", JOptionPane.ERROR_MESSAGE);
		} catch (Exception ex) {
			LOG.log(Level.SEVERE, null, ex);
		}

		
	}

	public void processMessage(final String message) {

//		System.out.println("processMessage: " + 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);
			beep();
		} else if ("marking".equals(performative)) {
			processor.requestMarking(machineId);
			beep();
		} else if ("cancelhelp".equals(performative)) {
			processor.cancelHelp(machineId);
		} else if ("cancelmarking".equals(performative)) {
			processor.cancelMarking(machineId);
		}
	}

	private void beep() {
		try {
			if(beep !=null && beep.isRunning()) beep.stop();
			beep.setFramePosition(0);  // rewind clip
			beep.start();
		} catch (Exception ex) {
			Logger.getLogger(TutorClient.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
	
	@SuppressWarnings("ResultOfObjectAllocationIgnored")
	public static void main(final String[] args) {

//      System.out.println("Tutor Client");

//      final String name = "SBEASTCAL1-31";
//      final String name = "SB318-10";
//		final String name = "SB316-10";

      final String name = args.length > 0 ? args[0] : null;

		final ComputerNameResolver nameResolver = new OtagoComputerNameResolver(name, "CLIENTNNAME");

		new TutorClient(nameResolver);
	}

}