/* * ATM Example system - file CustomerConsole.java * * copyright (c) 2001 - Russell C. Bjork * */ package atm.physical; import banking.Money; import banking.Status; import simulation.Simulation; /** Manager for the ATM's customer console. In a real ATM, this would * manage a physical device; in this simulation, it uses classes * in package simulation to simulate the device (actually two separate * devices - the display and the keyboard.) */ public class CustomerConsole { /** Constructor */ public CustomerConsole() { } /** Display a message to the customer * * @param message the message to display */ public void display(String message) { Simulation.getInstance().clearDisplay(); Simulation.getInstance().display(message); } /** Read a PIN entered by the customer (echoed as asterisks) * * @param prompt the message to display prompting the customer to enter PIN * @return the PIN that was entered * @exception Cancelled if customer presses the CANCEL key before pressing ENTER */ public int readPIN(String prompt) throws Cancelled { Simulation.getInstance().clearDisplay(); Simulation.getInstance().display(prompt); Simulation.getInstance().display(""); String input = Simulation.getInstance().readInput(Simulation.PIN_MODE, 0); Simulation.getInstance().clearDisplay(); if (input == null) throw new Cancelled(); else return Integer.parseInt(input); } /** Display a menu of options and return choice made by customer * * @param prompt message to display before the list of options * @param menu the options * @return the number of the option chosen (0 .. # of options - 1) * Note: the options are numbered 1 .. # of options when displayed for the * customer - but the menu array indices and the final result returned are in * the range 0 .. # of options - 1 * * @exception Cancelled if customer presses the CANCEL key before choosing option */ public synchronized int readMenuChoice(String prompt, String[] menu) throws Cancelled { Simulation.getInstance().clearDisplay(); Simulation.getInstance().display(prompt); for (int i = 0; i < menu.length; i ++) Simulation.getInstance().display((i+1) + ") " + menu[i]); String input = Simulation.getInstance().readInput(Simulation.MENU_MODE, menu.length); Simulation.getInstance().clearDisplay(); if (input == null) throw new Cancelled(); else return Integer.parseInt(input) - 1; } /** Read a money amount entered by the customer * * @param prompt the message to display prompting the customer to enter amount * @return the amount entered by the customer * @exception Cancelled if customer presses the CANCEL key before pressing ENTER */ public synchronized Money readAmount(String prompt) throws Cancelled { Simulation.getInstance().clearDisplay(); Simulation.getInstance().display(prompt); Simulation.getInstance().display(""); String input = Simulation.getInstance().readInput(Simulation.AMOUNT_MODE, 0); Simulation.getInstance().clearDisplay(); if (input == null) throw new Cancelled(); else { int dollars = Integer.parseInt(input) / 100; int cents = Integer.parseInt(input) % 100; return new Money(dollars, cents); } } /** Exception thrown when the user presses the cancel key while the ATM is * waiting for some action */ public static class Cancelled extends Exception { /** Constructor */ public Cancelled() { super("Cancelled by customer"); } } }