1 //Banking Application Server
\r
3 /* Startup object is generated with the initialstate flag set by the
\r
4 * system to start the computation up */
\r
6 task Startup(StartupObject s{initialstate})
\r
8 System.printString("Starting\n");
\r
9 ServerSocket ss = new ServerSocket(8080);
\r
10 System.printString("Creating ServerSocket\n");
\r
11 BankDatabase Bank = new BankDatabase(){DatabaseInit};
\r
12 taskexit(s{!initialstate}); /* Turns initial state flag off, so this task won't refire */
\r
15 task AcceptConnection(ServerSocket ss{SocketPending})
\r
17 BankAppSocket bas = new BankAppSocket(){BASocketInit};
\r
19 System.printString("Connected\n");
\r
22 //i think this task could probably be broken up into smaller tasks
\r
23 task ProcessRequest(BankAppSocket bas{IOPending && BASocketInit}, BankDatabase Bank{DatabaseInit})
\r
25 String message = new String(bas.receive());
\r
26 //System.printString(message);
\r
29 if(message.startsWith("1"))
\r
31 String account = message.subString(1, 10);
\r
32 String pin = message.subString(10, 14);
\r
34 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
36 if(Bank.database[i].AccountNumber.equals(account) && Bank.database[i].PIN.equals(pin))
\r
38 bas.send("Login OK");
\r
39 //System.printString("Login OK");
\r
43 bas.send("Login Error");
\r
44 //System.printString("Login Error");
\r
49 else if(message.startsWith("2"))
\r
51 String account = message.subString(1, 10);
\r
54 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
56 if(Bank.database[i].AccountNumber.equals(account))
\r
58 bas.send("Logout OK");
\r
59 //System.printString("Logout OK");
\r
63 bas.send("Logout Error");
\r
64 //System.printString("Logout Error");
\r
69 else if(message.startsWith("3"))
\r
71 String account = message.subString(1, 10);
\r
72 String first = message.subString(10, 20);
\r
73 String middle = message.subString(20, 30);
\r
74 String last = message.subString(30, 40);
\r
75 String type = message.subString(40, 41);
\r
76 String balance = message.subString(41, 51);
\r
77 String pin = message.subString(51, 55);
\r
79 //find first empty space
\r
81 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
83 if(Bank.database[i].AccountNumber.equals("@@@@@@@@@"))
\r
89 //should check for input errors first but...
\r
90 Bank.database[id].AccountNumber = first;
\r
91 Bank.database[id].FirstName = middle;
\r
92 Bank.database[id].MiddleName = last;
\r
93 Bank.database[id].LastName = last;
\r
94 Bank.database[id].AccountType = type;
\r
95 Bank.database[id].Balance = balance;
\r
96 Bank.database[id].PIN = pin;
\r
98 Bank.numOfAccounts++;
\r
100 bas.send(Bank.database[id].AccountNumber);
\r
101 //System.printString(Bank.database[id].AccountNumber);
\r
105 bas.send("Create Error");
\r
106 //System.printString("Create Error");
\r
110 else if(message.startsWith("4"))
\r
112 String account = message.subString(1, 10);
\r
116 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
118 if(Bank.database[i].AccountNumber.equals(account))
\r
124 Bank.database[id].AccountNumber = "@@@@@@@@@@";
\r
125 Bank.database[id].FirstName = "@@@@@@@@@@";
\r
126 Bank.database[id].MiddleName = "@@@@@@@@@@";
\r
127 Bank.database[id].LastName = "@@@@@@@@@@";
\r
128 Bank.database[id].AccountType = "@";
\r
129 Bank.database[id].Balance = "@@@@@@@@@@";
\r
130 Bank.database[id].PIN = "@@@@";
\r
131 Bank.numOfAccounts--;
\r
133 bas.send("Close Account OK");
\r
134 //System.printString("Close Account OK");
\r
138 bas.send("Close Account Error");
\r
139 //System.printString("Close Account Error");
\r
143 else if(message.startsWith("5"))
\r
145 String account = message.subString(1, 10);
\r
146 String field = message.subString(10, 11);
\r
148 String numBytes = message.subString(11, 13);
\r
149 String data = message.subString(13, 13 + Integer.parseInt(numBytes));
\r
153 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
155 if(Bank.database[i].AccountNumber.equals(account))
\r
161 //maybe shouldn't allow changes to some of these fields
\r
162 if(field.equals("1"))
\r
164 Bank.database[id].AccountNumber = data;
\r
166 else if(field.equals("2"))
\r
168 Bank.database[id].FirstName = data;
\r
170 else if(field.equals("3"))
\r
172 Bank.database[id].MiddleName = data;
\r
174 else if(field.equals("4"))
\r
176 Bank.database[id].LastName = data;
\r
178 else if(field.equals("5"))
\r
180 Bank.database[id].AccountType = data;
\r
182 else if(field.equals("6"))
\r
184 Bank.database[id].Balance = data;
\r
186 else if(field.equals("7"))
\r
188 Bank.database[id].PIN = data;
\r
191 bas.send("Modify OK");
\r
192 //System.printString("Modify OK");
\r
196 bas.send("Modify Error");
\r
197 //System.printString("Modify Error");
\r
200 //check account info
\r
201 else if(message.startsWith("6"))
\r
203 String account = message.subString(1, 10);
\r
207 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
209 if(Bank.database[i].AccountNumber.equals(account))
\r
215 StringBuffer strBuffer = new StringBuffer(Bank.database[id].AccountNumber);
\r
216 strBuffer.append(Bank.database[id].FirstName);
\r
217 strBuffer.append(Bank.database[id].MiddleName);
\r
218 strBuffer.append(Bank.database[id].LastName);
\r
219 strBuffer.append(Bank.database[id].AccountType);
\r
220 strBuffer.append(Bank.database[id].Balance);
\r
221 strBuffer.append(Bank.database[id].PIN);
\r
223 bas.send(strBuffer.toString());
\r
224 //System.printString(strBuffer.toString());
\r
228 bas.send("Check Account Info Error");
\r
229 //System.printString("Check Account Info Error");
\r
234 //more string operations or a Float Object could be useful here
\r
235 else if(message.startsWith("7"))
\r
237 String account = message.subString(1, 10);
\r
240 String numBytes = message.subString(10, 12);
\r
242 String data = message.subString(12, 12 + Integer.parseInt(numBytes));
\r
247 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
249 if(Bank.database[i].AccountNumber.equals(account))
\r
255 Integer sum = new Integer(Integer.parseInt(Bank.database[id].Balance) + Integer.parseInt(data));
\r
257 StringBuffer sumBuffer = new StringBuffer(sum.toString());
\r
259 int padding = 10 - sumBuffer.length();
\r
261 for(int i = 0; i < padding; i++)
\r
263 sumBuffer.append("@");
\r
266 //assumes no overflow
\r
267 Bank.database[id].Balance = sumBuffer.toString();
\r
269 bas.send("Deposit OK");
\r
270 //System.printString("Deposit OK");
\r
274 bas.send("Deposit Error");
\r
275 //System.printString("Deposit Error");
\r
279 else if(message.startsWith("8"))
\r
281 String account = message.subString(1, 10);
\r
284 String numBytes = message.subString(10, 12);
\r
286 String data = message.subString(12, 12 + Integer.parseInt(numBytes));
\r
290 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
292 if(Bank.database[i].AccountNumber.equals(account))
\r
298 Integer difference = new Integer(Integer.parseInt(Bank.database[id].Balance) - Integer.parseInt(data));
\r
300 if(difference.intValue() >= 0)
\r
302 StringBuffer difBuffer = new StringBuffer(difference.toString());
\r
304 int padding = 10 - difBuffer.length();
\r
306 for(int i = 0; i < padding; i++)
\r
308 difBuffer.append("@");
\r
311 //assumes no overflow
\r
312 Bank.database[id].Balance = difBuffer.toString();
\r
314 bas.send("Withdraw OK");
\r
315 //System.printString("Withdraw OK");
\r
319 bas.send("Overdraw Error");
\r
320 //System.printString("Overdraw Error");
\r
325 bas.send("Withdraw Error");
\r
326 //System.printString("Withdraw Error");
\r
330 else if(message.startsWith("9"))
\r
332 String account = message.subString(1, 10);
\r
335 for(int i = 0; i < Bank.numOfAccounts; i++)
\r
337 if(Bank.database[i].AccountNumber.equals(account))
\r
343 bas.send(Bank.database[id].Balance);
\r
344 //System.printString(Bank.database[id].Balance);
\r
348 bas.send("Check Balance Error");
\r
349 //System.printString("Check Balance Error");
\r
354 bas.send("Message Error");
\r
355 //System.printString("Message Error");
\r