*Fixed duplicate edges in TaskGraph
[IRC.git] / Robust / src / Analysis / TaskStateAnalysis / TaskGraph.java
index 224738c0d4bdda371109c0ed2aab867cea401a55..00b31dc07259319366acba057e43b53fa44b8f49 100644 (file)
@@ -19,14 +19,15 @@ public class TaskGraph {
 
        for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
            ClassDescriptor cd=(ClassDescriptor) classit.next();
-           produceTaskNodes(cd);
+           if (cd.hasFlags())
+               produceTaskNodes(cd);
        }
     }
     
     
     public void createDOTfiles() {
-       for(Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();classit.hasNext();) {
-           ClassDescriptor cd=(ClassDescriptor) classit.next();
+       for(Iterator it_classes=(Iterator)cdtonodes.keys();it_classes.hasNext();) {
+           ClassDescriptor cd=(ClassDescriptor) it_classes.next();
            Set tasknodes=getTaskNodes(cd);
            if (tasknodes!=null) {
                try {
@@ -63,32 +64,45 @@ public class TaskGraph {
        Set fsnodes=taskanalysis.getFlagStates(cd);
        if (fsnodes==null)
            return;
-
+           
        Hashtable<TaskNode,TaskNode> tasknodes=new Hashtable<TaskNode,TaskNode>();
        cdtonodes.put(cd, tasknodes);
 
        for(Iterator it=fsnodes.iterator();it.hasNext();) {
            FlagState fs=(FlagState)it.next();
-           
            Iterator it_inedges=fs.inedges();   
-           TaskNode tn;
-           do {
-               if (!fs.inedges().hasNext()){
-                   tn=new TaskNode("Start Node");
-               } else {
+           TaskNode tn,sn;
+          
+               if (fs.isSourceNode()) {
+                       sn=new TaskNode("Start Node");
+                       if(fs.edges().hasNext()){
+                                addEdges(fs,sn);
+                       }       
+               }
+                                               
+               while(it_inedges.hasNext()){   
+                       
                    FEdge inedge=(FEdge)it_inedges.next();
                    tn=new TaskNode(inedge.getLabel());
-               }
-               if(fs.edges().hasNext()){
-                   tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
-                   for (Iterator it_edges=fs.edges();it_edges.hasNext();){
-                       TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
-                       target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
-                       tn.addEdge(new TEdge(target));
-                   }
-               }
-           } while(it_inedges.hasNext());
+                   if(fs.edges().hasNext()){
+                       addEdges(fs,tn);
+                       }
+           }  
        }
     }
     
+    private void addEdges(FlagState fs, TaskNode tn){
+           
+           Hashtable<TaskNode,TaskNode> tasknodes=(Hashtable<TaskNode,TaskNode>)cdtonodes.get(fs.getClassDescriptor());
+           tn=(TaskNode)canonicalizeTaskNode(tasknodes, tn);
+               for (Iterator it_edges=fs.edges();it_edges.hasNext();){
+                       TaskNode target=new TaskNode(((FEdge)it_edges.next()).getLabel());
+                       target=(TaskNode)canonicalizeTaskNode(tasknodes,target);
+
+                       TEdge newedge=new TEdge(target);
+                       if (! tn.edgeExists(newedge))
+                               tn.addEdge(new TEdge(target));
+           }
+
+       }
 }