*Fixed duplicate edges in TaskGraph
[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             if (cd.hasFlags())
23                 produceTaskNodes(cd);
24         }
25     }
26     
27     
28     public void createDOTfiles() {
29         for(Iterator it_classes=(Iterator)cdtonodes.keys();it_classes.hasNext();) {
30             ClassDescriptor cd=(ClassDescriptor) it_classes.next();
31             Set tasknodes=getTaskNodes(cd);
32             if (tasknodes!=null) {
33                 try {
34                     File dotfile_tasknodes=new File("graph"+cd.getSymbol()+"_task.dot");
35                     FileOutputStream dotstream=new FileOutputStream(dotfile_tasknodes,true);
36                     TaskNode.DOTVisitor.visit(dotstream,tasknodes);
37                 } catch(Exception e) {
38                     e.printStackTrace();
39                     throw new Error();
40                 }
41             }
42         }
43     }
44
45     /** Returns the set of TaskNodes for the class descriptor cd */
46
47     public Set getTaskNodes(ClassDescriptor cd) {
48         if (cdtonodes.containsKey(cd))
49             return ((Hashtable)cdtonodes.get(cd)).keySet();
50         else
51             return null;
52     }
53
54     private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){
55         if (nodes.containsKey(node))
56             return (TaskNode)nodes.get(node);
57         else{
58             nodes.put(node,node);
59             return (TaskNode)node;
60         }
61     }
62     
63     private void produceTaskNodes(ClassDescriptor cd) {
64         Set fsnodes=taskanalysis.getFlagStates(cd);
65         if (fsnodes==null)
66             return;
67             
68         Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
69         cdtonodes.put(cd, tasknodes);
70
71         for(Iterator it=fsnodes.iterator();it.hasNext();) {
72             FlagState fs=(FlagState)it.next();
73             Iterator it_inedges=fs.inedges();   
74             TaskNode tn,sn;
75            
76                 if (fs.isSourceNode()) {
77                         sn=new TaskNode("Start Node");
78                         if(fs.edges().hasNext()){
79                                  addEdges(fs,sn);
80                         }       
81                 }
82                                                 
83                 while(it_inedges.hasNext()){   
84                         
85                     FEdge inedge=(FEdge)it_inedges.next();
86                     tn=new TaskNode(inedge.getLabel());
87                     if(fs.edges().hasNext()){
88                         addEdges(fs,tn);
89                         }
90             }  
91         }
92     }
93     
94     private void addEdges(FlagState fs, TaskNode tn){
95             
96             Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
97             tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
98                 for (Iterator it_edges=fs.edges();it_edges.hasNext();){
99                         TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
100                         target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
101
102                         TEdge newedge=new TEdge(target);
103                         if (! tn.edgeExists(newedge))
104                                 tn.addEdge(new TEdge(target));
105             }
106
107         }
108 }