X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=blobdiff_plain;f=Robust%2Fsrc%2FAnalysis%2FSSJava%2FHierarchyGraph.java;h=852206af43b0a4377b7f3a40e10666dd82b6c05a;hp=52eb8742a150357e3a6f5d39b740ab8bf2739ebf;hb=ec795f9b357096a8a74b539b3a3057b325bfa7f3;hpb=b1709554ba9722b714ff6e8f83d60943fc1fa1d8 diff --git a/Robust/src/Analysis/SSJava/HierarchyGraph.java b/Robust/src/Analysis/SSJava/HierarchyGraph.java index 52eb8742..852206af 100644 --- a/Robust/src/Analysis/SSJava/HierarchyGraph.java +++ b/Robust/src/Analysis/SSJava/HierarchyGraph.java @@ -17,14 +17,22 @@ public class HierarchyGraph { Descriptor desc; String name; - Map mapDescToHNode; - Map> mapHNodeToDescSet; + + // graph structure Map> mapHNodeToIncomingSet; Map> mapHNodeToOutgoingSet; + + Map mapDescToHNode; + Map> mapHNodeToDescSet; + Map mapHNodeToCurrentHNode; // tracking which node corresponds to the initial node + Map> mapMergeNodetoMergingSet; + + // data structures for a combination node Map, HNode> mapSkeletonNodeSetToCombinationNode; Map> mapCombinationNodeToCombineNodeSet; Map, HNode> mapCombineNodeSetToCombinationNode; Map, Set> mapCombineNodeSetToOutgoingNodeSet; + Map mapHNodeToLocationName; Set nodeSet; @@ -51,6 +59,9 @@ public class HierarchyGraph { mapHNodeToBasis = new HashMap>(); mapHNodeToLocationName = new HashMap(); + mapMergeNodetoMergingSet = new HashMap>(); + + mapHNodeToCurrentHNode = new HashMap(); } @@ -92,6 +103,14 @@ public class HierarchyGraph { mapHNodeToDescSet.putAll(map); } + public Map getMapHNodeToCurrentHNode() { + return mapHNodeToCurrentHNode; + } + + public void setMapHNodeToCurrentHNode(Map mapHNodeToCurrentHNode) { + this.mapHNodeToCurrentHNode = mapHNodeToCurrentHNode; + } + public Map getMapDescToHNode() { return mapDescToHNode; } @@ -121,8 +140,10 @@ public class HierarchyGraph { if (possibleCycleSet.size() == 1) { if (dstHNode.isSharedNode()) { // it has already been assigned shared node. - return; + } else { + dstHNode.setSharedNode(true); } + return; } HNode newMergeNode = mergeNodes(possibleCycleSet, false); @@ -165,6 +186,16 @@ public class HierarchyGraph { return mapDescToHNode.get(d); } + public HNode getHNode(String name) { + for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) { + HNode node = (HNode) iterator.next(); + if (node.getName().equals(name)) { + return node; + } + } + return null; + } + private void mappingDescriptorToHNode(Descriptor desc, HNode node) { mapDescToHNode.put(desc, node); if (!mapHNodeToDescSet.containsKey(node)) { @@ -196,6 +227,8 @@ public class HierarchyGraph { skeletonGraph.setMapDescToHNode(getMapDescToHNode()); skeletonGraph.setMapHNodeToDescSet(getMapHNodeToDescSet()); + skeletonGraph.setMapHNodetoMergeSet(getMapHNodetoMergeSet()); + skeletonGraph.setMapHNodeToCurrentHNode(getMapHNodeToCurrentHNode()); return skeletonGraph; @@ -259,7 +292,7 @@ public class HierarchyGraph { } while (isUpdated); } - private Set getIncomingNodeSet(HNode node) { + public Set getIncomingNodeSet(HNode node) { if (!mapHNodeToIncomingSet.containsKey(node)) { mapHNodeToIncomingSet.put(node, new HashSet()); } @@ -334,12 +367,15 @@ public class HierarchyGraph { } String nodeName; + boolean isMergeNode = false; if (onlyCombinationNodes) { nodeName = "Comb" + (seed++); } else { nodeName = "Node" + (seed++); + isMergeNode = true; } HNode newMergeNode = new HNode(nodeName); + newMergeNode.setMergeNode(isMergeNode); nodeSet.add(newMergeNode); nodeSet.removeAll(set); @@ -384,10 +420,56 @@ public class HierarchyGraph { } } + Set mergedSkeletonNode = new HashSet(); + for (Iterator iter = set.iterator(); iter.hasNext();) { + HNode merged = iter.next(); + if (merged.isSkeleton()) { + mergedSkeletonNode.add(merged); + } + } + mapMergeNodetoMergingSet.put(newMergeNode, mergedSkeletonNode); + for (Iterator iterator = mergedSkeletonNode.iterator(); iterator.hasNext();) { + HNode mergedNode = (HNode) iterator.next(); + addMapHNodeToCurrentHNode(mergedNode, newMergeNode); + } + System.out.println("###MERGING NODE=" + set + " new node=" + newMergeNode); return newMergeNode; } + private void addMapHNodeToCurrentHNode(HNode curNode, HNode newNode) { + if (curNode.isMergeNode()) { + Set mergingSet = getMergingSet(curNode); + for (Iterator iterator = mergingSet.iterator(); iterator.hasNext();) { + HNode mergingNode = (HNode) iterator.next(); + mapHNodeToCurrentHNode.put(mergingNode, newNode); + } + } else { + mapHNodeToCurrentHNode.put(curNode, newNode); + } + } + + public HNode getCurrentHNode(HNode node) { + if (!mapHNodeToCurrentHNode.containsKey(node)) { + mapHNodeToCurrentHNode.put(node, node); + } + return mapHNodeToCurrentHNode.get(node); + } + + private Set getMergingSet(HNode mergeNode) { + Set mergingSet = new HashSet(); + Set mergedNode = mapMergeNodetoMergingSet.get(mergeNode); + for (Iterator iterator = mergedNode.iterator(); iterator.hasNext();) { + HNode node = (HNode) iterator.next(); + if (node.isMergeNode()) { + mergingSet.addAll(getMergingSet(node)); + } else { + mergingSet.add(node); + } + } + return mergingSet; + } + private Set getDescSetOfNode(HNode node) { if (!mapHNodeToDescSet.containsKey(node)) { mapHNodeToDescSet.put(node, new HashSet()); @@ -543,16 +625,20 @@ public class HierarchyGraph { return mapCombineNodeSetToCombinationNode.get(combineSet); } + public Map, HNode> getMapCombineNodeSetToCombinationNode() { + return mapCombineNodeSetToCombinationNode; + } + public Set> getCombineNodeSet() { return mapCombineNodeSetToOutgoingNodeSet.keySet(); } - public void insertCombinationNodesToGraph(HierarchyGraph hierarchyGraph) { + public void insertCombinationNodesToGraph(HierarchyGraph simpleHierarchyGraph) { // add a new combination node where parameter/field flows are actually combined. - hierarchyGraph.identifyCombinationNodes(); + simpleHierarchyGraph.identifyCombinationNodes(); - Set> keySet = hierarchyGraph.getCombineNodeSet(); + Set> keySet = simpleHierarchyGraph.getCombineNodeSet(); for (Iterator iterator = keySet.iterator(); iterator.hasNext();) { Set combineSet = (Set) iterator.next(); System.out.println("--combineSet=" + combineSet); @@ -575,15 +661,17 @@ public class HierarchyGraph { } // add an edge from the combination node to outgoing nodes - Set outSet = hierarchyGraph.getOutgoingNodeSetByCombineSet(combineSet); + Set outSet = simpleHierarchyGraph.getOutgoingNodeSetByCombineSet(combineSet); for (Iterator iterator2 = outSet.iterator(); iterator2.hasNext();) { HNode curNode = (HNode) iterator2.next(); if (curNode.isCombinationNode()) { - Set combineNode = hierarchyGraph.getCombineSetByCombinationNode(curNode); + Set combineNode = simpleHierarchyGraph.getCombineSetByCombinationNode(curNode); HNode outNode = getCombinationNode(combineNode); addEdgeWithNoCycleCheck(combinationNode, outNode); } else if (curNode.isSkeleton()) { - addEdgeWithNoCycleCheck(combinationNode, curNode); + // HNode dstNode = getHNode(curNode.getDescriptor()); + HNode dstNode = getCurrentHNode(curNode); + addEdgeWithNoCycleCheck(combinationNode, dstNode); } } @@ -711,10 +799,19 @@ public class HierarchyGraph { clone.setMapHNodeToOutgoingSet(getMapHNodeToOutgoingSet()); clone.setMapDescToHNode(getMapDescToHNode()); clone.setMapHNodeToDescSet(getMapHNodeToDescSet()); - + clone.setMapHNodetoMergeSet(getMapHNodetoMergeSet()); + clone.setMapHNodeToCurrentHNode(getMapHNodeToCurrentHNode()); return clone; } + public Map> getMapHNodetoMergeSet() { + return mapMergeNodetoMergingSet; + } + + public void setMapHNodetoMergeSet(Map> mapHNodetoMergeSet) { + this.mapMergeNodetoMergingSet = mapHNodetoMergeSet; + } + public Set getOutgoingNodeSetByCombineSet(Set combineSet) { if (!mapCombineNodeSetToOutgoingNodeSet.containsKey(combineSet)) { @@ -730,8 +827,8 @@ public class HierarchyGraph { HNode node = (HNode) iterator.next(); if (!node.isSkeleton()) { Set reachToSet = getSkeleteNodeSetReachTo(node); - // if (reachToSet.size() > 1) { - if (countSkeletonNodes(reachToSet) > 1) { + if (reachToSet.size() > 1) { + // if (countSkeletonNodes(reachToSet) > 1) { System.out.println("-node=" + node + " reachToSet=" + reachToSet); System.out.println("-set combinationnode=" + node); node.setCombinationNode(true); @@ -870,6 +967,7 @@ public class HierarchyGraph { basis.remove(getHNodeIndex(node)); for (Iterator iterator2 = reachableNodeSet.iterator(); iterator2.hasNext();) { HNode reachableNode = (HNode) iterator2.next(); + System.out.println("reachableNode=" + reachableNode); int idx = getHNodeIndex(reachableNode); basis.remove(idx); } @@ -968,10 +1066,36 @@ public class HierarchyGraph { } } + public boolean contains(HNode node) { + return nodeSet.contains(node); + } + + public boolean isDirectlyConnectedTo(HNode src, HNode dst) { + return getOutgoingNodeSet(src).contains(dst); + } + + private String convertMergeSetToString(Set mergeSet) { + String str = ""; + for (Iterator iterator = mergeSet.iterator(); iterator.hasNext();) { + HNode merged = (HNode) iterator.next(); + if (merged.isMergeNode()) { + str += " " + convertMergeSetToString(mapMergeNodetoMergingSet.get(merged)); + } else { + str += " " + merged.getName(); + } + } + return str; + } + private void drawNode(BufferedWriter bw, HNode node) throws IOException { - String nodeName = node.toString(); - nodeName = nodeName.substring(1, nodeName.length() - 1); + String nodeName; + if (node.isMergeNode()) { + nodeName = node.getNamePropertyString(); + Set mergeSet = mapMergeNodetoMergingSet.get(node); + nodeName += ":" + convertMergeSetToString(mergeSet); + } else { + nodeName = node.getNamePropertyString(); + } bw.write(node.getName() + " [label=\"" + nodeName + "\"]" + ";\n"); } - }