package kr.ac.snu.selab.soot.graph; import java.io.CharArrayWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import kr.ac.snu.selab.soot.analyzer.Caller; import kr.ac.snu.selab.soot.analyzer.Creator; import kr.ac.snu.selab.soot.analyzer.Injector; import kr.ac.snu.selab.soot.analyzer.Role; import kr.ac.snu.selab.soot.analyzer.Store; import kr.ac.snu.selab.soot.graph.refgraph.LocalInfoNode; import kr.ac.snu.selab.soot.util.XMLWriter; import org.apache.log4j.Logger; public class MetaInfo extends Node { private static Logger log = Logger.getLogger(LocalInfoNode.class); private List<MetaInfo> sourceNodes, targetNodes; private Set<Role> roles; private Set<Role> callers; private Set<Role> creators; private Set<Role> injectors; private Set<Role> stores; public MetaInfo(Object element) { super(element); roles = new HashSet<Role>(); callers = new HashSet<Role>(); creators = new HashSet<Role>(); injectors = new HashSet<Role>(); stores = new HashSet<Role>(); sourceNodes = new ArrayList<MetaInfo>(); targetNodes = new ArrayList<MetaInfo>(); } public List<MetaInfo> getSources() { return sourceNodes; } public List<MetaInfo> getTargets() { return targetNodes; } public void addSource(MetaInfo node) { sourceNodes.add(node); } public void addTarget(MetaInfo node) { targetNodes.add(node); } public Set<Role> roles() { return roles; } public Set<Role> creators() { return creators; } public Set<Role> callers() { return callers; } public Set<Role> injectors() { return injectors; } public Set<Role> stores() { return stores; } public void addRole(Role role) { roles.add(role); if (role instanceof Caller) { callers.add(role); } else if (role instanceof Creator) { creators.add(role); } else if (role instanceof Injector) { injectors.add(role); } else if (role instanceof Store) { stores.add(role); } } public boolean isCreator() { if (!creators.isEmpty()) { return true; } else { return false; } } public boolean isCaller() { if (!callers.isEmpty()) { return true; } else { return false; } } public boolean isInjector() { if (!injectors.isEmpty()) { return true; } else { return false; } } public boolean isStore() { if (!stores.isEmpty()) { return true; } else { return false; } } public String toString() { return element.toString(); } @Override public int hashCode() { return element.toString().hashCode(); } @Override public boolean equals(Object anObject) { if (anObject.getClass() != getClass()) return false; Node compare = (Node) anObject; return (element.equals(compare.element)); } @Override public String toXML() { CharArrayWriter writer = new CharArrayWriter(); XMLWriter w = new XMLWriter(writer); writeXML(w); w.close(); return writer.toString(); } @Override public void writeXML(XMLWriter writer) { try { writer.simpleElement("MetaInfo", element.toString() + roleStr()); } catch (IOException e) { log.error(e.getMessage(), e); } } private String roleStr() { String result = ""; String creatorStr = ""; String callerStr = ""; String injectorStr = ""; String storeStr = ""; String sep = " "; if (isCreator()) { creatorStr = "(Creator)"; } if (isCaller()) { callerStr = "(Caller)"; } if (isInjector()) { injectorStr = "(Injector)"; } if (isStore()) { storeStr = "(Store)"; } result = sep + creatorStr + sep + callerStr + sep + injectorStr + sep + storeStr; return result; } }