FileDocCategorySizeDatePackage
ArchiveScanner.javaAPI DocApache Ant 1.7010586Wed Dec 13 06:16:22 GMT 2006org.apache.tools.ant.types

ArchiveScanner

public abstract class ArchiveScanner extends org.apache.tools.ant.DirectoryScanner
ArchiveScanner accesses the pattern matching algorithm in DirectoryScanner, which are protected methods that can only be accessed by subclassing. This implementation of FileScanner defines getIncludedFiles to return the matching archive entries.
since
Ant 1.7

Fields Summary
protected File
srcFile
The archive file which should be scanned.
private Resource
src
The archive resource which should be scanned.
private Resource
lastScannedResource
to record the last scanned zip file with its modification date
private TreeMap
fileEntries
record list of all file zip entries
private TreeMap
dirEntries
record list of all directory zip entries
private TreeMap
matchFileEntries
record list of matching file zip entries
private TreeMap
matchDirEntries
record list of matching directory zip entries
private String
encoding
encoding of file names.
Constructors Summary
Methods Summary
protected abstract voidfillMapsFromArchive(Resource archive, java.lang.String encoding, java.util.Map fileEntries, java.util.Map matchFileEntries, java.util.Map dirEntries, java.util.Map matchDirEntries)
Fills the file and directory maps with resources read from the archive.

param
archive the archive to scan.
param
encoding encoding used to encode file names inside the archive.
param
fileEntries Map (name to resource) of non-directory resources found inside the archive.
param
matchFileEntries Map (name to resource) of non-directory resources found inside the archive that matched all include patterns and didn't match any exclude patterns.
param
dirEntries Map (name to resource) of directory resources found inside the archive.
param
matchDirEntries Map (name to resource) of directory resources found inside the archive that matched all include patterns and didn't match any exclude patterns.

public java.lang.String[]getIncludedDirectories()
Returns the names of the directories which matched at least one of the include patterns and none of the exclude patterns. The names are relative to the base directory.

return
the names of the directories which matched at least one of the include patterns and none of the exclude patterns.

        if (src == null) {
            return super.getIncludedDirectories();
        }
        scanme();
        Set s = matchDirEntries.keySet();
        return (String[]) (s.toArray(new String[s.size()]));
    
public intgetIncludedDirsCount()
Override parent implementation.

return
count of included directories.
since
Ant 1.7

        if (src == null) {
            return super.getIncludedDirsCount();
        }
        scanme();
        return matchDirEntries.size();
    
public java.lang.String[]getIncludedFiles()
Returns the names of the files which matched at least one of the include patterns and none of the exclude patterns. The names are relative to the base directory.

return
the names of the files which matched at least one of the include patterns and none of the exclude patterns.

        if (src == null) {
            return super.getIncludedFiles();
        }
        scanme();
        Set s = matchFileEntries.keySet();
        return (String[]) (s.toArray(new String[s.size()]));
    
public intgetIncludedFilesCount()
Override parent implementation.

return
count of included files.
since
Ant 1.7

        if (src == null) {
            return super.getIncludedFilesCount();
        }
        scanme();
        return matchFileEntries.size();
    
public ResourcegetResource(java.lang.String name)
Get the named Resource.

param
name path name of the file sought in the archive
return
the resource
since
Ant 1.5.2

        if (src == null) {
            return super.getResource(name);
        }
        if (name.equals("")) {
            // special case in ZIPs, we do not want this thing included
            return new Resource("", true, Long.MAX_VALUE, true);
        }
        // first check if the archive needs to be scanned again
        scanme();
        if (fileEntries.containsKey(name)) {
            return (Resource) fileEntries.get(name);
        }
        name = trimSeparator(name);

        if (dirEntries.containsKey(name)) {
            return (Resource) dirEntries.get(name);
        }
        return new Resource(name);
    
java.util.IteratorgetResourceDirectories()
Get the set of Resources that represent directories.

return
an Iterator of Resources.
since
Ant 1.7

        if (src == null) {
            return new FileResourceIterator(getBasedir(), getIncludedDirectories());
        }
        scanme();
        return matchDirEntries.values().iterator();
    
java.util.IteratorgetResourceFiles()
Get the set of Resources that represent files.

return
an Iterator of Resources.
since
Ant 1.7

        if (src == null) {
            return new FileResourceIterator(getBasedir(), getIncludedFiles());
        }
        scanme();
        return matchFileEntries.values().iterator();
    
public voidinit()
Initialize DirectoryScanner data structures.

        if (includes == null) {
            // No includes supplied, so set it to 'matches all'
            includes = new String[1];
            includes[0] = "**";
        }
        if (excludes == null) {
            excludes = new String[0];
        }
    
public booleanmatch(java.lang.String path)
Matches a jar entry against the includes/excludes list, normalizing the path separator.

param
path the (non-null) path name to test for inclusion
return
true if the path should be included false otherwise.

        String vpath = path.replace('/", File.separatorChar).
            replace('\\", File.separatorChar);
        return isIncluded(vpath) && !isExcluded(vpath);
    
public voidscan()
Don't scan when we have no zipfile.

since
Ant 1.7


                   
       
        if (src == null) {
            return;
        }
        super.scan();
    
private voidscanme()
if the datetime of the archive did not change since lastScannedResource was initialized returns immediately else if the archive has not been scanned yet, then all the zip entries are put into the appropriate tables.

        //do not use a FileResource b/c it pulls File info from the filesystem:
        Resource thisresource = new Resource(src.getName(),
                                             src.isExists(),
                                             src.getLastModified());
        // spare scanning again and again
        if (lastScannedResource != null
            && lastScannedResource.getName().equals(thisresource.getName())
            && lastScannedResource.getLastModified()
            == thisresource.getLastModified()) {
            return;
        }
        init();

        fileEntries.clear();
        dirEntries.clear();
        matchFileEntries.clear();
        matchDirEntries.clear();
        fillMapsFromArchive(src, encoding, fileEntries, matchFileEntries,
                            dirEntries, matchDirEntries);

        // record data about the last scanned resource
        lastScannedResource = thisresource;
    
public voidsetEncoding(java.lang.String encoding)
Sets encoding of file names.

param
encoding the encoding format
since
Ant 1.6

        this.encoding = encoding;
    
public voidsetSrc(java.io.File srcFile)
Sets the srcFile for scanning. This is the jar or zip file that is scanned for matching entries.

param
srcFile the (non-null) archive file name for scanning

        setSrc(new FileResource(srcFile));
    
public voidsetSrc(Resource src)
Sets the src for scanning. This is the jar or zip file that is scanned for matching entries.

param
src the (non-null) archive resource

        this.src = src;
        if (src instanceof FileResource) {
            srcFile = ((FileResource) src).getFile();
        }
    
protected static final java.lang.StringtrimSeparator(java.lang.String s)
Remove trailing slash if present.

param
s the file name to trim.
return
the trimed file name.

        return s.endsWith("/") ? s.substring(0, s.length() - 1) : s;