package edu.umd.cs.findbugs;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.StringTokenizer;
import javax.annotation.Nonnull;
import edu.umd.cs.findbugs.config.AnalysisFeatureSetting;
import edu.umd.cs.findbugs.config.CommandLine;
public abstract class FindBugsCommandLine extends CommandLine {
protected AnalysisFeatureSetting[] settingList = FindBugs.DEFAULT_EFFORT;
protected Project project;
protected boolean projectLoadedFromFile;
public FindBugsCommandLine() {
super();
project = new Project();
startOptionGroup("General FindBugs options:");
addOption("-project", "project", "analyze given project");
addOption("-home", "home directory", "specify FindBugs home directory");
addOption("-pluginList", "jar1[" + File.pathSeparator + "jar2...]", "specify list of plugin Jar files to load");
addSwitchWithOptionalExtraPart("-effort", "min|less|default|more|max", "set analysis effort level");
addSwitch("-adjustExperimental", "lower priority of experimental Bug Patterns");
addSwitch("-workHard", "ensure analysis effort is at least 'default'");
addSwitch("-conserveSpace", "same as -effort:min (for backward compatibility)");
}
public FindBugsCommandLine(boolean modernGui) {
this();
addOption("-f", "font size", "set font size");
addSwitch("-clear", "clear saved GUI settings and exit");
addOption("-priority", "thread priority", "set analysis thread priority");
addOption("-loadbugs", "saved analysis results", "load bugs from saved analysis results");
makeOptionUnlisted("-loadbugs");
addOption("-loadBugs", "saved analysis results", "load bugs from saved analysis results");
addSwitch("-d", "disable docking");
addSwitch("--nodock", "disable docking");
addSwitchWithOptionalExtraPart("-look", "plastic|gtk|native", "set UI look and feel");
}
public AnalysisFeatureSetting[] getSettingList() {
return settingList;
}
public @Nonnull
Project getProject() {
return project;
}
public boolean isProjectLoadedFromFile() {
return projectLoadedFromFile;
}
@Override
protected void handleOption(String option, String optionExtraPart) {
if ("-effort".equals(option)) {
if ("min".equals(optionExtraPart)) {
settingList = FindBugs.MIN_EFFORT;
} else if ("less".equals(optionExtraPart)) {
settingList = FindBugs.LESS_EFFORT;
} else if ("default".equals(optionExtraPart)) {
settingList = FindBugs.DEFAULT_EFFORT;
} else if ("more".equals(optionExtraPart)) {
settingList = FindBugs.MORE_EFFORT;
} else if ("max".equals(optionExtraPart)) {
settingList = FindBugs.MAX_EFFORT;
} else {
throw new IllegalArgumentException("-effort:<value> must be one of min,default,more,max");
}
} else if ("-workHard".equals(option)) {
if (settingList != FindBugs.MAX_EFFORT) {
settingList = FindBugs.MORE_EFFORT;
}
} else if ("-conserveSpace".equals(option)) {
settingList = FindBugs.MIN_EFFORT;
} else if ("-adjustExperimental".equals(option)) {
BugInstance.setAdjustExperimental(true);
} else {
throw new IllegalArgumentException("Don't understand option " + option);
}
}
@Override
protected void handleOptionWithArgument(String option, String argument) throws IOException {
if ("-home".equals(option)) {
FindBugs.setHome(argument);
} else if ("-pluginList".equals(option)) {
String pluginListStr = argument;
Map<String, Boolean> customPlugins = getProject().getConfiguration().getCustomPlugins();
StringTokenizer tok = new StringTokenizer(pluginListStr, File.pathSeparator);
while (tok.hasMoreTokens()) {
File file = new File(tok.nextToken());
Boolean enabled = Boolean.valueOf(file.isFile());
customPlugins.put(file.getAbsolutePath(), enabled);
if(enabled.booleanValue()) {
try {
Plugin.loadCustomPlugin(file, getProject());
} catch (PluginException e) {
throw new IllegalStateException("Failed to load plugin " +
"specified by the '-pluginList', file: " + file, e);
}
}
}
} else if ("-project".equals(option)) {
loadProject(argument);
} else {
throw new IllegalStateException();
}
}
public void loadProject(String arg) throws IOException {
Project newProject = Project.readProject(arg);
newProject.setConfiguration(project.getConfiguration());
project = newProject;
projectLoadedFromFile = true;
}
}