public class ATM
{
private boolean userAuthenticated; //whether user is authenticated
private int currentAccountNumber; // current user\'s account number
private Screen screen; //ATM\'s screen
private Keypad keypad; //ATM\'s keypad
private CashDispenser cashDispenser; //ATM\'s cash dispenser
private DepositSlot depositSlot; //ATM\'s deposit slot
private BankDatabase bankDatabase; // account information database
//constants corresponding to main menu options
private static final int BALANCE_INQUIRY = 1;
private static final int WITHDRAWAL = 2;
private static final int DEPOSIT = 3;
private static final int EXIT = 4;
//no-argument ATM constructor initializes instance variables
public ATM()
{
userAuthenticated = false; //user is not authenticated to start
currentAccountNumber = 0; //no current account number to start
screen = new Screen(); //create screen
keypad = new Keypad(); //create keypad
cashDispenser = new CashDispenser(); //create cash dispenser
depositSlot = new DepositSlot(); //crate deposit slot
bankDatabase = new BankDatabase(); //create acct info database
} //end no-argument ATM constructor
//start ATM
public void run()
{
//welcome and authenticate user; perform transaction
while(true)
{
//loop while user is not yet authenticated
while(!userAuthenticated)
{
screen.displayMessageLine("\\nSelamat Datang!");
authenticateUser(); //authenticated user
} //end while
performTransactions(); //user is now authenticated
userAuthenticated = false; //reset before next ATM session
currentAccountNumber = 0; //reset before next ATM session
screen.displayMessageLine("\\nTerima Kasih!\\nSampai Jumpa!");
}
} //end method run
//attempts to authenticate user against database
private void authenticateUser()
{
screen.displayMessage("\\nSilahkan masukkan nomor akun anda : ");
int accountNumber = keypad.getInput(); //input account number
screen.displayMessage("\\nSilahkan masukkan PIN anda : "); //prompt for PIN
int pin = keypad.getInput(); //input PIN
//set userAuthenticated to boolean value returned by database
userAuthenticated = bankDatabase.authenticateUser(accountNumber, pin);
//check whether authentication succeeded
if(userAuthenticated)
{
currentAccountNumber = accountNumber; //save user\'s account
}
else
{
screen.displayMessageLine("Nomor akun atau PIN anda tidak valid.");
screen.displayMessageLine("Silahkan coba lagi.");
}
}
//display the main menu and perform transaction
private void performTransactions()
{
//local variable to store transaction currently being processed
Transaction currentTransaction = null;
boolean userExited = false; //user has not chosen to exit.
//loop while user has not chosen option to exit system
while(!userExited)
{
//show main menu and get user selection
int mainMenuSelection = displayMainMenu();
//decide how to proceed based on user\'s menu selection
switch(mainMenuSelection)
{
//user chose to perform one of three transaction types
case BALANCE_INQUIRY :
case WITHDRAWAL :
case DEPOSIT :
//initialize as new object of chosen type
currentTransaction = createTransaction(mainMenuSelection);
currentTransaction.execute();
break;
case EXIT :
screen.displayMessageLine("\\nKeluar dari sistem...");
userExited = true;
break;
default : //user didn\'t enter an integer from 1-4
screen.displayMessageLine("\\nMenu yang anda pilih tidak valid.");
screen.displayMessageLine("Silahkan coba lagi.");
break;
} //end switch
} //end while
} //end method performTransaction
private int displayMainMenu()
{
screen.displayMessageLine("\\nMain Menu :");
screen.displayMessageLine("1. Lihat Saldo"); //view my balance
screen.displayMessageLine("2. Tarik Uang"); //withdraw cash
screen.displayMessageLine("3. Simpan Uang"); //deposit funds
screen.displayMessageLine("4. Keluar\\n");
screen.displayMessage("Masukkan pilihan : ");
return keypad.getInput(); //return user\'s selection
}
private Transaction createTransaction(int type)
{
Transaction temp = null;
switch(type){
case BALANCE_INQUIRY :
temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase);
break;
case WITHDRAWAL :
temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser);
break;
case DEPOSIT :
temp = new Deposit(currentAccountNumber, screen, bankDatabase, keypad, depositSlot);
break;
}
return temp;
}
}