+++ /dev/null
-//Banking Application Server\r
-\r
-/* Startup object is generated with the initialstate flag set by the\r
- * system to start the computation up */\r
-\r
-task Startup(StartupObject s{initialstate})\r
-{\r
- System.printString("Starting\n");\r
- ServerSocket ss = new ServerSocket(8080);\r
- System.printString("Creating ServerSocket\n");\r
- BankDatabase Bank = new BankDatabase(){DatabaseInit};\r
- taskexit(s{!initialstate}); /* Turns initial state flag off, so this task won't refire */\r
-}\r
-\r
-task AcceptConnection(ServerSocket ss{SocketPending})\r
-{\r
- BankAppSocket bas = new BankAppSocket(){BASocketInit};\r
- ss.accept(bas);\r
- System.printString("Connected\n");\r
-}\r
-\r
-//i think this task could probably be broken up into smaller tasks\r
-task ProcessRequest(BankAppSocket bas{IOPending && BASocketInit}, BankDatabase Bank{DatabaseInit})\r
-{\r
- String message = new String(bas.receive());\r
- //System.printString(message);\r
- \r
- //login\r
- if(message.startsWith("1"))\r
- {\r
- String account = message.subString(1, 10);\r
- String pin = message.subString(10, 14);\r
- \r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account) && Bank.database[i].PIN.equals(pin))\r
- {\r
- bas.send("Login OK");\r
- //System.printString("Login OK");\r
- }\r
- else\r
- {\r
- bas.send("Login Error");\r
- //System.printString("Login Error");\r
- }\r
- }\r
- }\r
- //logout\r
- else if(message.startsWith("2"))\r
- {\r
- String account = message.subString(1, 10);\r
- \r
- //find the account\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- {\r
- bas.send("Logout OK");\r
- //System.printString("Logout OK");\r
- }\r
- else\r
- {\r
- bas.send("Logout Error");\r
- //System.printString("Logout Error");\r
- }\r
- }\r
- }\r
- //create\r
- else if(message.startsWith("3"))\r
- {\r
- String account = message.subString(1, 10);\r
- String first = message.subString(10, 20);\r
- String middle = message.subString(20, 30);\r
- String last = message.subString(30, 40);\r
- String type = message.subString(40, 41);\r
- String balance = message.subString(41, 51);\r
- String pin = message.subString(51, 55);\r
- \r
- //find first empty space\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals("@@@@@@@@@"))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- //should check for input errors first but...\r
- Bank.database[id].AccountNumber = first;\r
- Bank.database[id].FirstName = middle;\r
- Bank.database[id].MiddleName = last;\r
- Bank.database[id].LastName = last;\r
- Bank.database[id].AccountType = type;\r
- Bank.database[id].Balance = balance;\r
- Bank.database[id].PIN = pin;\r
- \r
- Bank.numOfAccounts++;\r
- \r
- bas.send(Bank.database[id].AccountNumber);\r
- //System.printString(Bank.database[id].AccountNumber);\r
- }\r
- else\r
- {\r
- bas.send("Create Error");\r
- //System.printString("Create Error");\r
- }\r
- }\r
- //delete\r
- else if(message.startsWith("4"))\r
- {\r
- String account = message.subString(1, 10);\r
- \r
- //find the account\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- Bank.database[id].AccountNumber = "@@@@@@@@@@";\r
- Bank.database[id].FirstName = "@@@@@@@@@@";\r
- Bank.database[id].MiddleName = "@@@@@@@@@@";\r
- Bank.database[id].LastName = "@@@@@@@@@@";\r
- Bank.database[id].AccountType = "@";\r
- Bank.database[id].Balance = "@@@@@@@@@@";\r
- Bank.database[id].PIN = "@@@@";\r
- Bank.numOfAccounts--;\r
- \r
- bas.send("Close Account OK");\r
- //System.printString("Close Account OK");\r
- }\r
- else\r
- {\r
- bas.send("Close Account Error");\r
- //System.printString("Close Account Error");\r
- }\r
- }\r
- //modify\r
- else if(message.startsWith("5"))\r
- {\r
- String account = message.subString(1, 10);\r
- String field = message.subString(10, 11);\r
- //two digits 00-99\r
- String numBytes = message.subString(11, 13);\r
- String data = message.subString(13, 13 + Integer.parseInt(numBytes));\r
- \r
- //find the account\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- //maybe shouldn't allow changes to some of these fields\r
- if(field.equals("1"))\r
- {\r
- Bank.database[id].AccountNumber = data;\r
- }\r
- else if(field.equals("2"))\r
- {\r
- Bank.database[id].FirstName = data;\r
- }\r
- else if(field.equals("3"))\r
- {\r
- Bank.database[id].MiddleName = data;\r
- }\r
- else if(field.equals("4"))\r
- {\r
- Bank.database[id].LastName = data;\r
- }\r
- else if(field.equals("5"))\r
- {\r
- Bank.database[id].AccountType = data;\r
- }\r
- else if(field.equals("6"))\r
- {\r
- Bank.database[id].Balance = data;\r
- }\r
- else if(field.equals("7"))\r
- {\r
- Bank.database[id].PIN = data;\r
- }\r
- \r
- bas.send("Modify OK");\r
- //System.printString("Modify OK");\r
- }\r
- else\r
- {\r
- bas.send("Modify Error");\r
- //System.printString("Modify Error");\r
- }\r
- }\r
- //check account info\r
- else if(message.startsWith("6"))\r
- {\r
- String account = message.subString(1, 10);\r
- \r
- //find the account\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- StringBuffer strBuffer = new StringBuffer(Bank.database[id].AccountNumber);\r
- strBuffer.append(Bank.database[id].FirstName);\r
- strBuffer.append(Bank.database[id].MiddleName);\r
- strBuffer.append(Bank.database[id].LastName);\r
- strBuffer.append(Bank.database[id].AccountType);\r
- strBuffer.append(Bank.database[id].Balance);\r
- strBuffer.append(Bank.database[id].PIN);\r
- \r
- bas.send(strBuffer.toString());\r
- //System.printString(strBuffer.toString());\r
- }\r
- else\r
- {\r
- bas.send("Check Account Info Error");\r
- //System.printString("Check Account Info Error");\r
- }\r
- \r
- }\r
- //deposit\r
- //more string operations or a Float Object could be useful here \r
- else if(message.startsWith("7"))\r
- {\r
- String account = message.subString(1, 10);\r
- //two digits 00-99\r
- //dollar part only\r
- String numBytes = message.subString(10, 12);\r
- //get dollars\r
- String data = message.subString(12, 12 + Integer.parseInt(numBytes));\r
- \r
- \r
- //find the account\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- { \r
- Integer sum = new Integer(Integer.parseInt(Bank.database[id].Balance) + Integer.parseInt(data));\r
- \r
- StringBuffer sumBuffer = new StringBuffer(sum.toString());\r
- \r
- int padding = 10 - sumBuffer.length();\r
- \r
- for(int i = 0; i < padding; i++)\r
- {\r
- sumBuffer.append("@");\r
- }\r
- \r
- //assumes no overflow\r
- Bank.database[id].Balance = sumBuffer.toString();\r
- \r
- bas.send("Deposit OK");\r
- //System.printString("Deposit OK");\r
- }\r
- else\r
- {\r
- bas.send("Deposit Error");\r
- //System.printString("Deposit Error");\r
- }\r
- }\r
- //withdraw\r
- else if(message.startsWith("8"))\r
- {\r
- String account = message.subString(1, 10);\r
- //two digits 00-99\r
- //dollar part only\r
- String numBytes = message.subString(10, 12);\r
- //get dollars\r
- String data = message.subString(12, 12 + Integer.parseInt(numBytes));\r
- \r
- //find the account\r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- Integer difference = new Integer(Integer.parseInt(Bank.database[id].Balance) - Integer.parseInt(data));\r
- \r
- if(difference.intValue() >= 0)\r
- {\r
- StringBuffer difBuffer = new StringBuffer(difference.toString());\r
- \r
- int padding = 10 - difBuffer.length();\r
- \r
- for(int i = 0; i < padding; i++)\r
- {\r
- difBuffer.append("@");\r
- }\r
- \r
- //assumes no overflow\r
- Bank.database[id].Balance = difBuffer.toString();\r
- \r
- bas.send("Withdraw OK");\r
- //System.printString("Withdraw OK");\r
- }\r
- else\r
- {\r
- bas.send("Overdraw Error");\r
- //System.printString("Overdraw Error");\r
- }\r
- }\r
- else\r
- {\r
- bas.send("Withdraw Error");\r
- //System.printString("Withdraw Error");\r
- }\r
- }\r
- //check balance\r
- else if(message.startsWith("9"))\r
- {\r
- String account = message.subString(1, 10);\r
- \r
- int id = -1;\r
- for(int i = 0; i < Bank.numOfAccounts; i++)\r
- {\r
- if(Bank.database[i].AccountNumber.equals(account))\r
- id = i;\r
- }\r
- \r
- if(id != -1)\r
- {\r
- bas.send(Bank.database[id].Balance);\r
- //System.printString(Bank.database[id].Balance);\r
- }\r
- else\r
- {\r
- bas.send("Check Balance Error");\r
- //System.printString("Check Balance Error");\r
- }\r
- }\r
- else\r
- {\r
- bas.send("Message Error");\r
- //System.printString("Message Error");\r
- }\r
-}\r