package kr.ac.snu.selab.soot.core;
import java.util.ArrayList;
import kr.ac.snu.selab.soot.analyzer.AbstractAnalyzer;
import kr.ac.snu.selab.soot.analyzer.code.CodeAnalyzer;
import kr.ac.snu.selab.soot.analyzer.decNcor.DecNCorAnalyzer;
import kr.ac.snu.selab.soot.analyzer.pfc.PathFromCallerAnalyzer;
import kr.ac.snu.selab.soot.analyzer.role.RoleAnalyzer;
import kr.ac.snu.selab.soot.analyzer.sta.StatePatternAnalyzer;
import kr.ac.snu.selab.soot.callgraph.CallGraphTXTCreator;
import kr.ac.snu.selab.soot.callgraph.CallGraphXMLCreator;
import org.apache.log4j.Logger;
import soot.PackManager;
import soot.Transform;
public class AnalyzerRunner {
private static Logger logger = Logger.getLogger(AnalyzerRunner.class);
public static void run(AbstractProject project, String analyzerName,
boolean noJimpleOutput) throws InvalidAnalyzerException {
AbstractAnalyzer analyzer = null;
if (analyzerName.equalsIgnoreCase("r")
|| analyzerName.equalsIgnoreCase("Role")
|| analyzerName.equalsIgnoreCase("RoleAnalyzer")) {
analyzer = new RoleAnalyzer(project);
} else if (analyzerName.equalsIgnoreCase("ct")
|| analyzerName.equalsIgnoreCase("CallGraphTXTCreater")) {
analyzer = new CallGraphTXTCreator(project);
} else if (analyzerName.equalsIgnoreCase("cx")
|| analyzerName.equalsIgnoreCase("CallGraphXMLCreater")) {
analyzer = new CallGraphXMLCreator(project);
} else if (analyzerName.equalsIgnoreCase("c")
|| analyzerName.equalsIgnoreCase("Code")
|| analyzerName.equalsIgnoreCase("CodeAnalyzer")) {
analyzer = new CodeAnalyzer(project);
} else if (analyzerName.equalsIgnoreCase("pfc")
|| analyzerName.equalsIgnoreCase("PathFromCaller")) {
analyzer = new PathFromCallerAnalyzer(project);
} else if (analyzerName.equalsIgnoreCase("sta")
|| analyzerName.equalsIgnoreCase("State")) {
analyzer = new StatePatternAnalyzer(project);
} else if (analyzerName.equalsIgnoreCase("decncor")
|| analyzerName.equalsIgnoreCase("DecoratorAndCor")) {
analyzer = new DecNCorAnalyzer(project);
} else {
throw new InvalidAnalyzerException("Can not find proper analyzer: "
+ analyzerName);
}
PackManager.v().getPack("jtp")
.add(new Transform("jtp.Experiment", analyzer));
ArrayList<String> params = new ArrayList<String>();
// Class path
params.add("-cp");
params.add(project.getClassPath());
// Output format
params.add("-f");
if (noJimpleOutput) {
// No output
params.add("n");
} else {
// Jimple
params.add("J");
}
// Output directory
params.add("-d");
params.add(project.getJimpleDirectory());
params.add("--process-dir");
params.add(project.getSourceDirectory());
// FIXME: Maybe, useless
params.add("-p");
params.add("jb");
params.add("use-original-names:true");
String includePackage = project.getIncludePackage();
if (includePackage != null && !includePackage.equals("")) {
params.add("-i");
params.add(includePackage);
}
if (!project.isUseSimpleCallGraph()) {
// Whole program analysis
params.add("-w");
// Use spark
params.add("-p");
params.add("cg.spark");
params.add("on-fly-cg:true");
// params.add("verbose:true,on-fly-cg:true");
}
String[] arguments = new String[params.size()];
params.toArray(arguments);
StringBuffer buffer = new StringBuffer();
for (String arg : arguments) {
buffer.append(arg);
buffer.append(" ");
}
logger.debug("java soot.Main " + buffer.toString());
soot.Main.main(arguments);
}
}