*Fixed the problem with double lined nodes. (It was due to incorrect
[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                                 System.out.println(cd+" "+root.getLabel());
48                         sourcenodemap.put("/"+cd.getSymbol()+"_"+root.getLabel()+".html",cd_nodeid);
49                 }
50                 }
51     }
52         }
53     
54     public boolean specialRequest(String filename) {
55         System.out.println(filename);
56         if (filename.equals("/index.html"))
57             return true;
58         if (filename.equals("/UnifiedTaskGraph.html"))
59                 return true;
60         if (flagstatemap.containsKey(filename))
61             return true;
62         if (taskgraphmap.containsKey(filename))
63             return true;
64         if (taskmap.containsKey(filename))
65                 return true;
66         if (sourcenodemap.containsKey(filename))
67                 return true;
68         return false;
69     }
70
71     public String handleresponse(String filename, OutputStream out, HTTPResponse resp) {
72         if (filename.equals("/index.html"))
73             return indexpage(out, resp);
74         if (filename.equals("/UnifiedTaskGraph.html"))
75                 return unifiedTaskGraph(out,resp);
76         if (flagstatemap.containsKey(filename))
77             return flagstate((ClassDescriptor) flagstatemap.get(filename), out, resp);
78         if (taskgraphmap.containsKey(filename))
79             return taskstate((ClassDescriptor) taskgraphmap.get(filename), out, resp);
80         if (taskmap.containsKey(filename))
81             return task((TaskDescriptor)taskmap.get(filename),out,resp);
82         if (sourcenodemap.containsKey(filename))
83             return sourcenode((Vector) sourcenodemap.get(filename), out, resp);
84         return "NORESP";
85     }
86
87     private String task(TaskDescriptor td, OutputStream out, HTTPResponse resp){
88         try{
89         PrintWriter pw=new PrintWriter(out);
90         pw.println("<br><br><h3>Task:&nbsp;&nbsp;&nbsp;"+td.toString()+"</h3><br>");
91         printTask(td,pw);
92         pw.flush();
93         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
94         return null;
95     }
96
97     private String printTask(TaskDescriptor td, PrintWriter pw){
98         try{
99
100                 for(int i=0; i < td.numParameters();i++){
101                         pw.println("FlagState Graph:&nbsp;&nbsp;<a href=\"/"+td.getParamType(i)+".html\">"+td.getParamType(i)+"</a><br>");
102                         pw.println("Task Graph:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"/"+td.getParamType(i)+"-t.html\">"
103                                 +td.getParamType(i)+"</a><br>");
104                 }                       
105                 pw.flush();
106         }catch(Exception e) {e.printStackTrace();System.exit(-1);}
107         return null;
108    }
109
110     private String sourcenode(Vector cd_nodeid,OutputStream out, HTTPResponse resp){
111         Vector rootnodes=taskanalysis.getRootNodes((ClassDescriptor)cd_nodeid.elementAt(0));
112         for(Iterator it_rootnodes=rootnodes.iterator();it_rootnodes.hasNext();){
113                 FlagState root=(FlagState)it_rootnodes.next();
114                 if (root.getLabel().equals((String)cd_nodeid.elementAt(1))){
115                 try{
116                         PrintWriter pw=new PrintWriter(out);
117                         pw.println("<br><br><h3>Allocating tasks for "+root.getTextLabel()+":</h3><br>");
118                         Vector tasks=root.getAllocatingTasks();
119                         for(Iterator it_tasks=tasks.iterator();it_tasks.hasNext();){
120                                 TaskDescriptor td=(TaskDescriptor)it_tasks.next();
121                                 pw.println("<br><strong>Task:&nbsp;&nbsp;&nbsp;"+td.toString()+"</strong><br>");
122                                 printTask(td,pw);
123                         }
124                 
125                 } catch (Exception e) {e.printStackTrace();System.exit(-1);}
126                 break;
127                 }
128                 
129         }
130         return null;
131    }
132
133     private String flagstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) {
134         Set objects=taskanalysis.getFlagStates(cd);
135         File file=new File(cd.getSymbol()+".dot");
136         File mapfile;
137         String str;
138         Vector namers=new Vector();
139         namers.add(new Namer());
140         namers.add(garbageanalysis);
141         namers.add(new Allocations());
142         namers.add(new TaskEdges());
143         try {
144             //Generate jpg
145             Runtime r=Runtime.getRuntime();
146
147             FileOutputStream dotstream=new FileOutputStream(file,false);
148             FlagState.DOTVisitor.visit(dotstream, objects, namers);
149             dotstream.close();
150             Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+".map -Tjpg -o"+cd.getSymbol()+".jpg "+cd.getSymbol()+".dot");
151             p.waitFor();
152             p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+".ps");
153             p.waitFor();
154
155             mapfile=new File(cd.getSymbol()+".map");
156             BufferedReader mapbr=new BufferedReader(new FileReader(mapfile));
157             PrintWriter pw=new PrintWriter(out);
158             pw.println("<a href=\"/"+ cd.getSymbol()+".ps\">ps</a><br>");
159             //pw.println("<a href=\"/"+ cd.getSymbol()+".map\"><img src=\"/"+ cd.getSymbol()+".gif\" ismap=\"ismap\"></A>");
160             pw.println("<img src=\""+cd.getSymbol()+".jpg\" usemap=\"#dotvisitor\" />");
161             while((str=mapbr.readLine())!=null){
162                 pw.println(str);
163             }
164             
165             pw.flush();
166         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
167         return null;
168     }
169
170     private String taskstate(ClassDescriptor cd, OutputStream out, HTTPResponse resp) {
171         Set objects=taskgraph.getTaskNodes(cd);
172         File file=new File(cd.getSymbol()+"-t.dot");
173         File mapfile;
174         String str;
175         Vector namers=new Vector();
176         namers.add(new Namer());
177         namers.add(new TaskNodeNamer());
178
179         try {
180             //Generate jpg
181             Runtime r=Runtime.getRuntime();
182             FileOutputStream dotstream=new FileOutputStream(file,false);
183             FlagState.DOTVisitor.visit(dotstream, objects,namers);
184             dotstream.close();
185             Process p=r.exec("dot -Tcmapx -o"+cd.getSymbol()+"-t.map -Tjpg -o"+cd.getSymbol()+"-t.jpg "+cd.getSymbol()+"-t.dot");
186             p.waitFor();
187             p=r.exec("dot -Tps "+cd.getSymbol()+".dot -o"+cd.getSymbol()+"-t.ps");
188             
189             p.waitFor();
190
191             mapfile=new File(cd.getSymbol()+"-t.map");
192             BufferedReader mapbr=new BufferedReader(new FileReader(mapfile));
193             PrintWriter pw=new PrintWriter(out);
194             pw.println("<a href=\"/"+ cd.getSymbol()+"-t.ps\">ps</a><br>");
195            // pw.println("<a href=\"/"+ cd.getSymbol()+"-t.map\"><img src=\"/"+ cd.getSymbol()+"-t.gif\" ismap=\"ismap\"></A>");
196             pw.println("<img src=\""+cd.getSymbol()+"-t.jpg\" usemap=\"#dotvisitor\" />");
197
198             while((str=mapbr.readLine())!=null){
199                 pw.println(str);
200             }
201             pw.flush();
202         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
203         return null;
204     }
205     
206    /* public void taskgraph(
207 */
208
209     private String indexpage(OutputStream out, HTTPResponse resp) {
210
211         PrintWriter pw=new PrintWriter(out);
212         for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
213             ClassDescriptor cd=(ClassDescriptor) it_classes.next();
214             if (taskanalysis.getFlagStates(cd)!=null) {
215                 pw.println("<a href=\""+cd.getSymbol()+".html\">"+ cd.getSymbol() +"</a>");
216                 pw.println("<br>");
217                 flagstatemap.put("/"+cd.getSymbol()+".html", cd);
218             }
219             if (taskgraph.getTaskNodes(cd)!=null) {
220                 pw.println("<a href=\""+cd.getSymbol()+"-t.html\">Task Graph "+ cd.getSymbol() +"</a>");
221                 pw.println("<br>");
222                 taskgraphmap.put("/"+cd.getSymbol()+"-t.html", cd);
223             }
224         }
225         pw.println("<br><br><a href=\"/UnifiedTaskGraph.html\">Program flow</a>");
226         pw.flush();
227         return null;
228     }
229     
230     private String unifiedTaskGraph(OutputStream out, HTTPResponse resp){
231         Set objects=taskgraph.getAllTaskNodes();
232         File file=new File("UnifiedTaskGraph.dot");
233         /*File mapfile;
234         String str;
235         Vector namers=new Vector();
236         namers.add(new Namer());
237         namers.add(new TaskNodeNamer());
238 */
239         try {
240             //Generate jpg
241             Runtime r=Runtime.getRuntime();
242             FileOutputStream dotstream=new FileOutputStream(file,false);
243             FlagState.DOTVisitor.visit(dotstream, objects);
244             dotstream.close();
245             Process p=r.exec("dot -Tjpg -oUnifiedTaskGraph.jpg UnifiedTaskGraph.dot");
246             p.waitFor();
247             p=r.exec("dot -Tps UnifiedTaskGraph.dot -oUnifiedTaskGraph.ps");
248             
249             p.waitFor();
250
251             PrintWriter pw=new PrintWriter(out);
252             pw.println("<a href=\"/UnifiedTaskGraph.ps\">ps</a><br>");
253            // pw.println("<a href=\"/"+ cd.getSymbol()+"-t.map\"><img src=\"/"+ cd.getSymbol()+"-t.gif\" ismap=\"ismap\"></A>");
254             pw.println("<img src=\"/UnifiedTaskGraph.jpg\" />");
255             
256             pw.flush();
257         } catch (Exception e) {e.printStackTrace();System.exit(-1);}
258         return null;
259     }
260
261 }