Web Server with Tags
authorbdemsky <bdemsky>
Mon, 21 May 2007 22:08:24 +0000 (22:08 +0000)
committerbdemsky <bdemsky>
Mon, 21 May 2007 22:08:24 +0000 (22:08 +0000)
Robust/src/Benchmarks/WebServerTag/Inventory.java [new file with mode: 0644]
Robust/src/Benchmarks/WebServerTag/ItemInfo.java [new file with mode: 0644]
Robust/src/Benchmarks/WebServerTag/Logger.java [new file with mode: 0644]
Robust/src/Benchmarks/WebServerTag/WebServerExample.java [new file with mode: 0644]
Robust/src/Benchmarks/WebServerTag/WebServerSocket.java [new file with mode: 0644]

diff --git a/Robust/src/Benchmarks/WebServerTag/Inventory.java b/Robust/src/Benchmarks/WebServerTag/Inventory.java
new file mode 100644 (file)
index 0000000..7475695
--- /dev/null
@@ -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 (file)
index 0000000..18a61a5
--- /dev/null
@@ -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 (file)
index 0000000..a23cc4f
--- /dev/null
@@ -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 (file)
index 0000000..be86e36
--- /dev/null
@@ -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 (file)
index 0000000..00d2405
--- /dev/null
@@ -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;
+    }
+}