package kr.ac.snu.selab.soot.analyzer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import kr.ac.snu.selab.soot.graph.MetaInfo;
import kr.ac.snu.selab.soot.graph.Path;
import kr.ac.snu.selab.soot.util.XMLWriter;
import org.apache.log4j.Logger;
import soot.Hierarchy;
import soot.SootClass;
public class PatternAnalysisResult {
private static Logger log = Logger.getLogger(PatternAnalysisResult.class);
private String patternName;
private Set<SootClass> interfaceTypes;
private Map<SootClass, RoleRepository> rolesPerType;
private Map<SootClass, Set<Path<MetaInfo>>> referenceFlowsPerType;
private Hierarchy hierarchy;
private AnalysisUtil au;
public PatternAnalysisResult() {
patternName = null;
interfaceTypes = new HashSet<SootClass>();
rolesPerType = new HashMap<SootClass, RoleRepository>();
referenceFlowsPerType = new HashMap<SootClass, Set<Path<MetaInfo>>>();
au = new AnalysisUtil();
}
public Map<SootClass, Set<Path<MetaInfo>>> referenceFlowsPerType() {
return referenceFlowsPerType;
}
public void addReferenceFlowsPerType(SootClass interfaceType, Set<Path<MetaInfo>> flows) {
referenceFlowsPerType.put(interfaceType, flows);
}
public void hierarchy(Hierarchy aHierarchy) {
hierarchy = aHierarchy;
}
public String patternName() {
return patternName;
}
public void setPatternName(String aName) {
patternName = aName;
}
public boolean patternExistence() {
if (!interfaceTypes().isEmpty()) {
return true;
}
else {
return false;
}
}
public Set<SootClass> interfaceTypes() {
return au.topLevelClasses(interfaceTypes, hierarchy);
}
public void addInterfaceType(SootClass aType) {
interfaceTypes.add(aType);
}
public Map<SootClass, RoleRepository> rolesPerType() {
return rolesPerType;
}
public void addRoles(SootClass type, RoleRepository roles) {
rolesPerType.put(type, roles);
}
public String patternExistenceStr() {
String patternExistenceStr = null;
if (patternExistence()) {
patternExistenceStr = "Yes";
}
else {
patternExistenceStr = "No";
}
return patternExistenceStr;
}
public void writeXML(XMLWriter writer) {
try {
writer.startElement("PatternAnalysisResult");
writer.simpleElement("PatternName", patternName());
writer.simpleElement("PatternExistence", patternExistenceStr());
writer.startElement("InterfaceTypesOfPatternInstance");
for (SootClass type : interfaceTypes()) {
writer.simpleElement("InterafceType", type.toString());
}
writer.endElement();
writer.startElement("RolesPerTypeList");
for (SootClass type : rolesPerType.keySet()) {
writer.startElement("RolesPerType");
writer.simpleElement("InterfaceType", type.toString());
rolesPerType.get(type).writeXML(writer);
writer.endElement();
}
writer.endElement();
writer.startElement("ReferenceFlowsPerType");
for (SootClass type : referenceFlowsPerType.keySet()) {
writer.startElement("ReferenceFlows");
writer.simpleElement("InterfaceType", type.toString());
for (Path<MetaInfo> flow : referenceFlowsPerType.get(type))
flow.writeXML(writer);
writer.endElement();
}
writer.endElement();
writer.endElement();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}