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;
15 public TaskGraph(State state, TaskAnalysis taskanalysis) {
17 this.taskanalysis=taskanalysis;
18 this.cdtonodes=new Hashtable();
20 for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
21 ClassDescriptor cd=(ClassDescriptor) classit.next();
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) {
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) {
45 /** Returns the set of TaskNodes for the class descriptor cd */
47 public Set getTaskNodes(ClassDescriptor cd) {
48 if (cdtonodes.containsKey(cd))
49 return ((Hashtable)cdtonodes.get(cd)).keySet();
54 private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){
55 if (nodes.containsKey(node))
56 return (TaskNode)nodes.get(node);
59 return (TaskNode)node;
63 private void produceTaskNodes(ClassDescriptor cd) {
64 Set fsnodes=taskanalysis.getFlagStates(cd);
68 Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
69 cdtonodes.put(cd, tasknodes);
71 for(Iterator it=fsnodes.iterator();it.hasNext();) {
72 FlagState fs=(FlagState)it.next();
73 Iterator it_inedges=fs.inedges();
76 if (fs.isSourceNode()) {
77 sn=new TaskNode("Start Node");
78 if(fs.edges().hasNext()){
83 while(it_inedges.hasNext()){
85 FEdge inedge=(FEdge)it_inedges.next();
86 tn=new TaskNode(inedge.getLabel());
87 if(fs.edges().hasNext()){
94 private void addEdges(FlagState fs, TaskNode tn){
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);
102 TEdge newedge=new TEdge(target);
103 if (! tn.edgeExists(newedge))
104 tn.addEdge(new TEdge(target));