Top Description Fields Constructors Methods
org.apache.sshd.common.util.io

public Class DirectoryScanner

extends PathScanningMatcher
Class Inheritance
Imports
java.io.IOException, java.nio.file.DirectoryStream, .FileSystem, .Files, .Path, java.util.Arrays, .Collection, .Collections, .LinkedList, .Objects, java.util.function.Supplier, org.apache.sshd.common.util.GenericUtils

Class for scanning a directory for files/directories which match certain criteria.

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:
When a pattern starts with a File.separator, the string to match must also start with a File.separator. When a pattern does not start with a File.separator, the string to match may not start with a File.separator. When one of these rules is not obeyed, the string will not match.

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".

Authors
Arnout J. Kuiper [email protected], Magesh Umasankar, Bruce Atherton, Antoine Levy-Lambert

Field Summary

Modifier and TypeField and Description
protected Path
basedir

The base directory to be scanned.

private boolean
Inherited from org.apache.sshd.common.util.io.PathScanningMatcher:
caseSensitiveincludePatternsseparator

Constructor Summary

AccessConstructor and Description
public
public
public
DirectoryScanner(Path dir, String... includes)

public

Method Summary

Modifier and TypeMethod and Description
public Path

Returns:

the base directory to be scanned
getBasedir
()

Returns the base directory to be scanned.

public boolean

Returns:

true if items that are not regular files or subdirectories shall be omitted; false otherwise
isFilesOnly
()

Tells whether the scanner is set to return only files (the default).

public Collection<Path>

Returns:

the matching files
scan
()

Scans the base directory for files which match at least one include pattern and don't match any exclude patterns.

public <C extends Collection<Path>> C
scan(Supplier<? extends C> factory)

protected <
Target matches collection type
C extends Collection<Path>
>
C

Returns:

Updated files list
scandir
(Path
The directory to scan. Must not be null.
rootDir
,
Path
The path relative to the root directory (needed to prevent problems with an absolute path when using dir). Must not be null.
dir
,
C
Target Collection to accumulate the relative path matches
filesList
)

Scans the given directory for files and directories.

public void
setBasedir(Path
The base directory for scanning. Should not be null.
basedir
)

Sets the base directory to be scanned.

public void
setFilesOnly(boolean
whether to skip all items that are not regular files
filesOnly
)

Sets whether the scanner shall return only regular files and subdirectories.

Inherited from org.apache.sshd.common.util.io.PathScanningMatcher:
couldHoldIncludedgetIncludesgetSeparatorisCaseSensitiveisIncludednormalizePatternsetCaseSensitivesetIncludessetIncludessetSeparator

Field Detail

basedirback to summary
protected Path basedir

The base directory to be scanned.

filesOnlyback to summary
private boolean filesOnly

Constructor Detail

DirectoryScannerback to summary
public DirectoryScanner()
DirectoryScannerback to summary
public DirectoryScanner(Path dir)
DirectoryScannerback to summary
public DirectoryScanner(Path dir, String... includes)
DirectoryScannerback to summary
public DirectoryScanner(Path dir, Collection<String> includes)

Method Detail

getBasedirback to summary
public Path getBasedir()

Returns the base directory to be scanned. This is the directory which is scanned recursively.

Returns:Path

the base directory to be scanned

isFilesOnlyback to summary
public boolean isFilesOnly()

Tells whether the scanner is set to return only files (the default).

Returns:boolean

true if items that are not regular files or subdirectories shall be omitted; false otherwise

scanback to summary
public Collection<Path> scan() throws IOException, IllegalStateException

Scans the base directory for files which match at least one include pattern and don't match any exclude patterns. If there are selectors then the files must pass muster there, as well.

Returns:Collection<Path>

the matching files

Exceptions
IOException:
if failed to scan the directory (e.g., access denied)
IllegalStateException:
if the base directory was set incorrectly (i.e. if it is null, doesn't exist, or isn't a directory).
scanback to summary
public <C extends Collection<Path>> C scan(Supplier<? extends C> factory) throws IOException, IllegalStateException
scandirback to summary
protected <C extends Collection<Path>> C scandir(Path rootDir, Path dir, C filesList) throws IOException

Scans the given directory for files and directories. Found files and directories are placed in their respective collections, based on the matching of includes, excludes, and the selectors. When a directory is found, it is scanned recursively.

Parameters
<C>
Target matches collection type
rootDir:Path

The directory to scan. Must not be null.

dir:Path

The path relative to the root directory (needed to prevent problems with an absolute path when using dir). Must not be null.

filesList:C

Target Collection to accumulate the relative path matches

Returns:C

Updated files list

Exceptions
IOException:
if failed to scan the directory
setBasedirback to summary
public void setBasedir(Path basedir)

Sets the base directory to be scanned. This is the directory which is scanned recursively.

Parameters
basedir:Path

The base directory for scanning. Should not be null.

setFilesOnlyback to summary
public void setFilesOnly(boolean filesOnly)

Sets whether the scanner shall return only regular files and subdirectories.

Parameters
filesOnly:boolean

whether to skip all items that are not regular files