package clients; import constants.Constants; import discovery.computername.ComputerNameResolver; import discovery.computername.InvalidComputerNameException; import discovery.computername.OtagoComputerNameResolver; import discovery.server.ServiceLocator; import discovery.server.ServiceNotFoundException; import gui.Lab; import gui.LabRegistry; import gui.QueuePanel; import gui.processors.TutorLabelProcessor; import java.awt.Toolkit; 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.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.LayoutStyle; import network.RequestSender; /** * * @author Mark */ public class TutorClient { private static final Logger LOG = Logger.getLogger(TutorClient.class.getName()); private TutorLabelProcessor processor; private String serverIp; @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); } } ); } 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); Toolkit.getDefaultToolkit().beep(); } else if ("marking".equals(performative)) { processor.requestMarking(machineId); Toolkit.getDefaultToolkit().beep(); } else if ("cancelhelp".equals(performative)) { processor.cancelHelp(machineId); } else if ("cancelmarking".equals(performative)) { processor.cancelMarking(machineId); } } @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, "COMPUTERNAME"); new TutorClient(nameResolver); } }