FileDocCategorySizeDatePackage
Expand.javaAPI DocApache Ant 1.7013299Wed Dec 13 06:16:22 GMT 2006org.apache.tools.ant.taskdefs

Expand

public class Expand extends org.apache.tools.ant.Task
Unzip a file.
since
Ant 1.1
ant.task
category="packaging" name="unzip" name="unjar" name="unwar"

Fields Summary
private File
dest
private File
source
private boolean
overwrite
private org.apache.tools.ant.types.Mapper
mapperElement
private Vector
patternsets
private org.apache.tools.ant.types.resources.Union
resources
private boolean
resourcesSpecified
private static final String
NATIVE_ENCODING
private String
encoding
public static final String
ERROR_MULTIPLE_MAPPERS
Error message when more that one mapper is defined
private static final org.apache.tools.ant.util.FileUtils
FILE_UTILS
Constructors Summary
Methods Summary
public voidadd(org.apache.tools.ant.types.ResourceCollection rc)
Add a resource collection.

param
rc a resource collection.
since
Ant 1.7

        resourcesSpecified = true;
        resources.add(rc);
    
public voidadd(org.apache.tools.ant.util.FileNameMapper fileNameMapper)
A nested filenamemapper

param
fileNameMapper the mapper to add
since
Ant 1.6.3

        createMapper().add(fileNameMapper);
    
public voidaddFileset(org.apache.tools.ant.types.FileSet set)
Add a fileset

param
set a file set

        add(set);
    
public voidaddPatternset(org.apache.tools.ant.types.PatternSet set)
Add a patternset.

param
set a pattern set

        patternsets.addElement(set);
    
public org.apache.tools.ant.types.MappercreateMapper()
Defines the mapper to map source entries to destination files.

return
a mapper to be configured
exception
BuildException if more than one mapper is defined
since
Ant1.7

        if (mapperElement != null) {
            throw new BuildException(ERROR_MULTIPLE_MAPPERS,
                                     getLocation());
        }
        mapperElement = new Mapper(getProject());
        return mapperElement;
    
public voidexecute()
Do the work.

exception
BuildException Thrown in unrecoverable error.


                  
         
        if ("expand".equals(getTaskType())) {
            log("!! expand is deprecated. Use unzip instead. !!");
        }

        if (source == null && !resourcesSpecified) {
            throw new BuildException("src attribute and/or resources must be "
                                     + "specified");
        }

        if (dest == null) {
            throw new BuildException(
                "Dest attribute must be specified");
        }

        if (dest.exists() && !dest.isDirectory()) {
            throw new BuildException("Dest must be a directory.", getLocation());
        }

        if (source != null) {
            if (source.isDirectory()) {
                throw new BuildException("Src must not be a directory."
                    + " Use nested filesets instead.", getLocation());
            } else {
                expandFile(FILE_UTILS, source, dest);
            }
        }
        Iterator iter = resources.iterator();
        while (iter.hasNext()) {
            Resource r = (Resource) iter.next();
            if (!r.isExists()) {
                continue;
            }

            if (r instanceof FileResource) {
                expandFile(FILE_UTILS, ((FileResource) r).getFile(), dest);
            } else {
                expandResource(r, dest);
            }
        }
    
protected voidexpandFile(org.apache.tools.ant.util.FileUtils fileUtils, java.io.File srcF, java.io.File dir)
This method is to be overridden by extending unarchival tasks.

param
fileUtils the fileUtils
param
srcF the source file
param
dir the destination directory

        log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
        ZipFile zf = null;
        FileNameMapper mapper = getMapper();
        try {
            zf = new ZipFile(srcF, encoding);
            Enumeration e = zf.getEntries();
            while (e.hasMoreElements()) {
                ZipEntry ze = (ZipEntry) e.nextElement();
                extractFile(fileUtils, srcF, dir, zf.getInputStream(ze),
                            ze.getName(), new Date(ze.getTime()),
                            ze.isDirectory(), mapper);
            }

            log("expand complete", Project.MSG_VERBOSE);
        } catch (IOException ioe) {
            throw new BuildException("Error while expanding " + srcF.getPath(),
                                     ioe);
        } finally {
            ZipFile.closeQuietly(zf);
        }
    
protected voidexpandResource(org.apache.tools.ant.types.Resource srcR, java.io.File dir)
This method is to be overridden by extending unarchival tasks.

param
srcR the source resource
param
dir the destination directory

        throw new BuildException("only filesystem based resources are"
                                 + " supported by this task.");
    
protected voidextractFile(org.apache.tools.ant.util.FileUtils fileUtils, java.io.File srcF, java.io.File dir, java.io.InputStream compressedInputStream, java.lang.String entryName, java.util.Date entryDate, boolean isDirectory, org.apache.tools.ant.util.FileNameMapper mapper)
extract a file to a directory

param
fileUtils a fileUtils object
param
srcF the source file
param
dir the destination directory
param
compressedInputStream the input stream
param
entryName the name of the entry
param
entryDate the date of the entry
param
isDirectory if this is true the entry is a directory
param
mapper the filename mapper to use
throws
IOException on error


        if (patternsets != null && patternsets.size() > 0) {
            String name = entryName.replace('/", File.separatorChar)
                .replace('\\", File.separatorChar);
            boolean included = false;
            Set includePatterns = new HashSet();
            Set excludePatterns = new HashSet();
            for (int v = 0, size = patternsets.size(); v < size; v++) {
                PatternSet p = (PatternSet) patternsets.elementAt(v);
                String[] incls = p.getIncludePatterns(getProject());
                if (incls == null || incls.length == 0) {
                    // no include pattern implicitly means includes="**"
                    incls = new String[] {"**"};
                }

                for (int w = 0; w < incls.length; w++) {
                    String pattern = incls[w].replace('/", File.separatorChar)
                        .replace('\\", File.separatorChar);
                    if (pattern.endsWith(File.separator)) {
                        pattern += "**";
                    }
                    includePatterns.add(pattern);
                }

                String[] excls = p.getExcludePatterns(getProject());
                if (excls != null) {
                    for (int w = 0; w < excls.length; w++) {
                        String pattern = excls[w]
                            .replace('/", File.separatorChar)
                            .replace('\\", File.separatorChar);
                        if (pattern.endsWith(File.separator)) {
                            pattern += "**";
                        }
                        excludePatterns.add(pattern);
                    }
                }
            }

            for (Iterator iter = includePatterns.iterator();
                 !included && iter.hasNext();) {
                String pattern = (String) iter.next();
                included = SelectorUtils.matchPath(pattern, name);
            }

            for (Iterator iter = excludePatterns.iterator();
                 included && iter.hasNext();) {
                String pattern = (String) iter.next();
                included = !SelectorUtils.matchPath(pattern, name);
            }

            if (!included) {
                //Do not process this file
                return;
            }
        }
        String[] mappedNames = mapper.mapFileName(entryName);
        if (mappedNames == null || mappedNames.length == 0) {
            mappedNames = new String[] {entryName};
        }
        File f = fileUtils.resolveFile(dir, mappedNames[0]);
        try {
            if (!overwrite && f.exists()
                && f.lastModified() >= entryDate.getTime()) {
                log("Skipping " + f + " as it is up-to-date",
                    Project.MSG_DEBUG);
                return;
            }

            log("expanding " + entryName + " to " + f,
                Project.MSG_VERBOSE);
            // create intermediary directories - sometimes zip don't add them
            File dirF = f.getParentFile();
            if (dirF != null) {
                dirF.mkdirs();
            }

            if (isDirectory) {
                f.mkdirs();
            } else {
                byte[] buffer = new byte[1024];
                int length = 0;
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(f);

                    while ((length =
                            compressedInputStream.read(buffer)) >= 0) {
                        fos.write(buffer, 0, length);
                    }

                    fos.close();
                    fos = null;
                } finally {
                    FileUtils.close(fos);
                }
            }

            fileUtils.setFileLastModified(f, entryDate.getTime());
        } catch (FileNotFoundException ex) {
            log("Unable to expand to file " + f.getPath(), Project.MSG_WARN);
        }

    
protected org.apache.tools.ant.util.FileNameMappergetMapper()
get a mapper for a file

return
a filenamemapper for a file

        FileNameMapper mapper = null;
        if (mapperElement != null) {
            mapper = mapperElement.getImplementation();
        } else {
            mapper = new IdentityMapper();
        }
        return mapper;
    
public voidsetDest(java.io.File d)
Set the destination directory. File will be unzipped into the destination directory.

param
d Path to the directory.

        this.dest = d;
    
public voidsetEncoding(java.lang.String encoding)
Sets the encoding to assume for file names and comments.

Set to native-encoding if you want your platform's native encoding, defaults to UTF8.

param
encoding the name of the character encoding
since
Ant 1.6

        if (NATIVE_ENCODING.equals(encoding)) {
            encoding = null;
        }
        this.encoding = encoding;
    
public voidsetOverwrite(boolean b)
Should we overwrite files in dest, even if they are newer than the corresponding entries in the archive?

param
b a boolean value

        overwrite = b;
    
public voidsetSrc(java.io.File s)
Set the path to zip-file.

param
s Path to zip-file.

        this.source = s;