These criteria consist of selectors and patterns which have been specified. With the selectors you can select which files you want to have included. Files which are not selected are excluded. With patterns you can include or exclude files based on their filename.
The idea is simple. A given directory is recursively scanned for all files and directories. Each file/directory is matched against a set of selectors, including special support for matching against filenames with include and and exclude patterns. Only files/directories which match at least one pattern of the include pattern list or other file selector, and don't match any pattern of the exclude pattern list or fail to match against a required selector will be placed in the list of files/directories found.
When no list of include patterns is supplied, "**" will be used, which means that everything will be matched. When no list of exclude patterns is supplied, an empty list is used, such that nothing will be excluded. When no selectors are supplied, none are applied.
The filename pattern matching is done as follows:
The name to be matched is split up in path segments. A path segment is the
name of a directory or file, which is bounded by
File.separator ('/' under UNIX, '\' under Windows).
For example, "abc/def/ghi/xyz.java" is split up in the segments "abc",
"def","ghi" and "xyz.java".
The same is done for the pattern against which should be matched.
The segments of the name and the pattern are then matched against each other. When '**' is used for a path segment in the pattern, it matches zero or more path segments of the name.
There is a special case regarding the use of File.separators
at the beginning of the pattern and the string to match:
File.separator, the string
to match must also start with a File.separator.File.separator, the
string to match may not start with a File.separator.
When a name path segment is matched against a pattern path segment, the
following special characters can be used:
'*' matches zero or more characters
'?' matches one character.
Examples:
"**\*.class" matches all .class files/dirs in a directory tree.
"test\a??.java" matches all files/dirs which start with an 'a', then two more characters and then ".java", in a directory called test.
"**" matches everything in a directory tree.
"**\test\**\XYZ*" matches all files/dirs which start with "XYZ" and where there is a parent directory called test (e.g. "abc\test\def\ghi\XYZ123").
Case sensitivity may be turned off if necessary. By default, it is turned on.
Example of usage:
String[] includes = {"**\\*.class"};
String[] excludes = {"modules\\*\\**"};
ds.setIncludes(includes);
ds.setExcludes(excludes);
ds.setBasedir(new File("test"));
ds.setCaseSensitive(true);
ds.scan();
System.out.println("FILES:");
String[] files = ds.getIncludedFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
This will scan a directory called test for .class files, but excludes all
files in all proper subdirectories of a directory called "modules".
| Modifier and Type | Field and Description |
|---|---|
| private boolean | areNonPatternSetsReady
Have the non-pattern sets and pattern arrays for in- and excludes been initialized? |
| protected File | basedir
The base directory to be scanned. |
| protected static final String[] | DEFAULTEXCLUDES
Patterns which should be excluded by default. |
| private static final Set | defaultExcludes
Patterns which should be excluded by default. |
| protected Vector | dirsDeselected
The directories which matched at least one include and no excludes but which a selector discarded. |
| protected Vector | dirsExcluded
The directories which matched at least one include and at least one exclude. |
| protected Vector | dirsIncluded
The directories which matched at least one include and no excludes and were selected. |
| protected Vector | dirsNotIncluded
The directories which were found and did not match any includes. |
| public static final String | DOES_NOT_EXIST_POSTFIX
The end of the exception message if something that should be there doesn't exist. |
| protected boolean | errorOnMissingDir
Whether a missing base directory is an error. |
| protected boolean | everythingIncluded
Whether or not everything tested so far has been included. |
| private final Map | excludeNonPatterns
Map of all exclude patterns that are full file names and don't contain any wildcards. |
| private TokenizedPattern[] | excludePatterns
Array of all exclude patterns that contain wildcards. |
| protected String[] | excludes
The patterns for the files to be excluded. |
| private static final FileUtils | FILE_UTILS
Helper. |
| protected Vector | filesDeselected
The files which matched at least one include and no excludes and which a selector discarded. |
| protected Vector | filesExcluded
The files which matched at least one include and at least one exclude. |
| protected Vector | filesIncluded
The files which matched at least one include and no excludes and were selected. |
| protected Vector | filesNotIncluded
The files which did not match any includes or selectors. |
| private boolean | followSymlinks
Whether or not symbolic links should be followed. |
| protected boolean | haveSlowResults
Whether or not our results were built by a slow scan. |
| private IllegalStateException | illegal
Exception thrown during scan. |
| private final Map | includeNonPatterns
Map of all include patterns that are full file names and don't contain any wildcards. |
| private TokenizedPattern[] | includePatterns
Array of all include patterns that contain wildcards. |
| protected String[] | includes
The patterns for the files to be included. |
| protected boolean | isCaseSensitive
Whether or not the file system should be treated as a case sensitive one. |
| public static final int | MAX_LEVELS_OF_SYMLINKS
default value for |
| private int | maxLevelsOfSymlinks
The maximum number of times a symbolic link may be followed during a scan. |
| private final Set | notFollowedSymlinks
Absolute paths of all symlinks that haven't been followed but would have been if followsymlinks had been true or maxLevelsOfSymlinks had been higher. |
| private static final boolean | ON_VMS
Is OpenVMS the operating system we're running on? |
| private final Object | scanLock
Scanning lock. |
| private final Set | scannedDirs
List of all scanned directories. |
| private boolean | scanning
Scanning flag. |
| protected FileSelector[] | selectors
Selectors that will filter which files are in our candidate list. |
| private final Object | slowScanLock
Slow scanning lock. |
| private boolean | slowScanning
Slow scanning flag. |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| private void | accountForIncludedDir(final TokenizedPath
path of the directory relative to the directory of
the FileSet. name, final File directory as File. file, final boolean whether to perform fast scans. fast)Process included directory. |
| private void | accountForIncludedDir(final TokenizedPath name, final File file, final boolean fast, final String[] children, final Deque<String> directoryNamesFollowed)
|
| private void | accountForIncludedFile(final TokenizedPath
path of the file relative to the directory of the FileSet. name, final File included File. file)Process included file. |
| private void | |
| private void | |
| public static boolean | Returns: true if the string was added;
false if it already existed.A string to add as an exclude pattern. s)Add a pattern to the default excludes unless it is already a default exclude. |
| public synchronized void | addDefaultExcludes()
Implements org. |
| public synchronized void | addExcludes(final String[]
A list of exclude patterns.
May be excludes)null, in which case the
exclude patterns don't get changed at all.Add to the list of exclude patterns to use. |
| private boolean | causesIllegalSymlinkLoop(final String dirName, final File parent, final Deque<String> directoryNamesFollowed)
Would following the given directory cause a loop of symbolic links deeper than allowed? |
| private void | checkIncludePatterns()
This routine is actually checking all the include patterns in order to avoid scanning everything under base dir. |
| private synchronized void | |
| protected synchronized void | |
| pack-priv boolean | Returns: whether all the specified directory's contents are excluded.the path to check. path)Test whether all contents of the specified directory must be excluded. |
| protected boolean | Returns: true when the name matches against the start of at
least one include pattern, or false otherwise.The name to match. Must not be name)null.Test whether or not a name matches the start of at least one include pattern. |
| private boolean | Returns: true when the name matches against the start of at
least one include pattern, or false otherwise.The name to match. Must not be tokenizedName)null.Test whether or not a name matches the start of at least one include pattern. |
| private boolean | Returns: true when the name matches against the start of the
include pattern, or false otherwise.The name to match. Must not be tokenizedName, final TokenizedPattern tokenizedInclude)null.Test whether or not a name matches the start of the given include pattern. |
| pack-priv synchronized void | |
| private TokenizedPattern[] | fillNonPatternSet(final Map<String, TokenizedPath>
Map to populate. map, final String[] String[] of patterns. patterns)Add all patterns that are not real patterns (do not contain wildcards) to the set and returns the real patterns. |
| public synchronized File | Returns: the base directory to be scanned.Implements org. |
| public static String[] | Returns: An array ofString based on the current
contents of the defaultExcludes
Set.Get the list of patterns that should be excluded by default. |
| public synchronized String[] | Returns: the names of the directories which were deselected.Implements org. Return the names of the directories which were selected out and therefore not ultimately included. |
| public synchronized String[] | Returns: the names of the files which were deselected.Implements org. Return the names of the files which were selected out and therefore not ultimately included. |
| public synchronized String[] | Returns: the names of the directories which matched at least one of the include patterns and at least one of the exclude patterns.Implements org. |
| public synchronized String[] | Returns: the names of the files which matched at least one of the include patterns and at least one of the exclude patterns.Implements org. |
| public String[] | Returns: the names of the directories which matched at least one of the include patterns and none of the exclude patterns.Implements org. |
| public synchronized int | |
| public String[] | Returns: the names of the files which matched at least one of the include patterns and none of the exclude patterns.Implements org. |
| public synchronized int | |
| public synchronized String[] | Returns: sorted array of not followed symlinksAbsolute paths of all symbolic links that haven't been followed but would have been followed had followsymlinks been true or maxLevelsOfSymlinks been bigger. |
| public synchronized String[] | Returns: the names of the directories which matched none of the include patterns.Implements org. |
| public synchronized String[] | Returns: the names of the files which matched none of the include patterns.Implements org. |
| public synchronized Resource | Returns: the resource with the given name.path name of the file relative to the dir attribute. name)Implements org. |
| pack-priv Set | Returns: the Set of relative directory names that have been scanned.This method is of interest for testing purposes. |
| private boolean | hasBeenScanned(final String vpath)
Has the directory with the given path relative to the base directory already been scanned? |
| public synchronized boolean | Returns: whether or not the scanning is case sensitive.Find out whether include exclude patterns are matched in a case sensitive way. |
| private boolean | Returns: whether the pattern is deeper than the name.the pattern to check. pattern, final TokenizedPath the name to check. name)Verify that a pattern specifies files deeper than the level of the specified file. |
| public synchronized boolean | Returns: true if all files and directories which have
been found so far have been included.Return whether or not the scanner has included all the files or directories it has come across so far. |
| protected boolean | Returns: true when the name matches against at least one
exclude pattern, or false otherwise.The name to match. Must not be name)null.Test whether or not a name matches against at least one exclude pattern. |
| private boolean | Returns: true when the name matches against at least one
exclude pattern, or false otherwise.The name to match. Must not be name)null.Test whether or not a name matches against at least one exclude pattern. |
| public synchronized boolean | Returns: flag indicating whether symbolic links should be followed.Get whether or not a DirectoryScanner follows symbolic links. |
| protected boolean | Returns: true when the name matches against at least one
include pattern, or false otherwise.The path to match. Must not be name)null.Test whether or not a name matches against at least one include pattern. |
| private boolean | Returns: true when the name matches against at least one
include pattern, or false otherwise.The tokenized path to match. Must not be path)null.Test whether or not a name matches against at least one include pattern. |
| private boolean | Returns: true if there is no exclude pattern more powerful than this include pattern.the relative path to test. name)Find out whether one particular include pattern is more powerful than all the excludes. |
| protected boolean | Returns: false when the selectors says that the file
should not be selected, true otherwise.the filename to check for selecting. name, final File the java.io.File object for this filename. file)Test whether a file should be selected. |
| public static boolean | |
| protected static boolean | Returns: true if the string matches against the pattern,
or false otherwise.The pattern to match against.
Must not be pattern, final String null.The string which must be matched against the pattern.
Must not be str, final boolean null.Whether or not matching should be performed
case sensitively. isCaseSensitive)Test whether or not a string matches against a pattern. |
| protected static boolean | |
| protected static boolean | Returns: true if the pattern matches against the string,
or false otherwise.The pattern to match against. Must not be
pattern, final String null.The path to match, as a String. Must not be
str, final boolean null.Whether or not matching should be performed
case sensitively. isCaseSensitive)Test whether or not a given path matches a given pattern. |
| protected static boolean | Returns: whether or not a given path matches the start of a given pattern up to the first "**".The pattern to match against. Must not be
pattern, final String null.The path to match, as a String. Must not be
str)null.Test whether or not a given path matches the start of a given pattern up to the first "**". |
| protected static boolean | Returns: whether or not a given path matches the start of a given pattern up to the first "**".The pattern to match against. Must not be
pattern, final String null.The path to match, as a String. Must not be
str, final boolean null.Whether or not matching should be performed
case sensitively. isCaseSensitive)Test whether or not a given path matches the start of a given pattern up to the first "**". |
| private static String | normalizePattern(final String p)
All '/' and '\' characters are replaced by
|
| private void | processIncluded(final TokenizedPath path, final File file, final List<String> inc, final List<String> exc, final List<String> des)
|
| private void | |
| public static boolean | Returns: true if s was a default
exclude (and thus was removed);
false if s was not
in the default excludes list to begin with.The string to attempt to remove. s)Remove a string if it is a default exclude. |
| public static void | |
| public void | scan()
Implements org. |
| protected void | scandir(final File
The directory to scan. Must not be dir, final String null.The path relative to the base directory (needed to
prevent problems with an absolute path when using
dir). Must not be vpath, final boolean null.Whether or not this call is part of a fast scan. fast)Scan the given directory for files and directories. |
| private void | scandir(final File
The directory to scan. Must not be dir, final TokenizedPath null.The path relative to the base directory (needed to
prevent problems with an absolute path when using
dir). Must not be path, final boolean null.Whether or not this call is part of a fast scan. fast)Scan the given directory for files and directories. |
| private void | |
| private boolean | |
| public void | setBasedir(final String
The base directory to scan. basedir)Implements org. |
| public synchronized void | setBasedir(final File
The base directory for scanning. basedir)Implements org. |
| public synchronized void | setCaseSensitive(final boolean
whether or not the file system should be
regarded as a case sensitive one. isCaseSensitive)Implements org. |
| public void | setErrorOnMissingDir(final boolean
whether or not a missing base directory
is an error errorOnMissingDir)Sets whether or not a missing base directory is an error |
| public synchronized void | setExcludes(final String[]
A list of exclude patterns.
May be excludes)null, indicating that no files
should be excluded. If a non-null list is
given, all elements must be non-null.Implements org. |
| public synchronized void | setFollowSymlinks(final boolean
whether or not symbolic links should be followed. followSymlinks)Set whether or not symbolic links should be followed. |
| public synchronized void | setIncludes(final String[]
A list of include patterns.
May be includes)null, indicating that all files
should be included. If a non-null
list is given, all elements must be
non-null.Implements org. |
| public void | setMaxLevelsOfSymlinks(final int
int max)The maximum number of times a symbolic link may be followed during a scan. |
| public synchronized void | setSelectors(final FileSelector[]
specifies the selectors to be invoked on a scan. selectors)Implements org. |
| private boolean | shouldSkipPattern(final String pattern)
true if the pattern specifies a relative path without basedir or an absolute path not inside basedir. |
| protected void |