Class Project

  • All Implemented Interfaces:
    XMLWriteable, java.lang.AutoCloseable

    public class Project
    extends java.lang.Object
    implements XMLWriteable, java.lang.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 Detail

      • LOG

        private static final org.slf4j.Logger LOG
      • currentWorkingDirectoryList

        private final java.util.List<java.io.File> currentWorkingDirectoryList
      • projectName

        private java.lang.String projectName
      • analysisTargets

        private java.util.List<java.lang.String> analysisTargets
        List of jars/directories to analyze
      • srcDirList

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

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

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

        private final java.util.Map<java.lang.String,​java.lang.Boolean> enabledPlugins
        key is plugin id
      • UNNAMED_PROJECT

        public static final java.lang.String UNNAMED_PROJECT
        StaticConstant used to name anonymous projects.
        See Also:
        Constant Field Values
      • timestampForAnalyzedClasses

        private long timestampForAnalyzedClasses
      • suppressionFilter

        @Nonnull
        private Filter suppressionFilter
      • AUX_CLASSPATH_ENTRY_ELEMENT_NAME

        static final java.lang.String AUX_CLASSPATH_ENTRY_ELEMENT_NAME
        See Also:
        Constant Field Values
      • SRC_DIR_ELEMENT_NAME

        static final java.lang.String SRC_DIR_ELEMENT_NAME
        See Also:
        Constant Field Values
      • WRK_DIR_ELEMENT_NAME

        static final java.lang.String WRK_DIR_ELEMENT_NAME
        See Also:
        Constant Field Values
      • FILENAME_ATTRIBUTE_NAME

        static final java.lang.String FILENAME_ATTRIBUTE_NAME
        See Also:
        Constant Field Values
      • PROJECTNAME_ATTRIBUTE_NAME

        static final java.lang.String PROJECTNAME_ATTRIBUTE_NAME
        See Also:
        Constant Field Values
      • PLUGIN_ID_ATTRIBUTE_NAME

        static final java.lang.String PLUGIN_ID_ATTRIBUTE_NAME
        See Also:
        Constant Field Values
      • PLUGIN_STATUS_ELEMENT_NAME

        static final java.lang.String PLUGIN_STATUS_ELEMENT_NAME
        See Also:
        Constant Field Values
      • AUX_CLASSPATH_ENTRIES_KEY

        private static final java.lang.String AUX_CLASSPATH_ENTRIES_KEY
        See Also:
        Constant Field Values
      • 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 Detail

      • Project

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

      • getPluginStatus

        @CheckForNull
        public java.lang.Boolean getPluginStatus​(Plugin plugin)
      • setPluginStatusTrinary

        public void setPluginStatusTrinary​(java.lang.String pluginId,
                                           java.lang.Boolean enabled)
      • 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.
      • isGuiAvaliable

        public boolean isGuiAvaliable()
      • add

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

        public static <T> java.util.List<T> appendWithoutDuplicates​(java.util.List<T> lst1,
                                                                    java.util.List<T> lst2)
      • setCurrentWorkingDirectory

        public void setCurrentWorkingDirectory​(java.io.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​(java.lang.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
      • addSourceDirs

        public boolean addSourceDirs​(java.util.Collection<java.lang.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​(java.lang.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 java.lang.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 java.util.List<java.lang.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 java.lang.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 java.lang.String[] getFileArray()
        Get project files as an array of Strings.
      • getSourceDirArray

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

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

        public boolean addAuxClasspathEntry​(java.lang.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 java.lang.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 java.util.List<java.lang.String> getAuxClasspathEntryList()
        Return the list of aux classpath entries.
      • processComponentJar

        private void processComponentJar​(java.net.URL jarFileURL,
                                         Project.WorkList workList,
                                         java.util.List<java.lang.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
      • readXML

        public static Project readXML​(java.io.File f)
                               throws java.io.IOException,
                                      org.xml.sax.SAXException,
                                      javax.xml.parsers.ParserConfigurationException
        Throws:
        java.io.IOException
        org.xml.sax.SAXException
        javax.xml.parsers.ParserConfigurationException
      • writeXML

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

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

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

        public static java.lang.String transformFilename​(java.lang.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 java.io.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:
        java.io.IOException
      • writeXML

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

        private java.lang.Iterable<java.lang.String> convertToRelative​(java.util.List<java.lang.String> paths,
                                                                       java.lang.String base)
      • convertToRelative

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

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

        private java.util.List<java.lang.String> makeAbsoluteCwdCandidates​(java.lang.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​(java.util.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​(java.lang.String projectName)
      • getProjectName

        public java.lang.String getProjectName()
      • setSuppressionFilter

        public void setSuppressionFilter​(@Nonnull
                                         Filter suppressionFilter)
      • getSuppressionFilter

        @Nonnull
        public Filter getSuppressionFilter()
      • setGuiCallback

        public void setGuiCallback​(IGuiCallback guiCallback)
      • getResolvedSourcePaths

        public java.lang.Iterable<java.lang.String> getResolvedSourcePaths()
      • close

        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable