Class Project

java.lang.Object
edu.umd.cs.findbugs.Project
All Implemented Interfaces:
XMLWriteable, AutoCloseable

public class Project extends Object implements XMLWriteable, AutoCloseable

A project in the GUI. This consists of some number of Jar files to analyze for bugs, and optionally

  • some number of source directories, for locating the program's source code
  • some number of auxiliary classpath entries, for locating classes referenced by the program which the user doesn't want to analyze
  • some number of boolean options
  • Field Details

    • LOG

      private static final org.slf4j.Logger LOG
    • currentWorkingDirectoryList

      private final List<File> currentWorkingDirectoryList
    • projectName

      private String projectName
    • analysisTargets

      private List<String> analysisTargets
      List of jars/directories to analyze
    • srcDirList

      private List<String> srcDirList
      The list of source directories.
    • auxClasspathEntryList

      private List<String> auxClasspathEntryList
      The list of auxiliary classpath entries.
    • isModified

      private boolean isModified
      Flag to indicate that this Project has been modified.
    • configuration

      private UserPreferences configuration
    • enabledPlugins

      private final Map<String,Boolean> enabledPlugins
      key is plugin id
    • UNNAMED_PROJECT

      public static final String UNNAMED_PROJECT
      StaticConstant used to name anonymous projects.
      See Also:
    • timestampForAnalyzedClasses

      private long timestampForAnalyzedClasses
    • guiCallback

      private IGuiCallback guiCallback
    • suppressionFilter

      @Nonnull private Filter suppressionFilter
    • sourceFinder

      private SourceFinder sourceFinder
    • OPTIONS_KEY

      private static final String OPTIONS_KEY
      See Also:
    • JAR_FILES_KEY

      private static final String JAR_FILES_KEY
      See Also:
    • SRC_DIRS_KEY

      private static final String SRC_DIRS_KEY
      See Also:
    • AUX_CLASSPATH_ENTRIES_KEY

      private static final String AUX_CLASSPATH_ENTRIES_KEY
      See Also:
    • RELATIVE_PATHS

      public static final String RELATIVE_PATHS
      See Also:
    • JAR_ELEMENT_NAME

      static final String JAR_ELEMENT_NAME
      See Also:
    • AUX_CLASSPATH_ENTRY_ELEMENT_NAME

      static final String AUX_CLASSPATH_ENTRY_ELEMENT_NAME
      See Also:
    • SRC_DIR_ELEMENT_NAME

      static final String SRC_DIR_ELEMENT_NAME
      See Also:
    • WRK_DIR_ELEMENT_NAME

      static final String WRK_DIR_ELEMENT_NAME
      See Also:
    • FILENAME_ATTRIBUTE_NAME

      static final String FILENAME_ATTRIBUTE_NAME
      See Also:
    • PROJECTNAME_ATTRIBUTE_NAME

      static final String PROJECTNAME_ATTRIBUTE_NAME
      See Also:
    • PLUGIN_ELEMENT_NAME

      static final String PLUGIN_ELEMENT_NAME
      See Also:
    • PLUGIN_ID_ATTRIBUTE_NAME

      static final String PLUGIN_ID_ATTRIBUTE_NAME
      See Also:
    • PLUGIN_STATUS_ELEMENT_NAME

      static final String PLUGIN_STATUS_ELEMENT_NAME
      See Also:
    • FILE_IGNORE_CASE

      private static final boolean FILE_IGNORE_CASE
      Hack for whether files are case insensitive. For now, we'll assume that Windows is the only case insensitive OS. (OpenVMS users, feel free to submit a patch :-)
  • Constructor Details

    • Project

      public Project()
      Create an anonymous project.
  • Method Details

    • getPluginStatus

      @CheckForNull public Boolean getPluginStatus(Plugin plugin)
    • setPluginStatusTrinary

      public void setPluginStatusTrinary(String pluginId, Boolean enabled)
    • getConfiguration

      public UserPreferences getConfiguration()
    • setConfiguration

      public void setConfiguration(@Nonnull UserPreferences configuration)
      Parameters:
      configuration - The configuration to set, non null
    • duplicate

      public Project duplicate()
      Return an exact copy of this Project.
    • getSourceFinder

      public SourceFinder getSourceFinder()
    • isGuiAvaliable

      public boolean isGuiAvaliable()
    • add

      public void add(Project project2)
      add information from project2 to this project
    • appendWithoutDuplicates

      public static <T> List<T> appendWithoutDuplicates(List<T> lst1, List<T> lst2)
    • setCurrentWorkingDirectory

      public void setCurrentWorkingDirectory(File f)
    • isModified

      public boolean isModified()
      Return whether or not this Project has unsaved modifications.
    • setModified

      public void setModified(boolean isModified)
      Set whether or not this Project has unsaved modifications.
    • addFile

      public boolean addFile(String fileName)
      Add a file to the project.
      Parameters:
      fileName - the file to add
      Returns:
      true if the file was added, or false if the file was already present
    • addSourceDir

      @Deprecated public boolean addSourceDir(String sourceDir)
      Deprecated.
      Calling this method repeatedly performs poorly because a SourceFinder is created each time, which checks all files for existence each time. Use addSourceDirs(java.util.Collection<java.lang.String>) instead.
      Add a source directory to the project.
      Parameters:
      sourceDir - The source directory to add. These can be either an absolute path or relative to any of the working directories in this project object.
      Returns:
      true if the source directory was added or false if it was already present
    • addSourceDirs

      public boolean addSourceDirs(Collection<String> sourceDirs)
      Add source directories to the project.
      Parameters:
      sourceDirs - The source directories to add. These can be either absolute paths or relative to any of the working directories in this project object.
      Returns:
      true if a source directory was added or false if all source directories were already present
    • addWorkingDir

      public boolean addWorkingDir(String dirName)
      Add a working directory to the project.
      Parameters:
      dirName - the directory to add
      Returns:
      true if the working directory was added, or false if the working directory was already present
    • getFileCount

      public int getFileCount()
      Get the number of files in the project.
      Returns:
      the number of files in the project
    • getFile

      public String getFile(int num)
      Get the given file in the list of project files.
      Parameters:
      num - the number of the file in the list of project files
      Returns:
      the name of the file
    • removeFile

      public void removeFile(int num)
      Remove file at the given index in the list of project files
      Parameters:
      num - index of the file to remove in the list of project files
    • getFileList

      public List<String> getFileList()
      Get the list of files, directories, and zip files in the project.
    • getNumSourceDirs

      public int getNumSourceDirs()
      Get the number of source directories in the project.
      Returns:
      the number of source directories in the project
    • getSourceDir

      public String getSourceDir(int num)
      Get the given source directory.
      Parameters:
      num - the number of the source directory
      Returns:
      the source directory
    • removeSourceDir

      public void removeSourceDir(int num)
      Remove source directory at given index.
      Parameters:
      num - index of the source directory to remove
    • getFileArray

      public String[] getFileArray()
      Get project files as an array of Strings.
    • getSourceDirArray

      public String[] getSourceDirArray()
      Get source dirs as an array of Strings.
    • getSourceDirList

      public List<String> getSourceDirList()
      Get the source dir list.
    • addAuxClasspathEntry

      public boolean addAuxClasspathEntry(String auxClasspathEntry)
      Add an auxiliary classpath entry
      Parameters:
      auxClasspathEntry - the entry
      Returns:
      true if the entry was added successfully, or false if the given entry is already in the list
    • getNumAuxClasspathEntries

      public int getNumAuxClasspathEntries()
      Get the number of auxiliary classpath entries.
    • getAuxClasspathEntry

      public String getAuxClasspathEntry(int n)
      Get the n'th auxiliary classpath entry.
    • removeAuxClasspathEntry

      public void removeAuxClasspathEntry(int n)
      Remove the n'th auxiliary classpath entry.
    • getAuxClasspathEntryList

      public List<String> getAuxClasspathEntryList()
      Return the list of aux classpath entries.
    • getImplicitClasspathEntryList

      @Deprecated public List<String> getImplicitClasspathEntryList()
      Deprecated.
      FindBugs2 and ClassPathBuilder take care of this automatically
      Return the list of implicit classpath entries. The implicit classpath is computed from the closure of the set of jar files that are referenced by the "Class-Path" attribute of the manifest of the any jar file that is part of this project or by the "Class-Path" attribute of any directly or indirectly referenced jar. The referenced jar files that exist are the list of implicit classpath entries.
    • processComponentJar

      private void processComponentJar(URL jarFileURL, Project.WorkList workList, List<String> implicitClasspath)
      Examine the manifest of a single zip/jar file for implicit classapth entries.
      Parameters:
      jarFileURL - URL of the zip/jar file
      workList - worklist of zip/jar files to examine
      implicitClasspath - list of implicit classpath entries found
    • write

      @Deprecated public void write(String outputFile, boolean useRelativePaths, String relativeBase) throws IOException
      Deprecated.
      Save the project to an output file.
      Parameters:
      outputFile - name of output file
      useRelativePaths - true if the project should be written using only relative paths
      relativeBase - if useRelativePaths is true, this file is taken as the base directory in terms of which all files should be made relative
      Throws:
      IOException - if an error occurs while writing
    • readXML

      Throws:
      IOException
      SAXException
      ParserConfigurationException
    • writeXML

      public void writeXML(File f, @CheckForNull BugCollection bugCollection) throws IOException
      Throws:
      IOException
    • readProject

      public static Project readProject(String argument) throws IOException
      Read Project from named file.
      Parameters:
      argument - command line argument containing project file name
      Returns:
      the Project
      Throws:
      IOException
    • toString

      public String toString()
      Convert to a string in a nice (displayable) format.
      Overrides:
      toString in class Object
    • transformFilename

      public static String transformFilename(String fileName)
      Transform a user-entered filename into a proper filename, by adding the ".fb" file extension if it isn't already present.
    • writeXML

      public void writeXML(XMLOutput xmlOutput) throws IOException
      Description copied from interface: XMLWriteable
      Write this object to given XMLOutput.
      Specified by:
      writeXML in interface XMLWriteable
      Parameters:
      xmlOutput - the XMLOutput for the document
      Throws:
      IOException
    • writeXML

      public void writeXML(XMLOutput xmlOutput, @CheckForNull File destination, @CheckForNull BugCollection bugCollection) throws IOException
      Throws:
      IOException
    • convertToRelative

      private Iterable<String> convertToRelative(List<String> paths, String base)
    • convertToRelative

      private String convertToRelative(String srcFile, String base)
      Converts a full path to a relative path if possible
      Parameters:
      srcFile - path to convert
      Returns:
      the converted filename
    • makeAbsoluteCWD

      private String makeAbsoluteCWD(String fileName)
      Make the given filename absolute relative to the current working directory.
    • makeAbsoluteCwdCandidates

      private List<String> makeAbsoluteCwdCandidates(String fileName)
      Make the given filename absolute relative to the current working directory candidates. If the given filename exists in more than one of the working directories, a list of these existing absolute paths is returned. The returned list is guaranteed to be non-empty. The returned paths might exist or not exist and might be relative or absolute.
      Returns:
      A list of at least one candidate path for the given filename.
    • addToListInternal

      private <T> boolean addToListInternal(Collection<T> list, T value)
      Add a value to given list, making the Project modified if the value is not already present in the list.
      Parameters:
      list - the list
      value - the value to be added
      Returns:
      true if the value was not already present in the list, false otherwise
    • setTimestamp

      public void setTimestamp(long timestamp)
    • addTimestamp

      public void addTimestamp(long timestamp)
    • getTimestamp

      public long getTimestamp()
    • setProjectName

      public void setProjectName(String projectName)
    • getProjectName

      public String getProjectName()
    • setSuppressionFilter

      public void setSuppressionFilter(@Nonnull Filter suppressionFilter)
    • getSuppressionFilter

      @Nonnull public Filter getSuppressionFilter()
    • setGuiCallback

      public void setGuiCallback(IGuiCallback guiCallback)
    • getGuiCallback

      public IGuiCallback getGuiCallback()
    • getResolvedSourcePaths

      public Iterable<String> getResolvedSourcePaths()
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable