package kr.ac.snu.selab.soot.analyzer; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import kr.ac.snu.selab.soot.graph.MyNode; import kr.ac.snu.selab.soot.graph.Path; import kr.ac.snu.selab.soot.util.XMLWriter; import soot.SootClass; public class AnalysisResult { private SootClass abstractType; protected List<MyNode> callerList; protected List<MyNode> creatorList; // String := MyNode.toString() // where MyNode is caller protected Map<String, List<Path<MyNode>>> referenceFlowPathMap; // FIXME: Maybe, this field is useless!!! // key := referenceFlowPath, // value := triggerPath private Map<Path<MyNode>, List<Path<MyNode>>> creatorTriggerPathMap; public AnalysisResult() { abstractType = null; callerList = new ArrayList<MyNode>(); creatorList = new ArrayList<MyNode>(); referenceFlowPathMap = new HashMap<String, List<Path<MyNode>>>(); // storeList = new ArrayList<Store>(); creatorTriggerPathMap = new HashMap<Path<MyNode>, List<Path<MyNode>>>(); } public String getAbstractTypeName() { if (abstractType == null) { return ""; } return abstractType.toString(); } public void setAbstractType(SootClass aType) { abstractType = aType; } // public AnalysisResult(SootClass anAbstractType, List<Caller> aCallerList, // List<Creator> aCreatorList, List<Store> aStoreList) { // abstractType = anAbstractType; // callerList = aCallerList; // creatorList = aCreatorList; // storeList = aStoreList; // } public boolean hasDesignPattern() { return true; // return !creatorTriggerPathMap.isEmpty(); } public void writeXML(XMLWriter writer) { try { writer.startElement("AnalysisResult"); writer.simpleElement("AbstractType", abstractType.toString()); writer.startElement("CallerList"); for (MyNode aNode : callerList) { aNode.writeXML(writer); } writer.endElement(); writer.startElement("ReferenceFlowList"); for (MyNode aNode : callerList) { String key = aNode.toString(); if (referenceFlowPathMap.containsKey(key)) { String patternName = null; writer.startElement("ReferenceFlowPerCaller"); writer.startElement("Caller"); aNode.writeXML(writer); writer.endElement(); writer.startElement("PathSetList"); for (Path<MyNode> aPath : referenceFlowPathMap.get(key)) { writer.startElement("PathSet"); aPath.writeXML(writer); if (creatorTriggerPathMap.containsKey(aPath)) { patternName = "State"; writer.startElement("TriggerPathList"); for (Path<MyNode> aTriggerPath : creatorTriggerPathMap .get(aPath)) { aTriggerPath.writeXML(writer); } writer.endElement(); } writer.endElement(); } writer.endElement(); if (patternName != null) { writer.simpleElement("Pattern", patternName); } writer.endElement(); } } writer.endElement(); writer.startElement("CreatorList"); for (MyNode aNode : creatorList) { aNode.writeXML(writer); } writer.endElement(); // writer.startElement("StoreList"); // for (Store aStore : storeList) { // aStore.writeXML(writer); // } // writer.endElement(); writer.endElement(); } catch (IOException e) { e.printStackTrace(); } } public Iterable<MyNode> getCallers() { return callerList; } public void addCaller(MyNode node) { callerList.add(node); } public Iterable<MyNode> getCreators() { return creatorList; } public void addCreator(MyNode node) { creatorList.add(node); } public void putReferenceFlowPath(String key, List<Path<MyNode>> pathList) { referenceFlowPathMap.put(key, pathList); } public Iterable<Path<MyNode>> getReferenceFlowPaths(String key) { return referenceFlowPathMap.get(key); } public boolean containsReferenceFlowPath(String key) { return referenceFlowPathMap.containsKey(key); } }