package kr.ac.snu.selab.soot.analyzer; import java.util.HashSet; import java.util.Map; import java.util.Set; import kr.ac.snu.selab.soot.callgraph.MetaInfoCallGraph; import kr.ac.snu.selab.soot.graph.MetaInfo; import kr.ac.snu.selab.soot.graph.Path; import soot.Hierarchy; import soot.SootClass; import soot.jimple.toolkits.callgraph.CallGraph; public class StrategyPattern extends PatternAnalysis { public PatternAnalysisResult perform(Map<String, SootClass> classMap, Hierarchy hierarchy, CallGraph cg, AnalysisUtil au) { PatternAnalysisResult result = new PatternAnalysisResult(); result.setPatternName("Strategy"); Set<SootClass> interfaceTypes = au.interfaceTypes(classMap); for (SootClass interfaceType : interfaceTypes) { RoleRepository roles = new RoleRepository(); Map<String, MetaInfo> metaInfoMap = au.metaInfoMap(classMap.values()); Set<Path<MetaInfo>> abstractReferenceFlows = new HashSet<Path<MetaInfo>>(); MetaInfoCallGraph metaInfoCallGraph = au.metaInfoCallGraph(cg, metaInfoMap); abstractReferenceFlows = au.abstractReferenceFlows(interfaceType, classMap, hierarchy, cg, metaInfoMap, roles); result.addReferenceFlowsPerType(interfaceType, abstractReferenceFlows); if (!au.doesCall(roles.callers(), roles.injectors(), metaInfoCallGraph)) { result.addInterfaceType(interfaceType); result.addRoles(interfaceType, roles); } } return result; } }