From 0e807fab3348bb761c9c6a56532ec294ac5b99c6 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Mon, 21 May 2007 22:08:24 +0000 Subject: [PATCH] Web Server with Tags --- .../Benchmarks/WebServerTag/Inventory.java | 91 +++++++++++ .../src/Benchmarks/WebServerTag/ItemInfo.java | 8 + .../src/Benchmarks/WebServerTag/Logger.java | 29 ++++ .../WebServerTag/WebServerExample.java | 110 ++++++++++++++ .../WebServerTag/WebServerSocket.java | 141 ++++++++++++++++++ 5 files changed, 379 insertions(+) create mode 100644 Robust/src/Benchmarks/WebServerTag/Inventory.java create mode 100644 Robust/src/Benchmarks/WebServerTag/ItemInfo.java create mode 100644 Robust/src/Benchmarks/WebServerTag/Logger.java create mode 100644 Robust/src/Benchmarks/WebServerTag/WebServerExample.java create mode 100644 Robust/src/Benchmarks/WebServerTag/WebServerSocket.java diff --git a/Robust/src/Benchmarks/WebServerTag/Inventory.java b/Robust/src/Benchmarks/WebServerTag/Inventory.java new file mode 100644 index 00000000..74756956 --- /dev/null +++ b/Robust/src/Benchmarks/WebServerTag/Inventory.java @@ -0,0 +1,91 @@ +public class Inventory { + // Inventory flags + flag TransInitialize; + + // Transaction variables + int numitems; + HashMap map; + int balance; + + // Constructor + public Inventory(){ + map = new HashMap(); + balance=100000; + } + + public Inventory(int howmany) { + numitems = howmany;// howmany keeps track of the number of items + // in the inventory + map = new HashMap(); + } + + // Add item to a list of inventory + public int additem(String name, int quantity, int price){ + ItemInfo newitem = new ItemInfo(quantity, price); + balance-=quantity*price; + + // Get the item from hash + if (map.containsKey(name) == false) { + map.put(name, newitem); + } else { + ItemInfo i = (ItemInfo) map.get(name); + i.quantity += quantity; + i.price = price; + map.put(name, i); + } + return 0; + } + + // Buy item from a given list of inventory + public int buyitem(String name, int quantity){ + if (map.containsKey(name) == false) { + // System.printString("Error - Item does not exist"); + return -1; + } else { + ItemInfo i = (ItemInfo) map.get(name); + if (i.quantity == 0) { + // System.printString("Error - Item unavailable"); + return -1; + } + if ((i.quantity-quantity) < 0 ) { + // System.printString("Error - Available qty is less: Cannot Buy\n"); + return -1; + } else { + i.quantity -= quantity; + map.put(name, i); + balance+=quantity*i.price; + return i.price; + } + } + return 0; + } + + //Display the inventory list + //Display the inventory list + public synchronized void inventory(Socket s){ + HashMapIterator i = new HashMapIterator(map, 0);// Gets key from the hashmap= name of item + HashMapIterator j = new HashMapIterator(map, 1);//Gets the value from hashmap + int totalvalue=balance; + while (i.hasNext() == true) { + StringBuffer sb = new StringBuffer(""); + Object o = i.next(); + String name = o.toString(); + ItemInfo oo = (ItemInfo) j.next(); + sb.append(name); + sb.append(" "); + Integer q = new Integer(oo.quantity); + sb.append(q.toString()); + sb.append(" "); + Integer p = new Integer(oo.price); + sb.append(p.toString()); + sb.append("\n"); + totalvalue+=oo.quantity*oo.price; + s.write(sb.toString().getBytes()); + } + StringBuffer sb=new StringBuffer(""); + sb.append("Total value: "); + sb.append((new Integer(totalvalue)).toString()); + sb.append("\n"); + s.write(sb.toString().getBytes()); + } +} diff --git a/Robust/src/Benchmarks/WebServerTag/ItemInfo.java b/Robust/src/Benchmarks/WebServerTag/ItemInfo.java new file mode 100644 index 00000000..18a61a59 --- /dev/null +++ b/Robust/src/Benchmarks/WebServerTag/ItemInfo.java @@ -0,0 +1,8 @@ +class ItemInfo { + int quantity; + int price; + ItemInfo(int x, int y) { + quantity = x; + price = y; + } +} diff --git a/Robust/src/Benchmarks/WebServerTag/Logger.java b/Robust/src/Benchmarks/WebServerTag/Logger.java new file mode 100644 index 00000000..a23cc4fa --- /dev/null +++ b/Robust/src/Benchmarks/WebServerTag/Logger.java @@ -0,0 +1,29 @@ +public class Logger { + //Logger flag + flag Initialize; + FileOutputStream fos; + + + //Constructor + public Logger(){ + fos=new FileOutputStream("request.log");//Open request.log file + } + + //Logs filename as per client requests + public void logrequest(String filename){ + String request = new String("\nNew Request received: "); + fos.write(request.getBytes()); + fos.write(filename.getBytes()); + fos.flush(); + } + + public void logrequest(){ + String request = new String("\nNew Request received: "); + fos.write(request.getBytes()); + fos.flush(); + } + + public void closerequest() { + fos.close(); + } +} diff --git a/Robust/src/Benchmarks/WebServerTag/WebServerExample.java b/Robust/src/Benchmarks/WebServerTag/WebServerExample.java new file mode 100644 index 00000000..be86e36a --- /dev/null +++ b/Robust/src/Benchmarks/WebServerTag/WebServerExample.java @@ -0,0 +1,110 @@ +/* Startup object is generated with the initialstate flag set by the + * system to start the computation up */ + +// Create New ServerSocket +task Startup(StartupObject s {initialstate}) { +// System.printString("W> Starting\n"); + ServerSocket ss = new ServerSocket(9000); +// System.printString("W> Creating ServerSocket\n"); + Logger log = new Logger() {Initialize}; + Inventory inventorylist = new Inventory(){TransInitialize}; + taskexit(s {!initialstate}); /* Turns initial state flag off, so this task won't refire */ +} + +//Listen for a request and accept request +task AcceptConnection(ServerSocket ss{SocketPending}) { + // System.printString("W> Waiting for connection...\n"); + tag t=new tag(link); + WebServerSocket web = new WebServerSocket() {!WritePending, !TransPending, WebInitialize}{t}; + ss.accept(t); +// System.printString("W> Connected... \n"); +} + +// Process the incoming http request +task ProcessRequest(WebServerSocket web{WebInitialize}{link l}, Socket s{IOPending}{link l}) { + if (web.clientrequest(s)) { + if(web.checktrans()==false) + // Not special transaction , do normal filesending + taskexit(web {WritePending, LogPending,!WebInitialize}); //Sets the WritePending and LogPending flag true + else + // Invoke special inventory transaction + taskexit(web {TransPending, LogPending,!WebInitialize}); + } +} + +//Do the WriteIO on server socket and send the requested file to Client +task SendFile(WebServerSocket web{WritePending}{link l}, Socket s{}{link l}) { +// System.printString("W> Inside SendFile ... \n"); + web.sendfile(s); + s.close(); + taskexit(web {!WritePending}); +} + +// Log the Client request +task LogRequest(WebServerSocket web{LogPending}, Logger log{Initialize}) { +//Task fired when both +// LogPending and Initialize flags are true +// System.printString("L > Inside logrequest\n"); + log.logrequest(web.filename); + taskexit(web {!LogPending}); +} + +//Transaction on Inventory +task Transaction(WebServerSocket web{TransPending}{link l}, Inventory inventorylist{TransInitialize},Socket s{}{link l}){ //Task for WebServerTransactions +// System.printString("T > Inside Transaction\n"); + // Parse + int op = web.parseTransaction(); + // Check for the kind of operation + if (op == 0 ) { /* Add */ +// System.printString("DEBUG > Calling add transaction\n"); + Integer qty = new Integer(web.parsed[2]); + Integer price = new Integer(web.parsed[3]); + int ret = inventorylist.additem(web.parsed[1], qty.intValue(), price.intValue()); + if (ret == 0) { + web.httpresponse(s); + StringBuffer st = new StringBuffer("Added Item "); + st.append(web.parsed[1]); + st.append(" Quantity "); + st.append(web.parsed[2]); + st.append(" Price "); + st.append(web.parsed[3]); + st.append("\n"); + String towrite = new String(st); + s.write(towrite.getBytes()); + } else { + web.httpresponse(s); + String st = new String("Error encountered"); + s.write(st.getBytes()); + } + } else if (op == 1) { /* Buy */ +// System.printString("DEBUG > Calling buy transaction\n"); + Integer qty = new Integer(web.parsed[2]); + int ret = inventorylist.buyitem(web.parsed[1], qty.intValue()); + if (ret >= 0) { + web.httpresponse(s); + StringBuffer st = new StringBuffer("Bought item "); + st.append(web.parsed[1]); + st.append(" Quantity "); + st.append(web.parsed[2]); + st.append(" Cost "); + Integer cost = new Integer(ret*qty.intValue()); + String c = cost.toString(); + st.append(c); + String towrite = new String(st); + s.write(towrite.getBytes()); + } else { + web.httpresponse(s); + String st = new String("Error encountered"); + s.write(st.getBytes()); + } + } else if (op == 2) { /* Inventory */ +// System.printString("DEBUG > Calling inventory transaction\n"); + web.httpresponse(s); + inventorylist.inventory(s); + } else { /* Error */ +// System.printString("T > Error - Unknown transaction\n"); + } + //Invoke close operations + s.close(); + taskexit(web {!TransPending}); +} diff --git a/Robust/src/Benchmarks/WebServerTag/WebServerSocket.java b/Robust/src/Benchmarks/WebServerTag/WebServerSocket.java new file mode 100644 index 00000000..00d24052 --- /dev/null +++ b/Robust/src/Benchmarks/WebServerTag/WebServerSocket.java @@ -0,0 +1,141 @@ +public class WebServerSocket { + // Websocket flag + flag LogPending; + flag WritePending; + flag TransPending; + flag WebInitialize; + + //Filename requested by the client + String filename; + String[] parsed; + String prefix; + + //Constructor + public WebServerSocket(){ + parsed = new String[4]; + } + + //Send the http header for web browser display + public void httpresponse(Socket s){ + StringBuffer header = new StringBuffer("HTTP/1.0 200 OK\n"); + header.append("Content-type: text/html\n"); + header.append("\n\n"); + String temp_str = new String(header); + s.write(temp_str.getBytes()); + return; + + } + + // Send the html file , read from file one byte at a time + public void sendfile(Socket s) { + StringBuffer req_file = new StringBuffer("./htmlfiles/"); + req_file.append(filename); + String filepath = new String(req_file); + FileInputStream def_file = new FileInputStream(filepath); + int status = def_file.getfd();//Checks if the file is present in + //current directory + httpresponse(s); + if (status == -1){ + StringBuffer response = new StringBuffer("404: not found: ");//Send 404 error if + // file not found + response.append(filename); + String buffer = new String(response); + s.write(buffer.getBytes()); + def_file.close(); + return; + } + byte buf[] = new byte[16]; + int ret; + + while ((ret = def_file.read(buf)) > 0) {// Read from file and write + // one byte at a time into the socket + byte tosend[] = new byte[ret]; + for (int i = 0; i < ret; i++) { + tosend[i] = buf[i]; + } + s.write(tosend); + //String str = new String(tosend); + } + def_file.close(); + } + + //Read the client request and extract the filename from it + public boolean clientrequest(Socket s){ + byte b1[] = new byte[1024]; + int numbytes=s.read(b1);//Read client request from web server socket + String curr=(new String(b1)).subString(0, numbytes); + if (prefix!=null) { + StringBuffer sb=new StringBuffer(prefix); + sb.append(curr); + curr=sb.toString(); + } + prefix=curr; + if(prefix.indexOf("\r\n\r\n")>=0) { + + int index = prefix.indexOf('/');//Parse the GET client request to find filename + int end = prefix.indexOf('H'); + filename = prefix.subString((index+1), (end-1)); + return true; + } + return false; + } + + // Parse for the prefix in the client request + // This is helpful to find if the prefix is a special transaction + public boolean checktrans(){ + if (filename.startsWith("trans") == true) { + return true; + } else { + return false; + } + } + + //Parse for the substrings in the filename and use it to obtain the + //kind of operation, name of item, quantity of item, price of item + //e.g. trans_add_car_2_10000 is the filename + //store in the parsed[] string , add,car,2,1000 + public int parseTransaction(){ + int start = filename.indexOf('_'); + String s = filename.subString(start+1); + + if (s.startsWith("add")==true){ + // System.printString("DEBUG > ADD\n"); + int i1 = s.indexOf('_'); + parsed[0] = new String(s.subString(0,i1)); + + int i2 = s.indexOf('_',i1+1); + parsed[1] = new String(s.subString(i1+1,i2)); + + int i3 = s.indexOf('_',i2+1); + parsed[2] = new String(s.subString(i2+1,i3)); + + String s3 = s.subString(i3+1); + parsed[3] = s3; + + return 0; + + } + if (s.startsWith("buy")==true){ + // System.printString("DEBUG > BUY\n"); + int i1 = s.indexOf('_'); + parsed[0] = s.subString(0,i1); + + int i2 = s.indexOf('_', i1+1); + parsed[1] = s.subString(i1+1,i2); + + String s2 = s.subString(i2+1); + parsed[2] = s2; + + parsed[3] = ""; + + return 1; + } + if (s.startsWith("inventory")==true){ + // System.printString("DEBUG > INVENTORY\n"); + return 2; + + } + // Error transaction + return -1; + } +} -- 2.34.1