/*
* FindBugs - Find bugs in Java programs
* Copyright (C) 2003-2007 University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
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;
/**
* Base class for FindBugs command line classes. Handles all shared
* switches/options.
*
* @author David Hovemeyer
*/
public abstract class FindBugsCommandLine extends CommandLine {
/**
* Analysis settings to configure the analysis effort.
*/
protected AnalysisFeatureSetting[] settingList = FindBugs.DEFAULT_EFFORT;
/**
* Project to analyze.
*/
protected Project project;
/**
* True if project was initialized by loading a project file.
*/
protected boolean projectLoadedFromFile;
/**
* Constructor. Adds shared options/switches.
*/
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)");
}
/**
* Additional constuctor just as hack for decoupling the core package from
* gui2 package
*
* @param modernGui
* ignored. In any case, gui2 options are added here.
*/
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 (option.equals("-effort")) {
if (optionExtraPart.equals("min")) {
settingList = FindBugs.MIN_EFFORT;
} else if (optionExtraPart.equals("less")) {
settingList = FindBugs.LESS_EFFORT;
} else if (optionExtraPart.equals("default")) {
settingList = FindBugs.DEFAULT_EFFORT;
} else if (optionExtraPart.equals("more")) {
settingList = FindBugs.MORE_EFFORT;
} else if (optionExtraPart.equals("max")) {
settingList = FindBugs.MAX_EFFORT;
} else {
throw new IllegalArgumentException("-effort:<value> must be one of min,default,more,max");
}
} else if (option.equals("-workHard")) {
if (settingList != FindBugs.MAX_EFFORT)
settingList = FindBugs.MORE_EFFORT;
} else if (option.equals("-conserveSpace")) {
settingList = FindBugs.MIN_EFFORT;
} else if (option.equals("-adjustExperimental")) {
BugInstance.setAdjustExperimental(true);
} else {
throw new IllegalArgumentException("Don't understand option " + option);
}
}
@Override
protected void handleOptionWithArgument(String option, String argument) throws IOException {
if (option.equals("-home")) {
FindBugs.setHome(argument);
} else if (option.equals("-pluginList")) {
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 (option.equals("-project")) {
loadProject(argument);
} else {
throw new IllegalStateException();
}
}
/**
* Load given project file.
*
* @param arg
* name of project file
* @throws java.io.IOException
*/
public void loadProject(String arg) throws IOException {
Project newProject = Project.readProject(arg);
newProject.setConfiguration(project.getConfiguration());
project = newProject;
projectLoadedFromFile = true;
}
}