TaskGraph functionality shouldn't be part of TaskAnalysis
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskGraph.java
1 package Analysis.TaskStateAnalysis;
2 import java.util.*;
3 import IR.State;
4 import IR.SymbolTable;
5 import IR.ClassDescriptor;
6 import java.io.File;
7 import java.io.FileWriter;
8 import java.io.FileOutputStream;
9
10 public class TaskGraph {
11     TaskAnalysis taskanalysis;
12     State state;
13     Hashtable cdtonodes;
14
15     public TaskGraph(State state, TaskAnalysis taskanalysis) {
16         this.state=state;
17         this.taskanalysis=taskanalysis;
18         this.cdtonodes=new Hashtable();
19
20         for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
21             ClassDescriptor cd=(ClassDescriptor) classit.next();
22             produceTaskNodes(cd);
23         }
24     }
25     
26     
27     public void createDOTfiles() {
28         for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
29             ClassDescriptor cd=(ClassDescriptor) classit.next();
30             Set tasknodes=getTaskNodes(cd);
31             if (tasknodes!=null) {
32                 try {
33                     File dotfile_tasknodes=new File("graph"+cd.getSymbol()+"_task.dot");
34                     FileOutputStream dotstream=new FileOutputStream(dotfile_tasknodes,true);
35                     TaskNode.DOTVisitor.visit(dotstream,tasknodes);
36                 } catch(Exception e) {
37                     e.printStackTrace();
38                     throw new Error();
39                 }
40             }
41         }
42     }
43
44     /** Returns the set of TaskNodes for the class descriptor cd */
45
46     public Set getTaskNodes(ClassDescriptor cd) {
47         if (cdtonodes.containsKey(cd))
48             return ((Hashtable)cdtonodes.get(cd)).keySet();
49         else
50             return null;
51     }
52
53     private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){
54         if (nodes.containsKey(node))
55             return (TaskNode)nodes.get(node);
56         else{
57             nodes.put(node,node);
58             return (TaskNode)node;
59         }
60     }
61     
62     private void produceTaskNodes(ClassDescriptor cd) {
63         Set fsnodes=taskanalysis.getFlagStates(cd);
64         if (fsnodes==null)
65             return;
66
67         Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
68         cdtonodes.put(cd, tasknodes);
69
70         for(Iterator it=fsnodes.iterator();it.hasNext();) {
71             FlagState fs=(FlagState)it.next();
72             
73             Iterator it_inedges=fs.inedges();   
74             TaskNode tn;
75             do {
76                 if (!fs.inedges().hasNext()){
77                     tn=new TaskNode("Start Node");
78                 } else {
79                     FEdge inedge=(FEdge)it_inedges.next();
80                     tn=new TaskNode(inedge.getLabel());
81                 }
82                 if(fs.edges().hasNext()){
83                     tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
84                     for (Iterator it_edges=fs.edges();it_edges.hasNext();){
85                         TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
86                         target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
87                         tn.addEdge(new TEdge(target));
88                     }
89                 }
90             } while(it_inedges.hasNext());
91         }
92     }
93     
94 }