|
Bank |
|
1 // joi/5/bank/Bank.java
2 //
3 //
4 // Copyright 2003 Bill Campbell and Ethan Bolker
5
6 import java.util.*;
7
8 /**
9 * A Bank object simulates the behavior of a simple bank/ATM.
10 * It contains a Terminal object and a collection of
11 * BankAccount objects.
12 *
13 * The visit method opens this Bank for business,
14 * prompting the customer for input.
15 *
16 * To create a Bank and open it for business issue the command
17 * <code>java Bank</code>.
18 *
19 * @see BankAccount
20 * @version 5
21 */
22
23 public class Bank
24 {
25 private String bankName; // the name of this Bank
26 private Terminal atm; // for talking with the customer
27 private int balance = 0; // total cash on hand
28 private int transactionCount = 0; // number of Bank transactions
29 private Month month; // the current month.
30
31 private TreeMap accountList; // mapping names to accounts.
32
33 // what the banker can ask of the bank
34
35 private static final String BANKER_COMMANDS =
36 "Banker commands: " +
37 "exit, open, customer, report, help.";
38
39 // what the customer can ask of the bank
40
41 private static final String CUSTOMER_TRANSACTIONS =
42 " Customer transactions: " +
43 "deposit, withdraw, transfer, balance, cash check, quit, help.";
44
45 /**
46 * Construct a Bank with the given name and Terminal.
47 *
48 * @param bankName the name for this Bank.
49 * @param atm this Bank's Terminal.
50 */
51
52 public Bank( String bankName, Terminal atm )
53 {
54 this.atm = atm;
55 this.bankName = bankName;
56 accountList = new TreeMap();
57 month = new Month();
58 }
59
60 /**
61 * Simulates interaction with a Bank.
62 * Presents the user with an interactive loop, prompting for
63 * banker transactions and in case of the banker transaction
64 * "customer", an account id and further customer
65 * transactions.
66 */
67
68 public void visit()
69 {
70 instructUser();
71
72 String command;
73 while (!(command =
74 atm.readWord("banker command: ")).equals("exit")) {
75
76 if (command.startsWith("h")) {
77 help( BANKER_COMMANDS );
78 }
79 else if (command.startsWith("o")) {
80 openNewAccount();
81 }
82 else if (command.startsWith("r")) {
83 report();
84 }
85 else if (command.startsWith( "c" ) ) {
86 BankAccount acct = whichAccount();
87 if ( acct != null )
88 processTransactionsForAccount( acct );
89 }
90 else {
91 // Unrecognized Request
92 atm.println( "unknown command: " + command );
93 }
94 }
95 report();
96 atm.println( "Goodbye from " + bankName );
97 }
98
99
100 // Open a new bank account,
101 // prompting the user for information.
102
103 private void openNewAccount()
104 {
105 String accountName = atm.readWord( "Account name: " );
106 char accountType =
107 atm.readChar( "Checking/Fee/Regular? (c/f/r): " );
108 int startup = atm.readInt( "Initial deposit: " );
109 BankAccount newAccount;
110 switch( accountType ) {
111 case 'c':
112 newAccount = new CheckingAccount( startup, this );
113 break;
114 case 'f':
115 newAccount = new FeeAccount( startup, this );
116 break;
117 case 'r':
118 newAccount = new RegularAccount( startup, this );
119 break;
120 default:
121 atm.println("invalid account type: " + accountType);
122 return;
123 }
124 accountList.put( accountName, newAccount );
125 atm.println( "opened new account " + accountName
126 + " with $" + startup );
127 }
128
129 // Prompt the customer for transaction to process.
130 // Then send an appropriate message to the account.
131
132 private void processTransactionsForAccount( BankAccount acct )
133 {
134 help( CUSTOMER_TRANSACTIONS );
135
136 String transaction;
137 while (!(transaction =
138 atm.readWord(" transaction: ")).equals("quit")) {
139
140 if ( transaction.startsWith( "h" ) ) {
141 help( CUSTOMER_TRANSACTIONS );
142 }
143 else if ( transaction.startsWith( "d" ) ) {
144 int amount = atm.readInt( " amount:" );
145 atm.println(" deposited " + acct.deposit( amount ));
146 }
147 else if ( transaction.startsWith( "w" ) ) {
148 int amount = atm.readInt( " amount:" );
149 atm.println(" withdrew " + acct.withdraw( amount ));
150 }
151 else if ( transaction.startsWith( "c" ) ) {
152 int amount = atm.readInt( " amount of check: " );
153 atm.println(" cashed check for " +
154 ((CheckingAccount)acct).honorCheck( amount ));
155 }
156 else if (transaction.startsWith("t")) {
157 atm.print( " to ");
158 BankAccount toacct = whichAccount();
159 if (toacct != null) {
160 int amount = atm.readInt(" amount to transfer: ");
161 atm.println(" transfered " +
162 toacct.deposit(acct.withdraw(amount)));
163 }
164 }
165 else if (transaction.startsWith("b")) {
166 atm.println(" current balance " +
167 acct.requestBalance());
168 }
169 else {
170 atm.println(" sorry, unknown transaction" );
171 }
172 }
173 atm.println();
174 }
175
176 // Prompt for an account name (or number), look it up
177 // in the account list. If it's there, return it;
178 // otherwise report an error and return null.
179
180 private BankAccount whichAccount()
181 {
182 String accountName = atm.readWord( "account name: " );
183 BankAccount account = (BankAccount) accountList.get(accountName);
184 if (account == null) {
185 atm.println("not a valid account");
186 }
187 return account;
188 }
189
190 // Action to take when a new month starts.
191 // Update the month field by sending a next message.
192 // Loop on all accounts, sending each a newMonth message.
193
194 private void newMonth()
195 {
196 month.next();
197 // for each account
198 // account.newMonth()
199 }
200
201 // Report bank activity.
202 // For each BankAccount, print the customer id (name or number),
203 // account balance and the number of transactions.
204 // Then print Bank totals.
205
206 private void report()
207 {
208 atm.println( bankName + " report for " + month );
209 atm.println( "\nSummaries of individual accounts:" );
210 atm.println( "account balance transaction count" );
211 for (Iterator i = accountList.keySet().iterator();
212 i.hasNext(); ) {
213 String accountName = (String) i.next();
214 BankAccount acct = (BankAccount) accountList.get(accountName);
215 atm.println(accountName + "\t$" + acct.getBalance() + "\t\t" +
216 acct.getTransactionCount());
217 }
218 atm.println( "\nBank totals");
219 atm.println( "open accounts: " + getNumberOfAccounts() );
220 atm.println( "cash on hand: $" + getBalance());
221 atm.println( "transactions: " + getTransactionCount());
222 atm.println();
223 }
224
225
226 // Welcome the user to the bank and instruct her on
227 // her options.
228
229 private void instructUser()
230 {
231 atm.println( "Welcome to " + bankName );
232 atm.println( "Open some accounts and work with them." );
233 help( BANKER_COMMANDS );
234 }
235
236 // Display a help string.
237
238 private void help( String helpString )
239 {
240 atm.println( helpString );
241 atm.println();
242 }
243
244 /**
245 * Increment bank balance by given amount.
246 *
247 * @param amount the amount increment.
248 */
249
250 public void incrementBalance(int amount)
251 {
252 balance += amount;
253 }
254
255 /**
256 * Increment by one the count of transactions,
257 * for this bank.
258 */
259
260 public void countTransaction()
261 {
262 transactionCount++;
263 }
264
265 /**
266 * Get the number of transactions performed by this bank.
267 *
268 * @return number of transactions performed.
269 */
270
271 public int getTransactionCount( )
272 {
273 return transactionCount ;
274 }
275
276 /**
277 * Get the current bank balance.
278 *
279 * @return current bank balance.
280 */
281
282 public int getBalance()
283 {
284 return balance;
285 }
286
287 /**
288 * Get the current number of open accounts.
289 *
290 * @return number of open accounts.
291 */
292
293 public int getNumberOfAccounts()
294 {
295 return accountList.size();
296 }
297
298 /**
299 * Run the simulation by creating and then visiting a new Bank.
300 *
301 * <p>
302 * A -e argument causes the input to be echoed.
303 * This can be useful for executing the program against
304 * a test script, e.g.,
305 * <pre>
306 * java Bank -e < Bank.in
307 * </pre>
308 *
309 * @param args the command line arguments:
310 * <pre>
311 * -e echo input.
312 * bankName any other command line argument.
313 * </pre>
314 */
315
316 public static void main( String[] args )
317 {
318 // parse the command line arguments for the echo
319 // flag and the name of the bank
320
321 boolean echo = false; // default does not echo
322 String bankName = "Faithless Trust"; // default bank name
323
324 for (int i = 0; i < args.length; i++ ) {
325 if (args[i].equals("-e")) {
326 echo = true;
327 }
328 else {
329 bankName = args[i];
330 }
331 }
332 Bank aBank = new Bank( bankName, new Terminal(echo) );
333 aBank.visit();
334 }
335 }
336
|
Bank |
|