From 8747ea1108e81c274d519bf09a4c25108486470c Mon Sep 17 00:00:00 2001 From: sivaji Date: Fri, 8 Jun 2007 01:07:42 +0000 Subject: [PATCH] Feature adds to webinterface: *Double lined nodes(allocated nodes) are linked to a 'allocating tasks' page. *Each edge(task) in the FS graph is linked to its correnponding task page. *Each task in the Task graph is linked to its corresponding task page. Major mods: Modified GraphNode.java : added getName(); --- .../TaskStateAnalysis/Allocations.java | 2 +- .../Analysis/TaskStateAnalysis/FlagState.java | 14 ++ .../TaskStateAnalysis/TaskAnalysis.java | 12 +- .../Analysis/TaskStateAnalysis/TaskGraph.java | 22 +++ .../Analysis/TaskStateAnalysis/TaskNode.java | 3 + Robust/src/Benchmarks/TTTTag/TTTServer.java | 15 ++- .../Benchmarks/TTTTag/TTTServerSocket.java | 14 +- Robust/src/Interface/WebInterface.java | 126 ++++++++++++++++-- Robust/src/Main/Main.java | 2 + Robust/src/Util/GraphNode.java | 4 + 10 files changed, 192 insertions(+), 22 deletions(-) diff --git a/Robust/src/Analysis/TaskStateAnalysis/Allocations.java b/Robust/src/Analysis/TaskStateAnalysis/Allocations.java index 760a7a6b..0146dafc 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/Allocations.java +++ b/Robust/src/Analysis/TaskStateAnalysis/Allocations.java @@ -11,7 +11,7 @@ public class Allocations extends Namer { public String nodeOption(GraphNode gn) { FlagState fs=(FlagState)gn; if (fs.isSourceNode()) - return "peripheries=2"; + return "peripheries=2, URL=\"" + fs.getClassDescriptor().toString() + "_" + fs.getLabel() + ".html\""; else return ""; } diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java index 3c862ce5..bd211e8c 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java @@ -22,6 +22,8 @@ public class FlagState extends GraphNode { private final ClassDescriptor cd; private final Hashtable tags; private boolean issourcenode; + private Vector tasks; + /** Class constructor * Creates a new flagstate with all flags set to false. @@ -70,8 +72,17 @@ public class FlagState extends GraphNode { */ public void setAsSourceNode(){ issourcenode=true; + this.tasks=new Vector(); + } + + public void addAllocatingTask(TaskDescriptor task){ + tasks.addElement(task); } + public Vector getAllocatingTasks(){ + return tasks; + } + public String toString() { return cd.toString()+getTextLabel(); @@ -216,6 +227,9 @@ public class FlagState extends GraphNode { public String getLabel() { return "N"+uid; } + + + public String getTextLabel() { String label=null; diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java index b723e1b8..45cf7bea 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java @@ -14,6 +14,7 @@ public class TaskAnalysis { Hashtable extern_flags; Queue toprocess; TagAnalysis taganalysis; + Hashtable cdtorootnodes; TypeUtil typeutil; @@ -28,7 +29,7 @@ public class TaskAnalysis { this.state=state; this.typeutil=new TypeUtil(state); this.taganalysis=taganalysis; - + } /** Builds a table of flags for each class in the Bristlecone program. @@ -94,7 +95,7 @@ public class TaskAnalysis { public void taskAnalysis() throws java.io.IOException { flagstates=new Hashtable(); Hashtable sourcenodes; - + cdtorootnodes=new Hashtable(); getFlagsfromClasses(); @@ -113,6 +114,7 @@ public class TaskAnalysis { //Debug block flagstates.put(cd,new Hashtable()); + cdtorootnodes.put(cd,new Vector()); } @@ -126,6 +128,7 @@ public class TaskAnalysis { fsstartup=fsstartup.setFlag(fd[0],true); fsstartup.setAsSourceNode(); + ((Vector)cdtorootnodes.get(startupobject)).add(fsstartup); sourcenodes.put(fsstartup,fsstartup); toprocess.add(fsstartup); @@ -207,6 +210,8 @@ private void analyseTasks(FlagState fs) { for(Iterator fsit=newstates.iterator();fsit.hasNext();) { FlagState fsnew=(FlagState) fsit.next(); fsnew.setAsSourceNode(); + fsnew.addAllocatingTask(td); + ((Vector)cdtorootnodes.get(cd)).add(fsnew); if (! ((Hashtable)flagstates.get(fsnew.getClassDescriptor())).containsKey(fsnew)) { ((Hashtable)flagstates.get(fsnew.getClassDescriptor())).put(fsnew, fsnew); @@ -474,6 +479,9 @@ private FlagState evalNewObjNode(FlatNode nn){ } } + public Vector getRootNodes(ClassDescriptor cd){ + return (Vector)cdtorootnodes.get(cd); + } } diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskGraph.java b/Robust/src/Analysis/TaskStateAnalysis/TaskGraph.java index 00b31dc0..f92df9cb 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskGraph.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskGraph.java @@ -11,6 +11,7 @@ public class TaskGraph { TaskAnalysis taskanalysis; State state; Hashtable cdtonodes; + Hashtable nodes; public TaskGraph(State state, TaskAnalysis taskanalysis) { this.state=state; @@ -91,6 +92,25 @@ public class TaskGraph { } } + /* private void mergeAllNodes(){ + Hashtable alltasks=new Hashtable(); + for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) { + ClassDescriptor cd=(ClassDescriptor) classit.next(); + Set tnodes=((Hashtable)cdtonodes.get(cd)).keyset(); + while (it_tnodes=tnodes.iterator();it_nodes.hasNext()){ + TaskNode tn=it_nodes.next(); + if (alltasks.containsKey(tn)){ + while(tn. + } + } + + + + + } + + */ + private void addEdges(FlagState fs, TaskNode tn){ Hashtable tasknodes=(Hashtable)cdtonodes.get(fs.getClassDescriptor()); @@ -105,4 +125,6 @@ public class TaskGraph { } } + + } diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java b/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java index e2dbd34e..64c14a01 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskNode.java @@ -33,6 +33,9 @@ public class TaskNode extends GraphNode { return "N"+uid; } + public String getName(){ + return name; + } /**toString method. * @return string representation of the tasknode (e.g "Task foo") diff --git a/Robust/src/Benchmarks/TTTTag/TTTServer.java b/Robust/src/Benchmarks/TTTTag/TTTServer.java index ab3169f4..e7288a0d 100644 --- a/Robust/src/Benchmarks/TTTTag/TTTServer.java +++ b/Robust/src/Benchmarks/TTTTag/TTTServer.java @@ -14,21 +14,21 @@ task Startup(StartupObject s {initialstate}) { task AcceptConnection(ServerSocket ss{SocketPending}) { System.printString("Waiting for connection...\n"); tag t=new tag(connect); - TTTServerSocket ttts = new TTTServerSocket() {TTTSInitialize}{t}; + TTTServerSocket ttts = new TTTServerSocket() {ReceiveRequest}{t}; System.printString("Calling accept...\n"); ss.accept(t); System.printString("Connected...\n"); } // Process incoming requests -task ProcessRequest(TTTServerSocket ttts{TTTSInitialize}{connect l}, Socket s{IOPending}{connect l}) { +task ProcessRequest(TTTServerSocket ttts{ReceiveRequest}{connect l}, Socket s{IOPending}{connect l}) { System.printString("Request received..."); int action = ttts.receive(s); if (action == 1) { // Make move - taskexit(ttts {MakeMove}); + taskexit(ttts {!ReceiveRequest,MakeMove}); } else { // Send Error - taskexit(ttts {SendError}); + taskexit(ttts {!ReceiveRequest,SendError}); } } @@ -48,12 +48,19 @@ task ProcessMove(TTTServerSocket ttts{MakeMove}, Board tttBoard{init}) { task SendBoardDisplay(TTTServerSocket ttts{SendBoard}{connect l}, Board tttBoard{init}, Socket s{}{connect l}) { ttts.sendBoardDisplay(tttBoard, s); + taskexit(ttts {/*!SendBoard,*/ ReceiveRequest}); + } task GameOver(TTTServerSocket ttts{SendDone}{connect l}, Board tttBoard{init}, Socket s{}{connect l}) { ttts.sendDone(tttBoard.winner(), s); +// taskexit(ttts {!SendDone},tttBoard{!init}); + } task SendErrorMessage(TTTServerSocket ttts{SendError}{connect l}, Board tttBoard{init}, Socket s{}{connect l}) { + //System.printString("Error\n"); ttts.sendError(s); + taskexit(ttts {/*!SendError,*/ ReceiveRequest}); + } diff --git a/Robust/src/Benchmarks/TTTTag/TTTServerSocket.java b/Robust/src/Benchmarks/TTTTag/TTTServerSocket.java index 4d6b8852..d0bc5bd9 100644 --- a/Robust/src/Benchmarks/TTTTag/TTTServerSocket.java +++ b/Robust/src/Benchmarks/TTTTag/TTTServerSocket.java @@ -1,6 +1,6 @@ public class TTTServerSocket { // TTTServerSocket flags - flag TTTSInitialize; + flag ReceiveRequest; flag MakeMove; flag SendError; @@ -23,21 +23,27 @@ public class TTTServerSocket { System.printString("request: "); System.printString(request); if (parseTransaction() == 1) { + System.printString(request); return 1; } + System.printString("Error receiving...\n"); return 0; } // Parse request public int parseTransaction(){ int start = request.indexOf('_'); + //System.printString("start parse"); String s = request.subString(start+1); + //System.printString("before checking the string"); //_move:3:3 if (s.startsWith("move")==true){ //Get row int i1 = s.indexOf(':'); String rowStr = new String(s.subString(i1+1, i1+2)); row = Integer.parseInt(rowStr); + + //System.printString("row"); //Get col String s2 = new String(s.subString(i1+2)); @@ -46,6 +52,8 @@ public class TTTServerSocket { col = Integer.parseInt(colStr); return 1; + + } // Error transaction return -1; @@ -78,7 +86,7 @@ public class TTTServerSocket { } public void sendDone(int winner, Socket s) { - StringBuffer line1 = new String ("done_"); + StringBuffer line1 = new StringBuffer ("done_"); if (winner == 0) line1.append("tie"); else if (winner == 1) @@ -92,7 +100,7 @@ public class TTTServerSocket { } public void sendError(Socket s) { - StringBuffer line1 = new String ("error_wrongmove"); + StringBuffer line1 = new StringBuffer ("error_wrongmove"); String towrite = new String(line1); s.write(towrite.getBytes()); diff --git a/Robust/src/Interface/WebInterface.java b/Robust/src/Interface/WebInterface.java index eb88d969..2a75467a 100644 --- a/Robust/src/Interface/WebInterface.java +++ b/Robust/src/Interface/WebInterface.java @@ -9,8 +9,10 @@ public class WebInterface { TaskAnalysis taskanalysis; TaskGraph taskgraph; State state; - Hashtable taskmap; + Hashtable flagstatemap; Hashtable taskgraphmap; + Hashtable sourcenodemap; //to hold the filenames for each of the pages linked to the source nodes. + Hashtable taskmap; // to hold the filenames for each of the pages linked to tasks in the program. GarbageAnalysis garbageanalysis; public WebInterface(State state, TaskAnalysis taskanalysis, TaskGraph taskgraph, GarbageAnalysis garbageanalysis) { @@ -19,52 +21,135 @@ public class WebInterface { this.taskgraph=taskgraph; this.garbageanalysis=garbageanalysis; - taskmap=new Hashtable(); + flagstatemap=new Hashtable(); taskgraphmap=new Hashtable(); + taskmap = new Hashtable(); + sourcenodemap=new Hashtable(); + for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();){ + TaskDescriptor td=(TaskDescriptor)it_tasks.next(); + taskmap.put("/"+td.getSymbol()+".html",td); + } + for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) { + ClassDescriptor cd=(ClassDescriptor) it_classes.next(); + Vector rootnodes=taskanalysis.getRootNodes(cd); + if(rootnodes!=null) + for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){ + FlagState root=(FlagState)it_rootnodes.next(); + Vector cd_nodeid=new Vector(); + cd_nodeid.addElement(cd); + cd_nodeid.addElement(root.getLabel()); + sourcenodemap.put("/"+cd.getSymbol()+"_"+root.getLabel()+".html",cd_nodeid); + } + } } public boolean specialRequest(String filename) { System.out.println(filename); if (filename.equals("/index.html")) return true; - if (taskmap.containsKey(filename)) + if (flagstatemap.containsKey(filename)) return true; if (taskgraphmap.containsKey(filename)) return true; + if (taskmap.containsKey(filename)) + return true; + if (sourcenodemap.containsKey(filename)) + return true; return false; } public String handleresponse(String filename, OutputStream out, HTTPResponse resp) { if (filename.equals("/index.html")) return indexpage(out, resp); - if (taskmap.containsKey(filename)) - return flagstate((ClassDescriptor) taskmap.get(filename), out, resp); + if (flagstatemap.containsKey(filename)) + return flagstate((ClassDescriptor) flagstatemap.get(filename), out, resp); if (taskgraphmap.containsKey(filename)) return taskstate((ClassDescriptor) taskgraphmap.get(filename), out, resp); + if (taskmap.containsKey(filename)) + return task((TaskDescriptor)taskmap.get(filename),out,resp); + if (sourcenodemap.containsKey(filename)) + return sourcenode((Vector) sourcenodemap.get(filename), out, resp); return "NORESP"; } + private String task(TaskDescriptor td, OutputStream out, HTTPResponse resp){ + try{ + PrintWriter pw=new PrintWriter(out); + pw.println("

Task:   "+td.toString()+"


"); + printTask(td,pw); + pw.flush(); + } catch (Exception e) {e.printStackTrace();System.exit(-1);} + return null; + } + + private String printTask(TaskDescriptor td, PrintWriter pw){ + try{ + + for(int i=0; i < td.numParameters();i++){ + pw.println("FlagState Graph:  "+td.getParamType(i)+"
"); + pw.println("Task Graph:        " + +td.getParamType(i)+"
"); + } + pw.flush(); + }catch(Exception e) {e.printStackTrace();System.exit(-1);} + return null; + } + + private String sourcenode(Vector cd_nodeid,OutputStream out, HTTPResponse resp){ + Vector rootnodes=taskanalysis.getRootNodes((ClassDescriptor)cd_nodeid.elementAt(0)); + for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){ + FlagState root=(FlagState)it_rootnodes.next(); + if (root.getLabel().equals((String)cd_nodeid.elementAt(1))){ + try{ + PrintWriter pw=new PrintWriter(out); + pw.println("

Allocating tasks for "+root.getTextLabel()+":


"); + Vector tasks=root.getAllocatingTasks(); + for(Iterator it_tasks=tasks.iterator();it_tasks.hasNext();){ + TaskDescriptor td=(TaskDescriptor)it_tasks.next(); + pw.println("
Task:   "+td.toString()+"
"); + printTask(td,pw); + } + + } catch (Exception e) {e.printStackTrace();System.exit(-1);} + break; + } + + } + return null; + } + private String flagstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) { Set objects=taskanalysis.getFlagStates(cd); File file=new File(cd.getSymbol()+".dot"); + File mapfile; + String str; Vector namers=new Vector(); namers.add(new Namer()); namers.add(garbageanalysis); namers.add(new Allocations()); + namers.add(new TaskEdges()); try { //Generate jpg Runtime r=Runtime.getRuntime(); + FileOutputStream dotstream=new FileOutputStream(file,false); FlagState.DOTVisitor.visit(dotstream, objects, namers); dotstream.close(); - Process p=r.exec("dot -Tjpg "+cd.getSymbol()+".dot -o"+cd.getSymbol()+".jpg"); + Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+".map -Tjpg -o"+cd.getSymbol()+".jpg "+cd.getSymbol()+".dot"); p.waitFor(); p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+".ps"); p.waitFor(); + mapfile=new File(cd.getSymbol()+".map"); + BufferedReader mapbr=new BufferedReader(new FileReader(mapfile)); PrintWriter pw=new PrintWriter(out); pw.println("ps
"); - pw.println(""); + //pw.println(""); + pw.println(""); + while((str=mapbr.readLine())!=null){ + pw.println(str); + } + pw.flush(); } catch (Exception e) {e.printStackTrace();System.exit(-1);} return null; @@ -73,34 +158,51 @@ public class WebInterface { private String taskstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) { Set objects=taskgraph.getTaskNodes(cd); File file=new File(cd.getSymbol()+"-t.dot"); + File mapfile; + String str; + Vector namers=new Vector(); + namers.add(new Namer()); + namers.add(new TaskNodeNamer()); + try { //Generate jpg Runtime r=Runtime.getRuntime(); FileOutputStream dotstream=new FileOutputStream(file,false); - FlagState.DOTVisitor.visit(dotstream, objects); + FlagState.DOTVisitor.visit(dotstream, objects,namers); dotstream.close(); - Process p=r.exec("dot -Tjpg "+cd.getSymbol()+"-t.dot -o"+cd.getSymbol()+"-t.jpg"); + Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+"-t.map -Tjpg -o"+cd.getSymbol()+"-t.jpg "+cd.getSymbol()+"-t.dot"); p.waitFor(); p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+"-t.ps"); + p.waitFor(); + mapfile=new File(cd.getSymbol()+"-t.map"); + BufferedReader mapbr=new BufferedReader(new FileReader(mapfile)); PrintWriter pw=new PrintWriter(out); pw.println("ps
"); - pw.println(""); + // pw.println(""); + pw.println(""); + + while((str=mapbr.readLine())!=null){ + pw.println(str); + } pw.flush(); } catch (Exception e) {e.printStackTrace();System.exit(-1);} return null; } - + + /* public void taskgraph( +*/ private String indexpage(OutputStream out, HTTPResponse resp) { + PrintWriter pw=new PrintWriter(out); for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) { ClassDescriptor cd=(ClassDescriptor) it_classes.next(); if (taskanalysis.getFlagStates(cd)!=null) { pw.println(""+ cd.getSymbol() +""); pw.println("
"); - taskmap.put("/"+cd.getSymbol()+".html", cd); + flagstatemap.put("/"+cd.getSymbol()+".html", cd); } if (taskgraph.getTaskNodes(cd)!=null) { pw.println("Task Graph "+ cd.getSymbol() +""); diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index e880f0f6..775891c6 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -112,6 +112,7 @@ public class Main { BuildFlat bf=new BuildFlat(state,tu); bf.buildFlat(); + if (state.TASKSTATE) { CallGraph callgraph=new CallGraph(state); TagAnalysis taganalysis=new TagAnalysis(state, callgraph); @@ -131,6 +132,7 @@ public class Main { + BuildCode bc=new BuildCode(state, bf.getMap(), tu); bc.buildCode(); System.exit(0); diff --git a/Robust/src/Util/GraphNode.java b/Robust/src/Util/GraphNode.java index cbe96016..c4c7ba24 100755 --- a/Robust/src/Util/GraphNode.java +++ b/Robust/src/Util/GraphNode.java @@ -98,6 +98,10 @@ public class GraphNode { public String getTextLabel() { return ""; } + + public String getName(){ + return ""; + } public NodeStatus getStatus() { return this.status; -- 2.34.1