1 package Analysis.TaskStateAnalysis;
5 import IR.ClassDescriptor;
7 import java.io.FileWriter;
8 import java.io.FileOutputStream;
10 public class TaskGraph {
11 TaskAnalysis taskanalysis;
16 public TaskGraph(State state, TaskAnalysis taskanalysis) {
18 this.taskanalysis=taskanalysis;
19 this.cdtonodes=new Hashtable();
21 for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
22 ClassDescriptor cd=(ClassDescriptor) classit.next();
29 public void createDOTfiles() {
30 for(Iterator it_classes=(Iterator)cdtonodes.keys();it_classes.hasNext();) {
31 ClassDescriptor cd=(ClassDescriptor) it_classes.next();
32 Set tasknodes=getTaskNodes(cd);
33 if (tasknodes!=null) {
35 File dotfile_tasknodes=new File("graph"+cd.getSymbol()+"_task.dot");
36 FileOutputStream dotstream=new FileOutputStream(dotfile_tasknodes,true);
37 TaskNode.DOTVisitor.visit(dotstream,tasknodes);
38 } catch(Exception e) {
46 /** Returns the set of TaskNodes for the class descriptor cd */
48 public Set getTaskNodes(ClassDescriptor cd) {
49 if (cdtonodes.containsKey(cd))
50 return ((Hashtable)cdtonodes.get(cd)).keySet();
55 private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){
56 if (nodes.containsKey(node))
57 return (TaskNode)nodes.get(node);
60 return (TaskNode)node;
64 private void produceTaskNodes(ClassDescriptor cd) {
65 Set fsnodes=taskanalysis.getFlagStates(cd);
69 Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
70 cdtonodes.put(cd, tasknodes);
72 for(Iterator it=fsnodes.iterator();it.hasNext();) {
73 FlagState fs=(FlagState)it.next();
74 Iterator it_inedges=fs.inedges();
77 if (fs.isSourceNode()) {
78 sn=new TaskNode("Start Node");
79 if(fs.edges().hasNext()){
84 while(it_inedges.hasNext()){
86 FEdge inedge=(FEdge)it_inedges.next();
87 tn=new TaskNode(inedge.getLabel());
88 if(fs.edges().hasNext()){
95 /* private void mergeAllNodes(){
96 Hashtable alltasks=new Hashtable();
97 for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
98 ClassDescriptor cd=(ClassDescriptor) classit.next();
99 Set tnodes=((Hashtable)cdtonodes.get(cd)).keyset();
100 while (it_tnodes=tnodes.iterator();it_nodes.hasNext()){
101 TaskNode tn=it_nodes.next();
102 if (alltasks.containsKey(tn)){
114 private void addEdges(FlagState fs, TaskNode tn){
116 Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
117 tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
118 for (Iterator it_edges=fs.edges();it_edges.hasNext();){
119 TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
120 target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
122 TEdge newedge=new TEdge(target);
123 if (! tn.edgeExists(newedge))
124 tn.addEdge(new TEdge(target));