//
/* * Example ATM simulation - file Session.java * * This file implements the class that represents a single customer session * with the ATM * * Copyright (c) 1997 - Russell C. Bjork * */ package atm; import atm.transaction.Transaction; import atm.util.Status; import atm.util.Money; //
public class Session
{
//
public Session(int cardNumber, ATM atm, Bank bank)
{ _cardNumber = cardNumber;
_atm = atm;
_bank = bank;
_state = RUNNING;
_PIN = 0;
_currentTransaction = null;
}
//
public void doSessionUseCase()
{
_PIN = _atm.getPIN();
do
{
String anotherMenu[] = { "Yes", "No" };
_currentTransaction = Transaction.chooseTransaction(this, _atm, _bank);
int status = _currentTransaction.doTransactionUseCase();
switch (status)
{
case Status.SUCCESS:
if (1 != _atm.getMenuChoice
("Do you want to perform another transaction?",2,anotherMenu))
_state = FINISHED;
break;
case Status.INVALID_PIN:
_state = ABORTED;
break;
default:
boolean doAnother = doFailedTransactionExtension(status);
if (! doAnother)
_state = FINISHED;
}
}
while (_state == RUNNING);
if (_state != ABORTED)
_atm.ejectCard();
}
//
public int doInvalidPINExtension()
{
int code;
for (int i = 0; i < 3; i ++)
{ _PIN = _atm.reEnterPIN();
code = _currentTransaction.sendToBank();
if (code != Status.INVALID_PIN)
return code;
}
_atm.retainCard();
_state = ABORTED;
return Status.INVALID_PIN;
}
//
public boolean doFailedTransactionExtension(int reason)
{ switch(reason)
{
case Status.TOO_LITTLE_CASH:
return _atm.reportTransactionFailure(
"Sorry, there is not enough cash available to satisfy your request");
case Status.ENVELOPE_DEPOSIT_TIMED_OUT:
return _atm.reportTransactionFailure(
"Envelope not deposited - transaction cancelled");
default:
return _atm.reportTransactionFailure(
_bank.rejectionExplanation(reason));
}
}
//
public int cardNumber()
{ return _cardNumber;
}
//
public int PIN()
{ return _PIN;
}
//
// Possible values for _state instance variable
private static final int RUNNING = 0;
private static final int FINISHED = 1;
private static final int ABORTED = 2;
// Instance variables
private int _cardNumber;
private ATM _atm;
private Bank _bank;
private int _state;
private int _PIN;
private Transaction _currentTransaction;
}
//