ProjectReport - Maurya,Shailesh

76
PROJECT REPORT CS-586 Software Systems Architecture Shailesh Maurya A20354782 [email protected]

Transcript of ProjectReport - Maurya,Shailesh

Page 1: ProjectReport - Maurya,Shailesh

PROJECT REPORT

CS-586 Software Systems Architecture

Shailesh Maurya

A20354782

[email protected]

Page 2: ProjectReport - Maurya,Shailesh

Contents:

1. Introduction

2. MDA-EFSM model for the ACCOUNT components

3. Class diagrams of the MDA of the Account components

4. Purpose and main attributes of class

5. Dynamics

6. Source code and patterns

Page 3: ProjectReport - Maurya,Shailesh

1. Introduction Goal: The goal of this project is to design two different ACCOUNT components using a Model-Driven

Architecture (MDA) and then implement these ACCOUNT components based on this design.

Description of the Project: There are two ACCOUNT components: ACCOUNT-1 and ACCOUNT-2:

ACCOUNT-1 component supports the following operations:

open (string p, string y, float a) // open an account where p is a pin, y is a user’s identification #, and a is

a balance

pin (string x) // provides pin #

deposit (float d) // deposit amount d

withdraw (float w) // withdraw amount w

balance () // display the current balance

login (string y) // login where y is a client’s identification #

logout () // logout from the account

lock (string x) // locks an account where x is a pin

unlock (string x) // unlocks an account where x is a pin

ACCOUNT-2 component supports the following operations:

OPEN (int p, int y, int a) // open an account where p is a pin, y is a user’s identification #, and a

is a balance

PIN (int x) // provides pin #

DEPOSIT (int d) // deposit amount d

WITHDRAW (int w) // withdraw amount w

BALANCE () // display the current balance

LOGIN (int y) // login where y is a client’s identification #

LOGOUT () // logout from the account

suspend () // suspends an account

activate () // activates a suspended account

close () // an account is closed

Both ACCOUNT components are state-based components and support three types of transactions:

withdrawal, deposit, and balance inquiry. Before any transaction can be performed, operation open (p,

y, a) (or OPEN (p, y, a)) must be issued, where y is a client’s identification #, p is a pin used to get

permission to perform transactions and a is an initial balance in the account. It is assumed that open

Page 4: ProjectReport - Maurya,Shailesh

()/OPEN () operation is issued only once for a given account. Before any transaction can be performed,

operation login(y) must be issued (where y is a client’s identification #) followed by pin(x) (or PIN(x))

operation. The pin(x) (or PIN(x)) operation must contain the valid pin # that must be the same as the pin

# provided in open (p, y, a) (or OPEN (p, y, a)) operation. There is a limit on the number of attempts with

an invalid pin. The account can be overdrawn (below minimum balance), but a penalty may apply. If the

balance is below the minimum balance, then the withdrawal transaction cannot be performed. The

account may become locked by lock operation or suspended by suspend operation. If the account is

locked, withdrawal, deposit, logout and balance transactions cannot be performed. A locked account

becomes unlocked by unlock operation. A suspended account can be activated by activate operation. In

addition, a suspended account can be closed by close operation. The detailed behavior of both

ACCOUNT components is specified using EFSM. Aspects that vary between two ACCOUNT components:

maximum number of times incorrect pin can be entered, minimum balance, display menu(s), messages,

e.g., error messages, etc., penalties, operation names and signatures, data types, etc.

2. MDA-EFSM model for the ACCOUNT components

2.1 General MDA Architecture

This project implements two ATMs implemented using Model Driven Architecture. The ATMs differ in

their user interface specifications, but are similar in behavior. The main goal is to separate the Platform

specific portion of the system from the Platform independent portion. The general outline of the

implementation is to use Model-Driven-Architecture as the overall design, and use an Extended-Finite-

State-Machine (EFSM) to capture the states in which the model can be in at any point of time.

The project uses following OO design patterns:

• State pattern

• Abstract Factory pattern

• Strategy pattern

The project implements the Output Processor using Strategy pattern, and uses Abstract Factory Pattern

to select and initialize a list of output actions for each ATM.

Page 5: ProjectReport - Maurya,Shailesh

2.2 List of events for the MDA-EFSM

e1: Open()

e2: Login()

e3: IncorrectLogin()

e4: IncorectPin(int max)

e5: CorrectPinBelowMin()

e6: CorrectPinAboveMin()

e7: Deposit()

e8: BelowMinBalance()

e9: AboveMinBalance()

e10:Logout()

e11: Balance()

e12: Withdraw()

Page 6: ProjectReport - Maurya,Shailesh

e13: WithdrawBelowMinBalance()

e14: NoFunds()

e15: Lock()

e16: IncorrectLock()

e17: Unlock()

e18: IncorrectUnlock()

e19: Suspend()

e20: Activate()

e21: Close()

2.3 List of actions for the MDA-EFSM with their descriptions

A1: StoreData() // stores pin from temporary data store to pin in data store

A2: IncorrectIdMsg() // displays incorrect ID message

A3: IncorrectPinMsg() // displays incorrect pin message

A4: TooManyAttemptsMsg() // display too many attempts message

A5: DisplayMenu() // display a menu with a list of transactions

A6: MakeDeposit() // makes deposit (increases balance by a value stored in temp. data

store)

A7: DisplayBalance() // displays the current value of the balance

A8: PromptForPin() // prompts to enter pin

A9: MakeWithdraw() // makes withdraw (decreases balance by a value stored in temp. data

store)

A10: Penalty() // applies penalty (decreases balance by the amount of penalty)

A11: IncorrectLock Msg() // displays incorrect lock msg

A12: IncorrectUnlock Msg() // displays incorrect unlock msg

A13: NoFundsMsg() // Displays no sufficient funds msg

2.4 State diagram for the MDA-EFSM

Page 7: ProjectReport - Maurya,Shailesh

check pin ready

overdrawn

idleS1

Locked

IncorrectPin( max )[ attempts<max ] / IncorrectPinMsg; attempts++

CorrectPinAboveMin / DisplayMenu

CorrectPinBelowMin / DisplayMenu

Open / StoreData

IncorrectPin( max )[ attempts==max ] / IncorrectPinMsg; TooManyAttemptsMsg

Login / attempts=0; PromptForPin AboveMinBalance

WithdrawBelowMinBalance / Penalty

BelowMinBalance

Suspended

Close

Activate

Balance / DisplayBalance

Deposit / MakeDeposit

Balance / DisplayBalance

Logout

Withdraw / MakeWithdraw

Lock

Suspend

Balance / DisplayBalance

Logout

Deposit / MakeDeposit

Withdraw / NoFundsMsg

IncorrectUnlock / IncorrectUnlockMsg

IncorrectLock / IncorrectLockMsg

Logout

IncorrectLogin / IncorrectIdMsg

NoFunds / NoFundsMsg

Unlock

Lock

Page 8: ProjectReport - Maurya,Shailesh

2.5 Pseudo-code of all operations of Input Processors of ACCOUNT-1 and ACCOUNT-2

Operations of the Input Processor (ACCOUNT-1):

open (string p, string y, float a) {

// store p, y and a in temp data store

ds->temp_p=p;

ds->temp_y=y;

ds->temp_a=a;

m->Open();

}

pin (string x) {

if (x==ds->pin) {

if (d->balance > 500)

m->CorrectPinAboveMin ();

else m->CorrectPinBelowMin();

}

else m->IncorrectPin(3)

}

deposit (float d) {

ds->temp_d=d;

m->Deposit();

if (ds->balance>500)

m->AboveMinBalance();

else m->BelowMinBalance();

}

withdraw (float w) {

ds->temp_w=w;

m->withdraw();

if ((ds->balance>500)

m->AboveMinBalance();

Page 9: ProjectReport - Maurya,Shailesh

else m->WithdrawBelowMinBalance();

}

balance() {m->Balance();}

login (string y) {

if (y==ds->uid)

m->Login();

else m->IncorrectLogin();

}

logout() {m->Logout();}

lock (string x) {

if (ds->pin==x) m->Lock();

else m->IncorrectLock();

}

unlock (string x) {

if (x==ds->pin) {

m->Unlock();

if (ds->balance > 500)

m->AboveMinBalance ();

else m->BelowMinBalance();

}

else m->IncorrectUnlock();

}

Note:

m: is a pointer to the MDA-EFSM object

ds: is a pointer to the Data Store object which contains the following data items:

• balance: contains the current balance

• pin: contains the correct pin #

• uid: contains the correct user ID

• temp_p, temp_y, temp_a, temp_d, temp_w are used to store values of parameters

Page 10: ProjectReport - Maurya,Shailesh

Operations of the Input Processor (ACCOUNT-2):

OPEN (int p, int y, int a) {

// store p, y and a in temp data store

ds->temp_p=p;

ds->temp_y=y;

ds->temp_a=a;

m->Open();

}

PIN (int x) {

if (x==ds->pin)

m->CorrectPinAboveMin ();

else m->IncorrectPin(3)

}

DEPOSIT (int d) {

ds->temp_d=d;

m->Deposit();

}

WITHDRAW (int w) {

ds->temp_w=w;

if (ds->balance>0)

m->Withdraw();

else m->NoFunds();

}

BALANCE() {m->Balance();}

LOGIN (int y) {

if (y==ds->uid)

m->Login();

else m->IncorrectLogin();

}

Page 11: ProjectReport - Maurya,Shailesh

LOGOUT() {m->Logout();}

suspend () {m->Suspend();}

activate () {m->Activate();}

close () {m->Close();}

Note:

m: is a pointer to the MDA-EFSM object

ds: is a pointer to the Data Store object which contains the following data items:

• balance: contains the current balance

• pin: contains the correct pin #

• uid: contains the correct user ID

• temp_p, temp_y, temp_a, temp_d, temp_w are used to store values of parameters

3. Class diagrams of the MDA of the Account components Following are the six cumulative class diagrams:

a. High level class diagram

Page 12: ProjectReport - Maurya,Shailesh

b. This class diagram models state pattern. It represents the associations of – MDA_EFSM and State,

DataStore, ATM1 and ATM2.

Page 13: ProjectReport - Maurya,Shailesh

c. This class diagram models the abstract and strategy pattern. It represents the association of – Abstract

and ConcreteFactory classes, Strategy classes (StoreData, IncorrectIdMsg, IncorrectPinMsg and

TooManyAttemptsMsg) and Output.

Page 14: ProjectReport - Maurya,Shailesh

d. This class diagram models the abstract and strategy pattern. It represents the association of –

Abstract and ConcreteFactory classes, Strategy classes (DisplayMenu, MakeDeposit, DisplayBalance and

PromptForPin) and Output.

Page 15: ProjectReport - Maurya,Shailesh

e. This class diagram models the abstract and strategy pattern. It represents the association of –

Abstract and ConcreteFactory classes, Strategy classes (MakeWithdraw, Penalty and NoFunfsMsg) and

Output.

Page 16: ProjectReport - Maurya,Shailesh

f. This class diagram models the abstract and strategy pattern. It represents the association of – Abstract

and ConcreteFactory classes, Strategy classes (IncorrectLockMsg and IncorrectUnlockMsg) and Output.

Page 17: ProjectReport - Maurya,Shailesh

4. Purpose and main attributes of class a. MDA_EFSM class

This class is responsible for change of states. It has various functions that will result in change of state.

These states then perform actions. It captures platform independent behavior and manages state

machine for State pattern.

Attributes:

State s // pointer to current state

public int attempts;

AbstractFactory af =null; //initialize abstract fact

Output output = null; //initialize output

b. State class

This is an interface class which implements different state classes responsible for performing actions.

These state classes are:

b1. StartState class – contains Open() action.

b2. IdleState class – contains Login() and IncorrectLogin() actions.

b3. CheckPinState class – contains IncorrectPin(), CorrectPinAboveMin(), CorrectPinBelowMin()

and Logout() actions.

b4. ReadyState class – contains IncorrectLock(), Deposit(), Balance(), Withdraw(), NoFunds(),

Suspend() and Logout() actions.

b5. OverdrawnState class – contains Deposit(), Balance(), Withdraw(), Lock() and Logout()

actions.

b6. LockedState class – contains Unlock() and IncorrectUnlock() actions.

b7. S1State class – contains AboveMinBalance(), BelowMinBalance() and

WithdrawBelowMinBalance() actions.

b8. SuspendedState class – contains Balance(), Close() and Activate() actions.

c. DataStore class

It is an abstract class for ATM1_DataStore and ATM2_DataStore classes. They contain all the functions

responsible for storing as well as retrieving temporary and permanent values from the data store.

Attributes:

/* Temporary Storage Variables */

float tmpBalance

String tmpPin

Page 18: ProjectReport - Maurya,Shailesh

String tmpID

float tmpDeposit

float tmpWithdraw

/* Permanent Storage Variables */

float balance

String pin

String id

float deposit

float withdraw

d. ATM1 class

This class is instantiated when user selects ATM1 from the menu listed by Driver. It consists of all the

processing done by ACCOUNT-1 component.

Attributes:

MDAEFSM *mdaefsm //pointer to MDA_EFSM

DataStore *ds //pointer to data store

e. ATM2 class

This class is instantiated when user selects ATM2 from the menu listed by Driver. It consists of all the

processing done by ACCOUNT-2 component.

Attributes:

MDAEFSM *mdaefsm //pointer to MDA_EFSM

DataStore *ds //pointer to data store

f. AbstractFactory class

This is an abstract class for ATM1_ConcreteFactory and ATM2_ConcreteFactory classes. They are

responsible for creating objects of the data stores and actions associated with ATM1 and ATM2.

g. Output class

This class is responsible for handling all the actions.

Attributes:

AbstractFactory *af //pointer to abstract factory

DataStore *ds //pointer to data store

Page 19: ProjectReport - Maurya,Shailesh

5. Dynamics

5.1 Senario-1

How the deposit is made in the ACCOUNT-1 component, i.e., the following sequence of operations is

issued: open(abc,xyz,100.5), login(xyz), pin(abc), deposit(400), balance(), logout() :

Page 20: ProjectReport - Maurya,Shailesh
Page 21: ProjectReport - Maurya,Shailesh
Page 22: ProjectReport - Maurya,Shailesh

5.2 Senario-2

How an incorrect pin is entered three times in the ACCOUNT-2 component, i.e., the following sequence

of operations is issued: OPEN(123,111,1000), LOGIN(111), PIN(112), PIN(222), PIN(333) :

Page 23: ProjectReport - Maurya,Shailesh
Page 24: ProjectReport - Maurya,Shailesh

6. Source code and patterns a. Driver.java:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import MDA_EFSM.MDAEFSM;

import Output.Output;

import ATM_Machine.ATM1;

import ATM_Machine.ATM2;

import AbstractFactory.ATM1_ConcreteFactory;

import AbstractFactory.ATM2_ConcreteFactory;

/*

* CLASS : Driver ( This is Main function Program)

*/

public class Driver

{

public static void main( String[] args) throws IOException

{

BufferedReader bufferedReader = new BufferedReader(new

InputStreamReader(System.in));

String input = null;

int choice = 1;

System.out.println("!!Welcome!!" );

System.out.println("Enter '1' for ATM Machine - 1" );

System.out.println("Enter '2' for ATM Machine - 2" );

input = bufferedReader.readLine();

if(input.equalsIgnoreCase("1"))

{

ATM1_ConcreteFactory factory = new ATM1_ConcreteFactory();

Output output = new Output(factory,factory.GetDataStore());

MDAEFSM mdaefsm = new MDAEFSM(factory,output);

ATM1 atm = new ATM1(mdaefsm,factory.GetDataStore());

float balance,deposit,withdraw;

String pin, id;

System.out.println("*************************************");

System.out.println(" ATM Machine-1" );

System.out.println(" MENU of Operations" );

System.out.println(" 1. open(String, String, float)" );

System.out.println(" 2. login(String)" );

System.out.println(" 3. pin(String)" );

System.out.println(" 4. deposit(float)" );

System.out.println(" 5. withdraw(float)" );

Page 25: ProjectReport - Maurya,Shailesh

System.out.println(" 6. balance()" );

System.out.println(" 7. lock(pin)" );

System.out.println(" 8. unlock(pin)" );

System.out.println(" 9. logout()" );

while (true)

{

System.out.println(" Select Operation: ");

System.out.println("1-open,2-login,3-pin,4-deposit,5-withdraw,6-

balance,7-lock,8-unlock,9-logout");

input = bufferedReader.readLine();

if(input.isEmpty()) continue;

choice = Integer.parseInt(input);

switch(choice)

{

case 1: //open

System.out.println("\n Operation:- open(String

pin, String id, float balance)");

System.out.println(" Enter value of the parameter

pin:");

pin = bufferedReader.readLine();

System.out.println(" Enter value of the parameter

id:");

id = bufferedReader.readLine();

System.out.println(" Enter value of the parameter

balance:");

input = bufferedReader.readLine();

balance = Float.parseFloat(input);

atm.open(pin, id, balance);

break;

case 2: //login

System.out.println(" Operation:- login(String

y)");

System.out.println(" Enter value of id:");

id = bufferedReader.readLine();

atm.login(id);

break;

case 3: //pin

System.out.println(" Operation:- pin(String x)");

System.out.println(" Enter value of pin:");

pin = bufferedReader.readLine();

atm.pin(pin);

break;

Page 26: ProjectReport - Maurya,Shailesh

case 4: //deposit

System.out.println(" Operation:- deposit(float

d)");

System.out.println(" Enter value of the parameter

Deposit:");

input = bufferedReader.readLine();

deposit = Float.parseFloat(input);

atm.deposit(deposit);

break;

case 5: // withdraw

System.out.println(" Operation:- withdraw(float

w)");

System.out.println(" Enter value of the parameter

Withdraw:");

input = bufferedReader.readLine();

withdraw = Float.parseFloat(input);

atm.withdraw(withdraw);

break;

case 6: // balance

System.out.println(" Operation:- balance()");

atm.balance();

break;

case 7: // lock

System.out.println(" Operation:- lock(String

pin)");

System.out.println(" Enter value of the parameter

pin:");

pin = bufferedReader.readLine();

atm.lock(pin);

break;

case 8: // unlock

System.out.println(" Operation:- unlock(String

pin)");

System.out.println(" Enter value of the parameter

pin:");

pin = bufferedReader.readLine();

atm.unlock(pin);

break;

case 9: // logout

System.out.println(" Operation:- logout()");

atm.logout();

break;

default:

System.out.println("Invalid Choice, please select

from menu");

break;

}

}

Page 27: ProjectReport - Maurya,Shailesh

}

else if(input.equalsIgnoreCase("2"))

{

ATM2_ConcreteFactory factory = new ATM2_ConcreteFactory();

Output output = new Output(factory,factory.GetDataStore());

MDAEFSM mdaefsm = new MDAEFSM(factory,output);

ATM2 atm = new ATM2(mdaefsm,factory.GetDataStore());

System.out.println("ATM Machine-2" );

int balance,deposit,withdraw,pin,id;

System.out.println("*************************************");

System.out.println(" ATM Machine-2" );

System.out.println(" MENU of Operations" );

System.out.println(" 1. OPEN(int,int,int)" );

System.out.println(" 2. LOGIN(int)" );

System.out.println(" 3. PIN(int)" );

System.out.println(" 4. DEPOSIT(int)" );

System.out.println(" 5. WITHDRAW(int)" );

System.out.println(" 6. BALANCE()" );

System.out.println(" 7. suspend()" );

System.out.println(" 8. activate()" );

System.out.println(" 9. LOGOUT()" );

System.out.println(" 10. close()" );

while (true) {

System.out.println(" Select Operation: ");

System.out.println("1-OPEN,2-LOGIN,3-PIN,4-DEPOSIT,5-WITHDRAW,6-

BALANCE,7-suspend,8-activate,9-LOGOUT,10-close");

input = bufferedReader.readLine();

if(input.isEmpty()) continue;

choice = Integer.parseInt(input);

switch(choice)

{

case 1: //OPEN

System.out.println("\n Operation:- OPEN(int pin, int id,

int balance)");

System.out.println(" Enter value of the parameter

pin:");

input = bufferedReader.readLine();

pin = Integer.parseInt(input);

System.out.println(" Enter value of the parameter id:");

input = bufferedReader.readLine();

id = Integer.parseInt(input);

Page 28: ProjectReport - Maurya,Shailesh

System.out.println(" Enter value of the parameter

balance:");

input = bufferedReader.readLine();

balance = Integer.parseInt(input);

atm.OPEN(pin, id, balance);

break;

case 2: //LOGIN

System.out.println(" Operation:- LOGIN(int x)");

System.out.println(" Enter value of LOGIN:");

input = bufferedReader.readLine();

id = Integer.parseInt(input);

atm.LOGIN(id);

break;

case 3: //PIN

System.out.println(" Operation:- PIN(int x)");

System.out.println(" Enter value of pin:");

input = bufferedReader.readLine();

pin = Integer.parseInt(input);

atm.PIN(pin);

break;

case 4: //DEPOSIT

System.out.println(" Operation:- DEPOSIT(int d)");

System.out.println(" Enter value of the parameter

Deposit:");

input = bufferedReader.readLine();

deposit = Integer.parseInt(input);

atm.DEPOSIT(deposit);

break;

case 5: // WITHDRAW

System.out.println(" Operation:- WITHDRAW(int

w)");

System.out.println(" Enter value of the parameter

Withdraw:");

input = bufferedReader.readLine();

withdraw = Integer.parseInt(input);

atm.WITHDRAW(withdraw);

break;

case 6: // BALANCE

System.out.println(" Operation:- BALANCE()");

atm.BALANCE();

break;

case 7: // suspend

System.out.println(" Operation:- suspend()");

atm.suspend();

break;

case 8: // activate

Page 29: ProjectReport - Maurya,Shailesh

System.out.println(" Operation:- activate()");

atm.activate();

break;

case 9: // LOGOUT

System.out.println(" Operation:- LOGOUT()");

atm.LOGOUT();

break;

case 10: // close

System.out.println(" Operation:- close()");

atm.close();

break;

default:

System.out.println("Invalid Choice, please select

from menu");

break;

}

}

}

}

}

b. AbstractFactory.java :

package AbstractFactory;

import DataStore.*;

import Strategy.*;

/*

* INTERFACE:- Abstract Factory pattern starts here

*/

public interface AbstractFactory

{

public DataStore createDataStore();

public DisplayBalance createDisplayBalance();

public DisplayMenu createDisplayMenu();

public IncorrectIdMsg createIncorrectIdMsg();

public IncorrectLockMsg createIncorrectLockMsg();

public IncorrectPinMsg createIncorrectPinMsg();

public IncorrectUnlockMsg createIncorrectUnlockMsg();

public MakeDeposit createMakeDeposit();

public MakeWithdraw createMakeWithdraw();

public NoFundsMsg createNoFundsMsg();

public Penalty createPenalty();

public PromptForPin createPromptForPin();

public StoreData createStoreData();

public TooManyAttemptsMsg createTooManyAttemptsMsg();

}

Page 30: ProjectReport - Maurya,Shailesh

b1. ATM2_ConcreteFactory.java :

package AbstractFactory;

import DataStore.DataStore;

import DataStore.ATM2_DataStore;

import Strategy.*;

public class ATM2_ConcreteFactory implements AbstractFactory

{

DataStore ds = new ATM2_DataStore();

DisplayBalance displayBalance = new ATM2_DisplayBalance();

DisplayMenu displayMenu = new ATM2_DisplayMenu();

IncorrectIdMsg incorrectIdMsg = new ATM2_IncorrectIdMsg();

IncorrectLockMsg incorrectLockMsg = new ATM2_IncorrectLockMsg();

IncorrectPinMsg incorrectPinMsg = new ATM2_IncorrectPinMsg();

IncorrectUnlockMsg incorrectUnlockMsg = new ATM2_IncorrectUnlockMsg();

MakeDeposit makeDeposit = new ATM2_MakeDeposit();

MakeWithdraw makeWithdraw = new ATM2_MakeWithdraw();

NoFundsMsg noFundsMsg = new ATM2_NoFundsMsg();

Penalty penalty = new ATM2_Penalty();

PromptForPin promptForPin = new ATM2_PromptForPin();

StoreData storeData = new ATM2_StoreData();

TooManyAttemptsMsg tooManyAttemptsMsg = new ATM2_TooManyAttemptsMsg();

public void ConcreteFactory()

{

}

public DataStore createDataStore()

{

return(this.ds);

}

public DataStore GetDataStore()

{

return this.ds;

}

public DisplayBalance createDisplayBalance()

{

return this.displayBalance;

}

public DisplayMenu createDisplayMenu()

{

return this.displayMenu;

}

public IncorrectIdMsg createIncorrectIdMsg()

{

return this.incorrectIdMsg;

}

Page 31: ProjectReport - Maurya,Shailesh

public IncorrectLockMsg createIncorrectLockMsg()

{

return this.incorrectLockMsg;

}

public IncorrectPinMsg createIncorrectPinMsg()

{

return this.incorrectPinMsg;

}

public IncorrectUnlockMsg createIncorrectUnlockMsg()

{

return this.incorrectUnlockMsg;

}

public MakeDeposit createMakeDeposit()

{

return this.makeDeposit;

}

public MakeWithdraw createMakeWithdraw()

{

return this.makeWithdraw;

}

public NoFundsMsg createNoFundsMsg()

{

return this.noFundsMsg;

}

public Penalty createPenalty()

{

return this.penalty;

}

public PromptForPin createPromptForPin()

{

return this.promptForPin;

}

public StoreData createStoreData()

{

return this.storeData;

}

public TooManyAttemptsMsg createTooManyAttemptsMsg()

{

return this.tooManyAttemptsMsg;

}

}

Page 32: ProjectReport - Maurya,Shailesh

b2. ATM1_ConcreteFactory.java :

package AbstractFactory;

import DataStore.DataStore;

import DataStore.ATM1_DataStore;

import Strategy.*;

public class ATM1_ConcreteFactory implements AbstractFactory

{

DataStore ds = new ATM1_DataStore();

DisplayBalance displayBalance = new ATM1_DisplayBalance();

DisplayMenu displayMenu = new ATM1_DisplayMenu();

IncorrectIdMsg incorrectIdMsg = new ATM1_IncorrectIdMsg();

IncorrectLockMsg incorrectLockMsg = new ATM1_IncorrectLockMsg();

IncorrectPinMsg incorrectPinMsg = new ATM1_IncorrectPinMsg();

IncorrectUnlockMsg incorrectUnlockMsg = new ATM1_IncorrectUnlockMsg();

MakeDeposit makeDeposit = new ATM1_MakeDeposit();

MakeWithdraw makeWithdraw = new ATM1_MakeWithdraw();

NoFundsMsg noFundsMsg = new ATM1_NoFundsMsg();

Penalty penalty = new ATM1_Penalty();

PromptForPin promptForPin = new ATM1_PromptForPin();

StoreData storeData = new ATM1_StoreData();

TooManyAttemptsMsg tooManyAttemptsMsg = new ATM1_TooManyAttemptsMsg();

public void ConcreteFactory()

{

}

public DataStore createDataStore()

{

return(this.ds);

}

public DataStore GetDataStore()

{

return this.ds;

}

public DisplayBalance createDisplayBalance()

{

return this.displayBalance;

}

public DisplayMenu createDisplayMenu()

{

return this.displayMenu;

}

public IncorrectIdMsg createIncorrectIdMsg()

{

Page 33: ProjectReport - Maurya,Shailesh

return this.incorrectIdMsg;

}

public IncorrectLockMsg createIncorrectLockMsg()

{

return this.incorrectLockMsg;

}

public IncorrectPinMsg createIncorrectPinMsg()

{

return this.incorrectPinMsg;

}

public IncorrectUnlockMsg createIncorrectUnlockMsg()

{

return this.incorrectUnlockMsg;

}

public MakeDeposit createMakeDeposit()

{

return this.makeDeposit;

}

public MakeWithdraw createMakeWithdraw()

{

return this.makeWithdraw;

}

public NoFundsMsg createNoFundsMsg()

{

return this.noFundsMsg;

}

public Penalty createPenalty()

{

return this.penalty;

}

public PromptForPin createPromptForPin()

{

return this.promptForPin;

}

public StoreData createStoreData()

{

return this.storeData;

}

public TooManyAttemptsMsg createTooManyAttemptsMsg()

{

return this.tooManyAttemptsMsg;

}

}

Page 34: ProjectReport - Maurya,Shailesh

c. ATM1.java :

package ATM_Machine;

import MDA_EFSM.MDAEFSM;

import DataStore.DataStore;

import DataStore.ATM1_DataStore;

/*

* CLASS : ATM1 class is for fetching parameters from

* UI through Driver.java and invoking corresponding

* event in MDA-EFSM

*/

public class ATM1

{

/* Pointer to MDA-EFSM */

MDAEFSM mdaefsm = null;

/* Pointer to DataStore */

DataStore ds = null;

public ATM1(MDAEFSM mdaefsm,DataStore ds)

{

this.mdaefsm = mdaefsm;

this.ds = ds;

}

public void open(String p, String y, float a)

{

if (a>0) {

((ATM1_DataStore)ds).tmpPin = p;

((ATM1_DataStore)ds).tmpBalance = a;

((ATM1_DataStore)ds).tmpID = y;

mdaefsm.Open();

}

else

{

System.out.println("Invalid input");

}

}

public void pin(String x)

{

if(x.equals(((ATM1_DataStore)ds).tmpPin))

{

if(((ATM1_DataStore)ds).tmpBalance > 500)

mdaefsm.CorrectPinAboveMin();

else

mdaefsm.CorrectPinBelowMin();

}

else

{

mdaefsm.IncorrectPin(3);

}

}

Page 35: ProjectReport - Maurya,Shailesh

public void deposit(float d)

{

if(d > 0)

{

((ATM1_DataStore)ds).tmpDeposit = d;

mdaefsm.Deposit();

if(((ATM1_DataStore)ds).tmpBalance > 500)

{

mdaefsm.AboveMinBalance();

}

else

{

mdaefsm.BelowMinBalance();

}

}

else

{

System.out.println("Invalid Input");

}

}

public void withdraw(float w)

{

if(w>0)

{

((ATM1_DataStore)ds).tmpWithdraw = w;

mdaefsm.Withdraw();

if(((ATM1_DataStore)ds).tmpBalance > 500 )

{

mdaefsm.AboveMinBalance();

}

else

{

mdaefsm.WithdrawBelowMinBalance();

}

}

else

{

System.out.println("Invalid Input");

}

}

public void balance()

{

mdaefsm.Balance();

}

Page 36: ProjectReport - Maurya,Shailesh

public void login(String y){

if(y.equals(((ATM1_DataStore)ds).tmpID))

mdaefsm.Login();

else

mdaefsm.IncorrectLogin();

}

public void lock(String x)

{

if(x.equals(((ATM1_DataStore)ds).tmpPin))

mdaefsm.Lock();

else

mdaefsm.IncorrectLock();

}

public void unlock(String x)

{

if(x.equals(((ATM1_DataStore)ds).tmpPin))

{

mdaefsm.Unlock();

if(((ATM1_DataStore)ds).balance > 500 )

{

mdaefsm.AboveMinBalance();

}

else

{

mdaefsm.BelowMinBalance();

}

}

else

mdaefsm.IncorrectUnlock();

}

public void logout()

{

mdaefsm.Logout();

}

}

d. ATM2.java :

package ATM_Machine;

import MDA_EFSM.MDAEFSM;

import DataStore.DataStore;

import DataStore.ATM2_DataStore;

/*

* CLASS : ATM2 Machine Implementation for collecting parameters

* from the UI through Driver.java and invoking right event in MDA-EFSm

*/

Page 37: ProjectReport - Maurya,Shailesh

public class ATM2

{

/* Pointer to MDA-EFSM */

MDAEFSM mdaefsm = null;

/* Pointer to DataStore */

DataStore ds = null;

public ATM2(MDAEFSM mdaefsm,DataStore ds)

{

this.mdaefsm = mdaefsm;

this.ds = ds;

}

public void OPEN(int p, int y, int a)

{

if (a>0) {

((ATM2_DataStore)ds).tmpPin = p;

((ATM2_DataStore)ds).tmpBalance = a;

((ATM2_DataStore)ds).tmpID = y;

mdaefsm.Open();

}

else

{

System.out.println("Invalid input");

}

}

public void PIN(int x)

{

if(x == ((ATM2_DataStore)ds).tmpPin)

{

mdaefsm.CorrectPinAboveMin();

}

else

{

mdaefsm.IncorrectPin(2);

}

}

public void DEPOSIT(int d)

{

if (d>0) {

((ATM2_DataStore)ds).tmpDeposit = d;

mdaefsm.Deposit();

}

else

{

System.out.println("Invalid input");

}

}

public void WITHDRAW(int w)

{

if (w>0) {

Page 38: ProjectReport - Maurya,Shailesh

((ATM2_DataStore)ds).tmpWithdraw = w;

if( ((ATM2_DataStore)ds).tmpBalance > 0)

{

mdaefsm.Withdraw();

mdaefsm.AboveMinBalance();

}

else

{

mdaefsm.NoFunds();

}

}

else

{

System.out.println("Invalid input");

}

}

public void BALANCE()

{

mdaefsm.Balance();

}

public void LOGIN(int y){

if(y == (((ATM2_DataStore)ds).tmpID))

mdaefsm.Login();

else

mdaefsm.IncorrectLogin();

}

public void LOGOUT()

{

mdaefsm.Logout();

}

public void suspend()

{

mdaefsm.Suspend();

}

public void activate()

{

mdaefsm.Activate();

}

public void close()

{

mdaefsm.Close();

}

}

e. DataStore.java :

package DataStore;

public abstract class DataStore{}

Page 39: ProjectReport - Maurya,Shailesh

e1. ATM2_DataStore.java :

package DataStore;

public class ATM2_DataStore extends DataStore

{

/* Temporary Storage Variables */

public int tmpBalance;

public int tmpPin;

public int tmpID;

public int tmpDeposit;

public int tmpWithdraw;

/* Permanent Storage Variables */

public int balance;

public int pin;

public int id;

public int deposit;

public int withdraw;

public int getBalance()

{

return this.balance;

}

public int getPin()

{

return this.pin;

}

public int getId()

{

return this.id;

}

public int setBalance()

{

return this.balance = this.tmpBalance;

}

public int setPin()

{

return this.pin = this.tmpPin;

}

public int setId()

{

return this.id = this.tmpID;

}

public void calBalanceDeposit()

{

this.balance = this.balance + this.deposit;

Page 40: ProjectReport - Maurya,Shailesh

this.tmpBalance = this.balance;

}

public void calBalanceWithdraw()

{

this.balance = this.balance - this.withdraw;

this.tmpBalance = this.balance;

}

public void setDeposit()

{

this.deposit = this.tmpDeposit;

}

public void setWithdraw()

{

this.withdraw = this.tmpWithdraw;

}

public int getDeposit()

{

return this.deposit;

}

public int getWithdraw()

{

return this.withdraw;

}

}

e2. ATM1_DataStore.java :

package DataStore;

public class ATM1_DataStore extends DataStore

{

/* Temporary Storage Variables */

public float tmpBalance;

public String tmpPin;

public String tmpID;

public float tmpDeposit;

public float tmpWithdraw;

/* Permanent Storage Variables */

public float balance;

public String pin;

public String id;

public float deposit;

public float withdraw;

public float getBalance()

{

return this.balance;

}

public String getPin()

{

Page 41: ProjectReport - Maurya,Shailesh

return this.pin;

}

public String getId()

{

return this.id;

}

public float setBalance()

{

return this.balance = this.tmpBalance;

}

public String setPin()

{

return this.pin = this.tmpPin;

}

public String setId()

{

return this.id = this.tmpID;

}

public float setPenalty()

{

this.balance = this.balance - 20;

this.tmpBalance = balance;

return this.balance;

}

public void calBalanceDeposit()

{

this.balance = this.balance + this.deposit;

this.tmpBalance = this.balance;

}

public void calBalanceWithdraw()

{

this.balance = this.balance - this.withdraw;

this.tmpBalance = this.balance;

}

public void setDeposit()

{

this.deposit = this.tmpDeposit;

}

public void setWithdraw()

{

this.withdraw = this.tmpWithdraw;

}

public float getDeposit()

{

return this.deposit;

}

public float getWithdraw()

{

Page 42: ProjectReport - Maurya,Shailesh

return this.withdraw;

} }

f. MDAEFSM.java :

package MDA_EFSM;

import AbstractFactory.AbstractFactory;

import Output.Output;

/*

* CLASS : MDAEFSM ( State Pattern starts here)

*/

public class MDAEFSM {

State checkpinState = new CheckPinState(this);

State idleState = new IdleState(this);

State lockedState = new LockedState(this);

State overdrawnState = new OverdrawnState(this);

State readyState = new ReadyState(this);

State s1State = new S1State(this);

State startState = new StartState(this);

State suspendedState = new SuspendedState(this);

State s = null;

public int attempts;

AbstractFactory af =null;

Output output = null;

public MDAEFSM(AbstractFactory af,Output output) {

s = startState;

attempts = 0;

this.af = af;

this.output = output;

}

public void Open()

{

s.Open();

printCurrentState();

}

public void Login()

{

s.Login();

attempts = 0;

printCurrentState();

}

Page 43: ProjectReport - Maurya,Shailesh

public void IncorrectLogin()

{

s.IncorrectLogin();

printCurrentState();

}

public void IncorrectPin(int max)

{

s.IncorrectPin(max);

printCurrentState();

}

public void CorrectPinBelowMin()

{

s.CorrectPinBelowMin();

printCurrentState();

}

public void CorrectPinAboveMin()

{

s.CorrectPinAboveMin();

printCurrentState();

}

public void Deposit()

{

s.Deposit();

printCurrentState();

}

public void BelowMinBalance()

{

s.BelowMinBalance();

printCurrentState();

}

public void AboveMinBalance()

{

s.AboveMinBalance();

printCurrentState();

}

public void Logout()

{

s.Logout();

printCurrentState();

}

public void Balance()

{

s.Balance();

printCurrentState();

}

public void Withdraw()

Page 44: ProjectReport - Maurya,Shailesh

{

s.Withdraw();

printCurrentState();

}

public void WithdrawBelowMinBalance()

{

s.WithdrawBelowMinBalance();

printCurrentState();

}

public void NoFunds()

{

s.NoFunds();

printCurrentState();

}

public void Lock()

{

s.Lock();

printCurrentState();

}

public void IncorrectLock()

{

s.IncorrectLock();

printCurrentState();

}

public void Unlock()

{

s.Unlock();

printCurrentState();

}

public void IncorrectUnlock()

{

s.IncorrectUnlock();

printCurrentState();

}

public void Suspend()

{

s.Suspend();

printCurrentState();

}

public void Activate()

{

s.Activate();

printCurrentState();

}

public void Close()

{

Page 45: ProjectReport - Maurya,Shailesh

s.Close();

printCurrentState();

}

public void setState(State s)

{

this.s = s;

}

public State getMachineState() {

return s;

}

public State getCheckPinState() {

return checkpinState;

}

public State getSuspendedState() {

return suspendedState;

}

public State getIdleState() {

return idleState;

}

public State getStartState() {

return startState;

}

public State getLockedState() {

return lockedState;

}

public State getOverdrawnState() {

return overdrawnState;

}

public State getReadyState() {

return readyState;

}

public State getS1State() {

return s1State;

}

public void printCurrentState(){

System.out.println("--> Current State : "+ s.getClass().getName());

}

}

g. State.java :

package MDA_EFSM;

Page 46: ProjectReport - Maurya,Shailesh

public interface State

{

public void Open();

public void Login();

public void IncorrectLogin();

public void IncorrectPin(int max);

public void CorrectPinBelowMin();

public void CorrectPinAboveMin();

public void Deposit();

public void BelowMinBalance();

public void AboveMinBalance();

public void Logout();

public void Balance();

public void Withdraw();

public void WithdrawBelowMinBalance();

public void NoFunds();

public void Lock();

public void IncorrectLock();

public void Unlock();

public void IncorrectUnlock();

public void Suspend();

public void Activate();

public void Close();

}

g1. OverdrawnState.java :

package MDA_EFSM;

public class OverdrawnState implements State

{

MDAEFSM mdaefsm =null;

public OverdrawnState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

Page 47: ProjectReport - Maurya,Shailesh

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

mdaefsm.output.MakeDeposit();

mdaefsm.setState(mdaefsm.getS1State());

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

mdaefsm.setState(mdaefsm.getIdleState());

}

public void Balance()

{

mdaefsm.output.DisplayBalance();

}

public void Withdraw()

{

mdaefsm.output.NoFundsMsg();

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

Page 48: ProjectReport - Maurya,Shailesh

public void Lock()

{

mdaefsm.setState(mdaefsm.getLockedState());

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

public void Suspend()

{

}

public void Activate()

{

}

public void Close()

{

}

}

g2. CheckPinState.java :

package MDA_EFSM;

public class CheckPinState implements State

{

MDAEFSM mdaefsm =null;

public CheckPinState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

Page 49: ProjectReport - Maurya,Shailesh

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

{

if( mdaefsm.attempts < max )

{

mdaefsm.attempts++;

mdaefsm.output.IncorrectPinMsg();

}

else if( mdaefsm.attempts == max )

{

mdaefsm.output.IncorrectPinMsg();

mdaefsm.output.TooManyAttemptsMsg();

mdaefsm.setState(mdaefsm.getIdleState());

}

}

public void CorrectPinBelowMin()

{

mdaefsm.output.DisplayMenu();

mdaefsm.setState(mdaefsm.getOverdrawnState());

}

public void CorrectPinAboveMin()

{

mdaefsm.output.DisplayMenu();

mdaefsm.setState(mdaefsm.getReadyState());

}

public void Deposit()

{

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

Page 50: ProjectReport - Maurya,Shailesh

mdaefsm.setState(mdaefsm.getIdleState());

}

public void Balance()

{

}

public void Withdraw()

{

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

public void Suspend()

{

}

public void Activate()

{

}

public void Close()

{

Page 51: ProjectReport - Maurya,Shailesh

}

}

g3. IdleState.java :

package MDA_EFSM;

public class IdleState implements State

{

MDAEFSM mdaefsm =null;

public IdleState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

public void Login()

{

mdaefsm.attempts = 0;

mdaefsm.output.PromptForPin();

mdaefsm.setState(mdaefsm.getCheckPinState());

}

public void IncorrectLogin()

{

mdaefsm.output.IncorrectIdMsg();

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

}

Page 52: ProjectReport - Maurya,Shailesh

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

}

public void Balance()

{

}

public void Withdraw()

{

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

Page 53: ProjectReport - Maurya,Shailesh

public void Suspend()

{

}

public void Activate()

{

}

public void Close()

{

}

}

g4. LockedState.java :

package MDA_EFSM;

public class LockedState implements State

{

MDAEFSM mdaefsm =null;

public LockedState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

Page 54: ProjectReport - Maurya,Shailesh

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

}

public void Balance()

{

}

public void Withdraw()

{

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

Page 55: ProjectReport - Maurya,Shailesh

}

public void Unlock()

{

mdaefsm.setState(mdaefsm.getS1State());

}

public void IncorrectUnlock()

{

mdaefsm.output.IncorrectUnlockMsg();

}

public void Suspend()

{

}

public void Activate()

{

}

public void Close()

{

}

}

g5. ReadyState.java :

package MDA_EFSM;

public class ReadyState implements State

{

MDAEFSM mdaefsm =null;

public ReadyState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

public void Login()

{

}

public void IncorrectLogin()

{

Page 56: ProjectReport - Maurya,Shailesh

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

mdaefsm.output.MakeDeposit();

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

mdaefsm.setState(mdaefsm.getIdleState());

}

public void Balance()

{

mdaefsm.output.DisplayBalance();

}

public void Withdraw()

{

mdaefsm.output.MakeWithdraw();

mdaefsm.setState(mdaefsm.getS1State());

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

Page 57: ProjectReport - Maurya,Shailesh

mdaefsm.output.NoFundsMsg();

}

public void Lock()

{

mdaefsm.setState(mdaefsm.getLockedState());

}

public void IncorrectLock()

{

mdaefsm.output.IncorrectLockMsg();

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

public void Suspend()

{

mdaefsm.setState(mdaefsm.getSuspendedState());

}

public void Activate()

{

}

public void Close()

{

}

}

g6. S1State.java :

package MDA_EFSM;

public class S1State implements State

{

MDAEFSM mdaefsm =null;

public S1State(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

Page 58: ProjectReport - Maurya,Shailesh

}

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

}

public void BelowMinBalance()

{

mdaefsm.setState(mdaefsm.getOverdrawnState());

}

public void AboveMinBalance()

{

mdaefsm.setState(mdaefsm.getReadyState());

}

public void Logout()

{

}

public void Balance()

{

}

public void Withdraw()

{

Page 59: ProjectReport - Maurya,Shailesh

}

public void WithdrawBelowMinBalance()

{

mdaefsm.output.Penalty();

mdaefsm.setState(mdaefsm.getOverdrawnState());

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

public void Suspend()

{

}

public void Activate()

{

}

public void Close()

{

}

}

g7. StartState.java :

package MDA_EFSM;

Page 60: ProjectReport - Maurya,Shailesh

public class StartState implements State

{

MDAEFSM mdaefsm =null;

public StartState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

mdaefsm.output.StoreData();

mdaefsm.setState(mdaefsm.getIdleState());

}

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

Page 61: ProjectReport - Maurya,Shailesh

public void Logout()

{

}

public void Balance()

{

}

public void Withdraw()

{

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

}

public void Suspend()

{

}

public void Activate()

{

}

Page 62: ProjectReport - Maurya,Shailesh

public void Close()

{

}

}

g8. SuspendedState.java :

package MDA_EFSM;

public class SuspendedState implements State

{

MDAEFSM mdaefsm =null;

public SuspendedState(MDAEFSM mdaefsm)

{

this.mdaefsm = mdaefsm;

}

public void Open()

{

}

public void Login()

{

}

public void IncorrectLogin()

{

}

public void IncorrectPin(int max)

{

}

public void CorrectPinBelowMin()

{

}

public void CorrectPinAboveMin()

{

}

public void Deposit()

{

Page 63: ProjectReport - Maurya,Shailesh

}

public void BelowMinBalance()

{

}

public void AboveMinBalance()

{

}

public void Logout()

{

}

public void Balance()

{

mdaefsm.output.DisplayBalance();

}

public void Withdraw()

{

}

public void WithdrawBelowMinBalance()

{

}

public void NoFunds()

{

}

public void Lock()

{

}

public void IncorrectLock()

{

}

public void Unlock()

{

}

public void IncorrectUnlock()

{

Page 64: ProjectReport - Maurya,Shailesh

}

public void Suspend()

{

}

public void Activate()

{

mdaefsm.setState(mdaefsm.getReadyState());

}

public void Close()

{

mdaefsm.setState(mdaefsm.getStartState());

}

}

h. Output.java :

package Output;

import DataStore.DataStore;

import AbstractFactory.*;

import Strategy.DisplayBalance;

import Strategy.DisplayMenu;

import Strategy.IncorrectIdMsg;

import Strategy.IncorrectLockMsg;

import Strategy.IncorrectPinMsg;

import Strategy.IncorrectUnlockMsg;

import Strategy.MakeDeposit;

import Strategy.MakeWithdraw;

import Strategy.NoFundsMsg;

import Strategy.Penalty;

import Strategy.PromptForPin;

import Strategy.StoreData;

import Strategy.TooManyAttemptsMsg;

/*

* CLASS : Output

*/

public class Output

{

AbstractFactory af =null;

DataStore ds = null;

public Output(AbstractFactory af,DataStore ds)

{

this.af = af;

this.ds = ds;

}

Page 65: ProjectReport - Maurya,Shailesh

public void IncorrectIdMsg()

{

System.out.println("\n OUTPUT --> Action IncorrectIdMsg");

IncorrectIdMsg incorrectID = af.createIncorrectIdMsg();

incorrectID.IncorrectIdMsg();

}

public void IncorrectPinMsg()

{

System.out.println("\n OUTPUT --> Action IncorrectPinMsg");

IncorrectPinMsg incorrectPin = af.createIncorrectPinMsg();

incorrectPin.IncorrectPinMsg();

}

public void IncorrectLockMsg()

{

System.out.println("\n OUTPUT --> Action IncorrectLockMsg");

IncorrectLockMsg incorrectLock = af.createIncorrectLockMsg();

incorrectLock.IncorrectLockMsg();

}

public void IncorrectUnlockMsg()

{

System.out.println("\n OUTPUT --> Action IncorrectUnlockMsg");

IncorrectUnlockMsg incorrectUnlock = af.createIncorrectUnlockMsg();

incorrectUnlock.IncorrectUnlockMsg();

}

public void TooManyAttemptsMsg()

{

System.out.println("\n OUTPUT --> Action TooManyAttemptsMsg");

TooManyAttemptsMsg tooManyAttempts = af.createTooManyAttemptsMsg();

tooManyAttempts.TooManyAttemptsMsg();

}

public void DisplayMenu()

{

System.out.println("\n OUTPUT --> Action DisplayMenu");

DisplayMenu displayMenu = af.createDisplayMenu();

displayMenu.DisplayMenu();

}

public void StoreData()

{

System.out.println("\n OUTPUT --> Action StoreData");

StoreData storeData = af.createStoreData();

storeData.StoreData(ds);

}

public void NoFundsMsg()

{

System.out.println("\n OUTPUT --> Action NoFundsMsg");

NoFundsMsg noFunds = af.createNoFundsMsg();

Page 66: ProjectReport - Maurya,Shailesh

noFunds.NoFundsMsg();

}

public void PromptForPin()

{

System.out.println("\n OUTPUT --> Action PromptForPin ");

PromptForPin promptForPin = af.createPromptForPin();

promptForPin.PromptForPin();

}

public void DisplayBalance()

{

System.out.println("\n OUTPUT --> Action DisplayBalance ");

DisplayBalance displayBalance = af.createDisplayBalance();

displayBalance.DisplayBalance(ds);

}

public void MakeDeposit()

{

System.out.println("\n OUTPUT --> Action MakeDeposit ");

MakeDeposit makeDeposit = af.createMakeDeposit();

makeDeposit.MakeDeposit(ds);

}

public void MakeWithdraw()

{

System.out.println("\n OUTPUT --> Action MakeWithdraw ");

MakeWithdraw makeWithdraw = af.createMakeWithdraw();

makeWithdraw.MakeWithdraw(ds);

}

public void Penalty()

{

System.out.println("\n OUTPUT --> Action Penalty ");

Penalty penalty = af.createPenalty();

penalty.Penalty(ds);

}

}

i. DisplayBalance.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : DisplayBalance (STRAGTEGY PATTERN)

*/

public abstract class DisplayBalance

{

public abstract void DisplayBalance(DataStore ds);

}

Page 67: ProjectReport - Maurya,Shailesh

i1. ATM1_DisplayBalance.java :

package Strategy;

public class ATM1_DisplayMenu extends DisplayMenu

{

public void DisplayMenu()

{

System.out.println("ATM Machine 1 Transaction Menu: ");

System.out.println(" Balance " );

System.out.println(" Deposit " );

System.out.println(" Withdraw " );

}

}

i2. ATM2_DisplayBalance.java :

package Strategy;

import DataStore.*;

public class ATM2_DisplayBalance extends DisplayBalance

{

public void DisplayBalance(DataStore dataStore)

{

System.out.println("ATM Machine 2:: Balance is: " +

((ATM2_DataStore)dataStore).getBalance() );

} }

j. DisplayMenu.java :

package Strategy;

/*

* ABSTRACT CLASS : DisplayMenu (Strategy pattern starts here)

*/

public abstract class DisplayMenu

{

public abstract void DisplayMenu();

}

j1. ATM1_DisplayMenu.java :

package Strategy;

public class ATM1_DisplayMenu extends DisplayMenu

{

public void DisplayMenu()

{

System.out.println("ATM Machine 1 Transaction Menu: ");

System.out.println(" Balance " );

System.out.println(" Deposit " );

Page 68: ProjectReport - Maurya,Shailesh

System.out.println(" Withdraw " );

} }

j2. ATM2_DisplayMenu.java :

package Strategy;

public class ATM2_DisplayMenu extends DisplayMenu

{

public void DisplayMenu()

{

System.out.println("ATM Machine 2 Transaction Menu: ");

System.out.println(" Balance " );

System.out.println(" Deposit " );

System.out.println(" Withdraw " );

}

}

k. IncorrectIdMsg.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : IncorrectIdMsg (STRAGTEGY PATTERN)

*/

public abstract class IncorrectIdMsg

{

public abstract void IncorrectIdMsg();

}

k1. ATM1_IncorrectIdMsg.java :

package Strategy;

public class ATM1_IncorrectIdMsg extends IncorrectIdMsg

{

public void IncorrectIdMsg()

{

System.out.println("ATM Machine 1:: Incorrect Id: ");

}

}

k2. ATM2_IncorrectIdMsg.java : package Strategy;

public class ATM2_IncorrectIdMsg extends IncorrectIdMsg

{

public void IncorrectIdMsg()

{

System.out.println("ATM Machine 2:: Incorrect Id: ");

Page 69: ProjectReport - Maurya,Shailesh

}

}

l. IncorrectLockMsg.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : IncorrectLockMsg (STRAGTEGY PATTERN)

*/

public abstract class IncorrectLockMsg

{

public abstract void IncorrectLockMsg();

}

l1. ATM1_IncorrectLockMsg.java :

package Strategy;

public class ATM1_IncorrectLockMsg extends IncorrectLockMsg

{

public void IncorrectLockMsg()

{

System.out.println("ATM Machine 1:: Incorrect Lock ");

}

}

l2. ATM2_IncorrectLockMsg.java :

package Strategy;

public class ATM2_IncorrectLockMsg extends IncorrectLockMsg

{

public void IncorrectLockMsg()

{

System.out.println("ATM Machine 2:: Incorrect Lock ");

}

}

m. IncorrectPinMsg.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : IncorrectPinMsg (STRAGTEGY PATTERN)

*/

public abstract class IncorrectPinMsg

Page 70: ProjectReport - Maurya,Shailesh

{

public abstract void IncorrectPinMsg();

}

m1. ATM1_IncorrectPinMsg.java :

package Strategy;

public class ATM1_IncorrectPinMsg extends IncorrectPinMsg

{

public void IncorrectPinMsg()

{

System.out.println("ATM Machine 1:: Incorrect Pin: ");

}

}

m2. ATM2_IncorrectPinMsg.java :

package Strategy;

public class ATM2_IncorrectPinMsg extends IncorrectPinMsg

{

public void IncorrectPinMsg()

{

System.out.println("ATM Machine 2:: Incorrect Pin: ");

}

}

n. IncorrectUnlockMsg.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : IncorrectUnlockMsg (STRAGTEGY PATTERN)

*/

public abstract class IncorrectUnlockMsg

{

public abstract void IncorrectUnlockMsg();

}

n1. ATM1_IncorrectUnlockMsg.java :

package Strategy;

public class ATM1_IncorrectUnlockMsg extends IncorrectUnlockMsg

{

public void IncorrectUnlockMsg()

{

System.out.println("ATM Machine 1:: Incorrect Unlock ");

}

}

Page 71: ProjectReport - Maurya,Shailesh

n2. ATM2_IncorrectUnlockMsg.java : package Strategy;

public class ATM2_IncorrectUnlockMsg extends IncorrectUnlockMsg

{

public void IncorrectUnlockMsg()

{

System.out.println("ATM Machine 2:: Incorrect Unlock ");

}

}

o. MakeDeposit.java : package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : MakeDeposit (STRAGTEGY PATTERN)

*/

public abstract class MakeDeposit

{

public abstract void MakeDeposit(DataStore dataStore);

}

o1. ATM1_MakeDeposit.java : package Strategy;

import DataStore.*;

public class ATM1_MakeDeposit extends MakeDeposit

{

public void MakeDeposit(DataStore dataStore)

{

((ATM1_DataStore)dataStore).setDeposit();

((ATM1_DataStore)dataStore).calBalanceDeposit();

System.out.println("ATM Machine 1:: After Deposit, Balance is " +

((ATM1_DataStore)dataStore).getBalance() );

}

}

o2. ATM2_MakeDeposit.java : package Strategy;

import DataStore.*;

public class ATM2_MakeDeposit extends MakeDeposit

{

public void MakeDeposit(DataStore dataStore)

{

((ATM2_DataStore)dataStore).setDeposit();

((ATM2_DataStore)dataStore).calBalanceDeposit();

System.out.println("ATM Machine 2:: After Deposit, Balance is " +

((ATM2_DataStore)dataStore).getBalance() );

Page 72: ProjectReport - Maurya,Shailesh

}

}

p. MakeWithdraw.java : package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : MakeWithdraw (STRAGTEGY PATTERN)

*/

public abstract class MakeWithdraw

{

public abstract void MakeWithdraw(DataStore dataStore);

}

p1. ATM1_MakeWithdraw.java : package Strategy;

import DataStore.*;

public class ATM1_MakeWithdraw extends MakeWithdraw

{

public void MakeWithdraw(DataStore dataStore)

{

((ATM1_DataStore)dataStore).setWithdraw();

((ATM1_DataStore)dataStore).calBalanceWithdraw();

System.out.println("ATM Machine 1:: After Withdraw, Balance is " +

((ATM1_DataStore)dataStore).getBalance() );

}

}

p2. ATM2_MakeWithdraw.java : package Strategy;

import DataStore.*;

public class ATM2_MakeWithdraw extends MakeWithdraw

{

public void MakeWithdraw(DataStore dataStore)

{

((ATM2_DataStore)dataStore).setWithdraw();

((ATM2_DataStore)dataStore).calBalanceWithdraw();

System.out.println("ATM Machine 2:: After Withdraw, Balance is " +

((ATM2_DataStore)dataStore).getBalance() );

}

}

q. NoFundsMsg.java : package Strategy;

/*

* ABSTRACT CLASS : NoFundsMsg (STRAGTEGY PATTERN)

Page 73: ProjectReport - Maurya,Shailesh

*/

public abstract class NoFundsMsg

{

public abstract void NoFundsMsg();

}

q1. ATM1_NoFundsMsg.java : package Strategy;

public class ATM1_NoFundsMsg extends NoFundsMsg

{

public void NoFundsMsg()

{

System.out.println("ATM Machine 1:: No Funds ");

}

}

q2. ATM2_NoFundsMsg.java : package Strategy;

public class ATM2_NoFundsMsg extends NoFundsMsg

{

public void NoFundsMsg()

{

System.out.println("ATM Machine 2:: No Funds ");

}

}

r. Penalty.java : package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : Penalty (STRAGTEGY PATTERN)

*/

public abstract class Penalty

{

public abstract void Penalty(DataStore dataStore);

}

r1. ATM1_Penalty.java : package Strategy;

import DataStore.*;

public class ATM1_Penalty extends Penalty

{

public void Penalty(DataStore dataStore)

{

((ATM1_DataStore)dataStore).setPenalty();

Page 74: ProjectReport - Maurya,Shailesh

System.out.println("ATM Machine 1:: Minimum required balance is $500. So

Penalty is applied.");

System.out.println("ATM Machine 1:: After a Penalty of 20$, Balance is "

+ ((ATM1_DataStore)dataStore).balance );

}

}

r2. ATM2_Penalty.java : package Strategy;

import DataStore.*;

public class ATM2_Penalty extends Penalty

{

public void Penalty(DataStore dataStore)

{

}

}

s. PromptForPin.java :

package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : PromptForPin (STRAGTEGY PATTERN)

*/

public abstract class PromptForPin

{

public abstract void PromptForPin();

}

s1. ATM1_PromptForPin.java : package Strategy;

public class ATM1_PromptForPin extends PromptForPin

{

public void PromptForPin()

{

System.out.println("ATM Machine 1:: Enter the Pin:: " );

}

}

s2. ATM2_PromptForPin.java : package Strategy;

public class ATM2_PromptForPin extends PromptForPin

{

public void PromptForPin()

{

System.out.println("ATM Machine 2:: Enter the Pin:: " );

Page 75: ProjectReport - Maurya,Shailesh

}

}

t. StoreData.java : package Strategy;

import DataStore.*;

/*

* ABSTRACT CLASS : StoreData (STRAGTEGY PATTERN)

*/

public abstract class StoreData

{

public abstract void StoreData(DataStore datastore);

}

t1. ATM1_StoreData.java : package Strategy;

import DataStore.*;

public class ATM1_StoreData extends StoreData

{

public void StoreData(DataStore dataStore)

{

((ATM1_DataStore)dataStore).setPin();

((ATM1_DataStore)dataStore).setBalance();

System.out.println("ATM Machine 1:: After storing the pin and balance,

PIN is " + ((ATM1_DataStore)dataStore).pin + "and Balance is " +

((ATM1_DataStore)dataStore).balance);

}

}

t2. ATM2_StoreData.java : package Strategy;

import DataStore.*;

public class ATM2_StoreData extends StoreData

{

public void StoreData(DataStore dataStore)

{

((ATM2_DataStore)dataStore).setPin();

((ATM2_DataStore)dataStore).setBalance();

System.out.println("ATM Machine 2:: After storing the pin and balance, PIN is

" + ((ATM2_DataStore)dataStore).pin + " and Balance is " +

((ATM2_DataStore)dataStore).balance);

}

}

Page 76: ProjectReport - Maurya,Shailesh

u. TooManyAttemptsMsg.java : package Strategy;

/*

* ABSTRACT CLASS : TooManyAttemptsMsg (STRAGTEGY PATTERN)

*/

public abstract class TooManyAttemptsMsg

{

public abstract void TooManyAttemptsMsg();

}

u1. ATM1_TooManyAttemptsMsg.java : package Strategy;

public class ATM1_TooManyAttemptsMsg extends TooManyAttemptsMsg

{

public void TooManyAttemptsMsg()

{

System.out.println("ATM Machine 1:: Too Many Attempts: ");

}

}

u2. ATM2_TooManyAttemptsMsg.java : package Strategy;

public class ATM2_TooManyAttemptsMsg extends TooManyAttemptsMsg

{

public void TooManyAttemptsMsg()

{

System.out.println("ATM Machine 2:: Too Many Attempts: ");

}

}