package kr.ac.snu.selab.soot.callgraph;
import java.util.Collection;
import java.util.HashMap;
import kr.ac.snu.selab.soot.graph.Graph;
import kr.ac.snu.selab.soot.graph.MetaInfo;
public class MetaInfoCallGraph implements Graph<MetaInfo> {
private HashMap<String, MetaInfo> nodes;
public MetaInfoCallGraph() {
nodes = new HashMap<String, MetaInfo>();
}
public void addNode(MetaInfo metaInfo) {
String key = metaInfo.key();
if (nodes.containsKey(key)) {
return;
}
nodes.put(key, metaInfo);
}
public void addEdge(MetaInfo from, MetaInfo to) {
String fromKey = from.key();
String toKey = to.key();
MetaInfo sourceNode = null, targetNode = null;
if (!nodes.containsKey(fromKey)) {
addNode(from);
}
sourceNode = nodes.get(fromKey);
if (!nodes.containsKey(toKey)) {
addNode(to);
}
targetNode = nodes.get(toKey);
sourceNode.addTarget(targetNode);
targetNode.addSource(sourceNode);
}
public MetaInfo find(MetaInfo metaInfo) {
String key = metaInfo.key();
return nodes.get(key);
}
@Override
public Collection<MetaInfo> sourceNodes(MetaInfo aNode) {
return aNode.getSources();
}
@Override
public Collection<MetaInfo> targetNodes(MetaInfo aNode) {
return aNode.getTargets();
}
}