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();
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) {
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) {
44 /** Returns the set of TaskNodes for the class descriptor cd */
46 public Set getTaskNodes(ClassDescriptor cd) {
47 if (cdtonodes.containsKey(cd))
48 return ((Hashtable)cdtonodes.get(cd)).keySet();
53 private TaskNode canonicalizeTaskNode(Hashtable nodes, TaskNode node){
54 if (nodes.containsKey(node))
55 return (TaskNode)nodes.get(node);
58 return (TaskNode)node;
62 private void produceTaskNodes(ClassDescriptor cd) {
63 Set fsnodes=taskanalysis.getFlagStates(cd);
67 Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
68 cdtonodes.put(cd, tasknodes);
70 for(Iterator it=fsnodes.iterator();it.hasNext();) {
71 FlagState fs=(FlagState)it.next();
73 Iterator it_inedges=fs.inedges();
76 if (!fs.inedges().hasNext()){
77 tn=new TaskNode("Start Node");
79 FEdge inedge=(FEdge)it_inedges.next();
80 tn=new TaskNode(inedge.getLabel());
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));
90 } while(it_inedges.hasNext());