*Added the program flow feature.
[IRC.git] / Robust / src / Interface / WebInterface.java
1 package Interface;
2 import java.io.*;
3 import Analysis.TaskStateAnalysis.*;
4 import IR.*;
5 import java.util.*;
6 import Util.Namer;
7
8 public class WebInterface {
9     TaskAnalysis taskanalysis;
10     TaskGraph taskgraph;
11     State state;
12     Hashtable flagstatemap;
13     Hashtable taskgraphmap;
14     Hashtable sourcenodemap; //to hold the filenames for each of the pages linked to the source nodes.
15     Hashtable taskmap;  // to hold the filenames for each of the pages linked to tasks in the program.
16     GarbageAnalysis garbageanalysis;
17
18     public WebInterface(State state, TaskAnalysis taskanalysis, TaskGraph taskgraph, GarbageAnalysis garbageanalysis) {
19         this.state=state;
20         this.taskanalysis=taskanalysis;
21         this.taskgraph=taskgraph;
22         this.garbageanalysis=garbageanalysis;
23
24         flagstatemap=new Hashtable();
25         taskgraphmap=new Hashtable();
26         taskmap = new Hashtable();
27         sourcenodemap=new Hashtable();
28         
29         for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();){
30                 TaskDescriptor td=(TaskDescriptor)it_tasks.next();
31                 taskmap.put("/"+td.getSymbol()+".html",td);
32         } 
33         
34         for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
35             ClassDescriptor cd=(ClassDescriptor) it_classes.next();
36             if(cd.hasFlags()){
37                 Vector rootnodes=taskanalysis.getRootNodes(cd);
38             
39                 if(rootnodes!=null)
40                 for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){
41                         FlagState root=(FlagState)it_rootnodes.next();
42                                 Vector cd_nodeid=new Vector(); //Vector is designed to contain only 2 elements: ClassDescriptor,Node label
43                                                // Both the values are required to correctly resolve the rootnode.
44                                                // Should think of a better way to do this, instead of using a vector(maybe a class)
45                                 cd_nodeid.addElement(cd);  //adding the ClassDescriptor 
46                                 cd_nodeid.addElement(root.getLabel()); //adding the Node label
47                         sourcenodemap.put("/"+cd.getSymbol()+"_"+root.getLabel()+".html",cd_nodeid);
48                 }
49                 }
50     }
51         }
52     
53     public boolean specialRequest(String filename) {
54         System.out.println(filename);
55         if (filename.equals("/index.html"))
56             return true;
57         if (filename.equals("/UnifiedTaskGraph.html"))
58                 return true;
59         if (flagstatemap.containsKey(filename))
60             return true;
61         if (taskgraphmap.containsKey(filename))
62             return true;
63         if (taskmap.containsKey(filename))
64                 return true;
65         if (sourcenodemap.containsKey(filename))
66                 return true;
67         return false;
68     }
69
70     public String handleresponse(String filename, OutputStream out, HTTPResponse resp) {
71         if (filename.equals("/index.html"))
72             return indexpage(out, resp);
73         if (filename.equals("/UnifiedTaskGraph.html"))
74                 return unifiedTaskGraph(out,resp);
75         if (flagstatemap.containsKey(filename))
76             return flagstate((ClassDescriptor) flagstatemap.get(filename), out, resp);
77         if (taskgraphmap.containsKey(filename))
78             return taskstate((ClassDescriptor) taskgraphmap.get(filename), out, resp);
79         if (taskmap.containsKey(filename))
80             return task((TaskDescriptor)taskmap.get(filename),out,resp);
81         if (sourcenodemap.containsKey(filename))
82             return sourcenode((Vector) sourcenodemap.get(filename), out, resp);
83         return "NORESP";
84     }
85
86     private String task(TaskDescriptor td, OutputStream out, HTTPResponse resp){
87         try{
88         PrintWriter pw=new PrintWriter(out);
89         pw.println("<br><br><h3>Task:&nbsp;&nbsp;&nbsp;"+td.toString()+"</h3><br>");
90         printTask(td,pw);
91         pw.flush();
92         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
93         return null;
94     }
95
96     private String printTask(TaskDescriptor td, PrintWriter pw){
97         try{
98
99                 for(int i=0; i < td.numParameters();i++){
100                         pw.println("FlagState Graph:&nbsp;&nbsp;<a href=\"/"+td.getParamType(i)+".html\">"+td.getParamType(i)+"</a><br>");
101                         pw.println("Task Graph:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/"+td.getParamType(i)+"-t.html\">"
102                                 +td.getParamType(i)+"</a><br>");
103                 }                       
104                 pw.flush();
105         }catch(Exception e) {e.printStackTrace();System.exit(-1);}
106         return null;
107    }
108
109     private String sourcenode(Vector cd_nodeid,OutputStream out, HTTPResponse resp){
110         Vector rootnodes=taskanalysis.getRootNodes((ClassDescriptor)cd_nodeid.elementAt(0));
111         for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){
112                 FlagState root=(FlagState)it_rootnodes.next();
113                 if (root.getLabel().equals((String)cd_nodeid.elementAt(1))){
114                 try{
115                         PrintWriter pw=new PrintWriter(out);
116                         pw.println("<br><br><h3>Allocating tasks for "+root.getTextLabel()+":</h3><br>");
117                         Vector tasks=root.getAllocatingTasks();
118                         for(Iterator it_tasks=tasks.iterator();it_tasks.hasNext();){
119                                 TaskDescriptor td=(TaskDescriptor)it_tasks.next();
120                                 pw.println("<br><strong>Task:&nbsp;&nbsp;&nbsp;"+td.toString()+"</strong><br>");
121                                 printTask(td,pw);
122                         }
123                 
124                 } catch (Exception e) {e.printStackTrace();System.exit(-1);}
125                 break;
126                 }
127                 
128         }
129         return null;
130    }
131
132     private String flagstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) {
133         Set objects=taskanalysis.getFlagStates(cd);
134         File file=new File(cd.getSymbol()+".dot");
135         File mapfile;
136         String str;
137         Vector namers=new Vector();
138         namers.add(new Namer());
139         namers.add(garbageanalysis);
140         namers.add(new Allocations());
141         namers.add(new TaskEdges());
142         try {
143             //Generate jpg
144             Runtime r=Runtime.getRuntime();
145
146             FileOutputStream dotstream=new FileOutputStream(file,false);
147             FlagState.DOTVisitor.visit(dotstream, objects, namers);
148             dotstream.close();
149             Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+".map -Tjpg -o"+cd.getSymbol()+".jpg "+cd.getSymbol()+".dot");
150             p.waitFor();
151             p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+".ps");
152             p.waitFor();
153
154             mapfile=new File(cd.getSymbol()+".map");
155             BufferedReader mapbr=new BufferedReader(new FileReader(mapfile));
156             PrintWriter pw=new PrintWriter(out);
157             pw.println("<a href=\"/"+ cd.getSymbol()+".ps\">ps</a><br>");
158             //pw.println("<a href=\"/"+ cd.getSymbol()+".map\"><img src=\"/"+ cd.getSymbol()+".gif\" ismap=\"ismap\"></A>");
159             pw.println("<img src=\""+cd.getSymbol()+".jpg\" usemap=\"#dotvisitor\" />");
160             while((str=mapbr.readLine())!=null){
161                 pw.println(str);
162             }
163             
164             pw.flush();
165         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
166         return null;
167     }
168
169     private String taskstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) {
170         Set objects=taskgraph.getTaskNodes(cd);
171         File file=new File(cd.getSymbol()+"-t.dot");
172         File mapfile;
173         String str;
174         Vector namers=new Vector();
175         namers.add(new Namer());
176         namers.add(new TaskNodeNamer());
177
178         try {
179             //Generate jpg
180             Runtime r=Runtime.getRuntime();
181             FileOutputStream dotstream=new FileOutputStream(file,false);
182             FlagState.DOTVisitor.visit(dotstream, objects,namers);
183             dotstream.close();
184             Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+"-t.map -Tjpg -o"+cd.getSymbol()+"-t.jpg "+cd.getSymbol()+"-t.dot");
185             p.waitFor();
186             p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+"-t.ps");
187             
188             p.waitFor();
189
190             mapfile=new File(cd.getSymbol()+"-t.map");
191             BufferedReader mapbr=new BufferedReader(new FileReader(mapfile));
192             PrintWriter pw=new PrintWriter(out);
193             pw.println("<a href=\"/"+ cd.getSymbol()+"-t.ps\">ps</a><br>");
194            // pw.println("<a href=\"/"+ cd.getSymbol()+"-t.map\"><img src=\"/"+ cd.getSymbol()+"-t.gif\" ismap=\"ismap\"></A>");
195             pw.println("<img src=\""+cd.getSymbol()+"-t.jpg\" usemap=\"#dotvisitor\" />");
196
197             while((str=mapbr.readLine())!=null){
198                 pw.println(str);
199             }
200             pw.flush();
201         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
202         return null;
203     }
204     
205    /* public void taskgraph(
206 */
207
208     private String indexpage(OutputStream out, HTTPResponse resp) {
209
210         PrintWriter pw=new PrintWriter(out);
211         for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
212             ClassDescriptor cd=(ClassDescriptor) it_classes.next();
213             if (taskanalysis.getFlagStates(cd)!=null) {
214                 pw.println("<a href=\""+cd.getSymbol()+".html\">"+ cd.getSymbol() +"</a>");
215                 pw.println("<br>");
216                 flagstatemap.put("/"+cd.getSymbol()+".html", cd);
217             }
218             if (taskgraph.getTaskNodes(cd)!=null) {
219                 pw.println("<a href=\""+cd.getSymbol()+"-t.html\">Task Graph "+ cd.getSymbol() +"</a>");
220                 pw.println("<br>");
221                 taskgraphmap.put("/"+cd.getSymbol()+"-t.html", cd);
222             }
223         }
224         pw.println("<br><br><a href=\"/UnifiedTaskGraph.html\">Program flow</a>");
225         pw.flush();
226         return null;
227     }
228     
229     private String unifiedTaskGraph(OutputStream out, HTTPResponse resp){
230         Set objects=taskgraph.getAllTaskNodes();
231         File file=new File("UnifiedTaskGraph.dot");
232         /*File mapfile;
233         String str;
234         Vector namers=new Vector();
235         namers.add(new Namer());
236         namers.add(new TaskNodeNamer());
237 */
238         try {
239             //Generate jpg
240             Runtime r=Runtime.getRuntime();
241             FileOutputStream dotstream=new FileOutputStream(file,false);
242             FlagState.DOTVisitor.visit(dotstream, objects);
243             dotstream.close();
244             Process p=r.exec("dot -Tjpg -oUnifiedTaskGraph.jpg UnifiedTaskGraph.dot");
245             p.waitFor();
246             p=r.exec("dot -Tps UnifiedTaskGraph.dot -oUnifiedTaskGraph.ps");
247             
248             p.waitFor();
249
250             PrintWriter pw=new PrintWriter(out);
251             pw.println("<a href=\"/UnifiedTaskGraph.ps\">ps</a><br>");
252            // pw.println("<a href=\"/"+ cd.getSymbol()+"-t.map\"><img src=\"/"+ cd.getSymbol()+"-t.gif\" ismap=\"ismap\"></A>");
253             pw.println("<img src=\"/UnifiedTaskGraph.jpg\" />");
254             
255             pw.flush();
256         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
257         return null;
258     }
259
260 }