/*
* FindBugs - Find bugs in Java programs
* Copyright (C) 2004, 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.util.ArrayList;
import java.util.Iterator;
import edu.umd.cs.findbugs.classfile.IAnalysisEngineRegistrar;
import edu.umd.cs.findbugs.plan.DetectorOrderingConstraint;
/**
* A FindBugs plugin.
* A plugin contains executable Detector classes, as well as meta
* information decribing those detectors (such as human-readable
* detector and bug descriptions).
*
* @see PluginLoader
* @author David Hovemeyer
*/
public class Plugin {
private String pluginId;
private String provider;
private String website;
private String shortDescription;
private ArrayList<DetectorFactory> detectorFactoryList;
private ArrayList<BugPattern> bugPatternList;
private ArrayList<BugCode> bugCodeList;
private boolean enabled;
private BugRanker bugRanker;
// Ordering constraints
private ArrayList<DetectorOrderingConstraint> interPassConstraintList;
private ArrayList<DetectorOrderingConstraint> intraPassConstraintList;
// Optional: engine registrar class
private Class<? extends IAnalysisEngineRegistrar> engineRegistrarClass;
// PluginLoader that loaded this plugin
private final PluginLoader pluginLoader;
/**
* Constructor.
* Creates an empty plugin object.
*
* @param pluginId the plugin's unique identifier
*/
public Plugin(String pluginId, PluginLoader pluginLoader) {
this.pluginId = pluginId;
this.detectorFactoryList = new ArrayList<DetectorFactory>();
this.bugPatternList = new ArrayList<BugPattern>();
this.bugCodeList = new ArrayList<BugCode>();
this.interPassConstraintList = new ArrayList<DetectorOrderingConstraint>();
this.intraPassConstraintList = new ArrayList<DetectorOrderingConstraint>();
this.pluginLoader = pluginLoader;
}
/**
* Set whether or not this Plugin is enabled.
*
* @param enabled true if the Plugin is enabled, false if not
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Return whether or not the Plugin is enabled.
*
* @return true if the Plugin is enabled, false if not
*/
public boolean isEnabled() {
return enabled;
}
/**
* Set plugin provider.
*
* @param provider the plugin provider
*/
public void setProvider(String provider) {
this.provider = provider;
}
/**
* Get the plugin provider.
*
* @return the provider, or null if the provider was not specified
*/
public String getProvider() {
return provider;
}
/**
* Set plugin website.
*
* @param website the plugin website
*/
public void setWebsite(String website) {
this.website = website;
}
/**
* Get the plugin website.
*
* @return the website, or null if the was not specified
*/
public String getWebsite() {
return website;
}
/**
* Set plugin short (one-line) text description.
*
* @param shortDescription the plugin short text description
*/
public void setShortDescription(String shortDescription) {
this.shortDescription = shortDescription;
}
/**
* Get the plugin short (one-line) description.
*
* @return the short description, or null if the
* short description was not specified
*/
public String getShortDescription() {
return shortDescription;
}
/**
* Add a DetectorFactory for a Detector implemented by the Plugin.
*
* @param factory the DetectorFactory
*/
public void addDetectorFactory(DetectorFactory factory) {
detectorFactoryList.add(factory);
}
/**
* Add a BugPattern reported by the Plugin.
*
* @param bugPattern
*/
public void addBugPattern(BugPattern bugPattern) {
bugPatternList.add(bugPattern);
}
/**
* Add a BugCode reported by the Plugin.
*
* @param bugCode
*/
public void addBugCode(BugCode bugCode) {
bugCodeList.add(bugCode);
}
/**
* Add an inter-pass Detector ordering constraint.
*
* @param constraint the inter-pass Detector ordering constraint
*/
public void addInterPassOrderingConstraint(DetectorOrderingConstraint constraint) {
interPassConstraintList.add(constraint);
}
/**
* Add an intra-pass Detector ordering constraint.
*
* @param constraint the intra-pass Detector ordering constraint
*/
public void addIntraPassOrderingConstraint(DetectorOrderingConstraint constraint) {
intraPassConstraintList.add(constraint);
}
/**
* Look up a DetectorFactory by short name.
*
* @param shortName the short name
* @return the DetectorFactory
*/
public DetectorFactory getFactoryByShortName(final String shortName) {
return chooseFactory(new FactoryChooser() {
public boolean choose(DetectorFactory factory) {
return factory.getShortName().equals(shortName);
}
});
}
/**
* Look up a DetectorFactory by full name.
*
* @param fullName the full name
* @return the DetectorFactory
*/
public DetectorFactory getFactoryByFullName(final String fullName) {
return chooseFactory(new FactoryChooser() {
public boolean choose(DetectorFactory factory) {
return factory.getFullName().equals(fullName);
}
});
}
/**
* Get Iterator over DetectorFactory objects in the Plugin.
*
* @return Iterator over DetectorFactory objects
*/
public Iterator<DetectorFactory> detectorFactoryIterator() {
return detectorFactoryList.iterator();
}
/**
* Get Iterator over BugPattern objects in the Plugin.
*
* @return Iterator over BugPattern objects
*/
public Iterator<BugPattern> bugPatternIterator() {
return bugPatternList.iterator();
}
/**
* Get Iterator over BugCode objects in the Plugin.
*
* @return Iterator over BugCode objects
*/
public Iterator<BugCode> bugCodeIterator() {
return bugCodeList.iterator();
}
/**
* Return an Iterator over the inter-pass Detector ordering constraints.
*/
public Iterator<DetectorOrderingConstraint> interPassConstraintIterator() {
return interPassConstraintList.iterator();
}
/**
* Return an Iterator over the intra-pass Detector ordering constraints.
*/
public Iterator<DetectorOrderingConstraint> intraPassConstraintIterator() {
return intraPassConstraintList.iterator();
}
/**
* @return Returns the pluginId.
*/
public String getPluginId() {
return pluginId;
}
/**
* Set the analysis engine registrar class that,
* when instantiated, can be used to register the plugin's
* analysis engines with the analysis cache.
*
* @param engineRegistrarClass The engine registrar class to set.
*/
public void setEngineRegistrarClass(Class<? extends IAnalysisEngineRegistrar> engineRegistrarClass) {
this.engineRegistrarClass = engineRegistrarClass;
}
/**
* Get the analysis engine registrar class that,
* when instantiated, can be used to register the plugin's
* analysis engines with the analysis cache.
*
* @return Returns the engine registrar class.
*/
public Class<? extends IAnalysisEngineRegistrar> getEngineRegistrarClass() {
return engineRegistrarClass;
}
/**
* @return Returns the pluginLoader.
*/
public PluginLoader getPluginLoader() {
return pluginLoader;
}
private interface FactoryChooser {
public boolean choose(DetectorFactory factory);
}
private DetectorFactory chooseFactory(FactoryChooser chooser) {
for (Iterator<DetectorFactory> i = detectorFactoryIterator(); i.hasNext(); ) {
DetectorFactory factory = i.next();
if (chooser.choose(factory))
return factory;
}
return null;
}
/**
* @param ranker
*/
public void setBugRanker(BugRanker ranker) {
this.bugRanker = ranker;
}
public BugRanker getBugRanker() {
return bugRanker;
}
public int rankBug(BugInstance bug) {
if (bugRanker == null)
return 29;
return bugRanker.rankBug(bug);
}
}
// vim:ts=4