git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274060 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -58,6 +58,7 @@ import java.io.File; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.util.Vector; | import java.util.Vector; | ||||
| import org.apache.tools.ant.types.Resource; | import org.apache.tools.ant.types.Resource; | ||||
| import org.apache.tools.ant.types.ResourceFactory; | |||||
| import org.apache.tools.ant.types.selectors.FileSelector; | import org.apache.tools.ant.types.selectors.FileSelector; | ||||
| import org.apache.tools.ant.types.selectors.SelectorScanner; | import org.apache.tools.ant.types.selectors.SelectorScanner; | ||||
| import org.apache.tools.ant.types.selectors.SelectorUtils; | import org.apache.tools.ant.types.selectors.SelectorUtils; | ||||
| @@ -151,7 +152,7 @@ import org.apache.tools.ant.util.FileUtils; | |||||
| * @author <a href="mailto:bruce@callenish.com">Bruce Atherton</a> | * @author <a href="mailto:bruce@callenish.com">Bruce Atherton</a> | ||||
| * @author <a href="mailto:levylambert@tiscali-dsl.de">Antoine Levy-Lambert</a> | * @author <a href="mailto:levylambert@tiscali-dsl.de">Antoine Levy-Lambert</a> | ||||
| */ | */ | ||||
| public class DirectoryScanner implements ResourceScanner, SelectorScanner { | |||||
| public class DirectoryScanner implements FileScanner, SelectorScanner, ResourceFactory { | |||||
| /** | /** | ||||
| * Patterns which should be excluded by default. | * Patterns which should be excluded by default. | ||||
| @@ -810,27 +811,6 @@ public class DirectoryScanner implements ResourceScanner, SelectorScanner { | |||||
| return files; | return files; | ||||
| } | } | ||||
| /** | |||||
| * Returns the resources 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 resource information for the files which matched at | |||||
| * least one of the include patterns and none of the exclude | |||||
| * patterns. | |||||
| * | |||||
| * @since Ant 1.5.2 | |||||
| */ | |||||
| public Resource[] getIncludedFileResources() { | |||||
| String[] names = getIncludedFiles(); | |||||
| int count = names.length; | |||||
| Resource[] resources = new Resource[count]; | |||||
| for (int i = 0; i < count; i++) { | |||||
| resources[i] = getResource(names[i]); | |||||
| } | |||||
| return resources; | |||||
| } | |||||
| /** | /** | ||||
| * Returns the names of the files which matched none of the include | * Returns the names of the files which matched none of the include | ||||
| * patterns. The names are relative to the base directory. This involves | * patterns. The names are relative to the base directory. This involves | ||||
| @@ -898,26 +878,6 @@ public class DirectoryScanner implements ResourceScanner, SelectorScanner { | |||||
| return directories; | return directories; | ||||
| } | } | ||||
| /** | |||||
| * Returns the resource object for 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. | |||||
| * | |||||
| * @since Ant 1.5.2 | |||||
| */ | |||||
| public Resource[] getIncludedDirectoryResources() { | |||||
| String[] names = getIncludedDirectories(); | |||||
| int count = names.length; | |||||
| Resource[] resources = new Resource[count]; | |||||
| for (int i = 0; i < count; i++) { | |||||
| resources[i] = getResource(names[i]); | |||||
| } | |||||
| return resources; | |||||
| } | |||||
| /** | /** | ||||
| * Returns the names of the directories which matched none of the include | * Returns the names of the directories which matched none of the include | ||||
| * patterns. The names are relative to the base directory. This involves | * patterns. The names are relative to the base directory. This involves | ||||
| @@ -994,12 +954,7 @@ public class DirectoryScanner implements ResourceScanner, SelectorScanner { | |||||
| * @since Ant 1.5.2 | * @since Ant 1.5.2 | ||||
| */ | */ | ||||
| public Resource getResource(String name) { | public Resource getResource(String name) { | ||||
| File f = null; | |||||
| if (basedir != null) { | |||||
| f = new File(basedir, name); | |||||
| } else { | |||||
| f = new File(name); | |||||
| } | |||||
| File f = fileUtils.resolveFile(basedir, name); | |||||
| return new Resource(name, f.exists(), f.lastModified(), | return new Resource(name, f.exists(), f.lastModified(), | ||||
| f.isDirectory()); | f.isDirectory()); | ||||
| } | } | ||||
| @@ -1,85 +0,0 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "Ant" and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| import org.apache.tools.ant.types.Resource; | |||||
| import org.apache.tools.ant.types.ResourceFactory; | |||||
| /** | |||||
| * Extends the FileScanner concept to {@link | |||||
| * org.apache.tools.ant.types.Resource Resources}. | |||||
| * | |||||
| * @since Ant 1.5.2 | |||||
| */ | |||||
| public interface ResourceScanner extends FileScanner, ResourceFactory { | |||||
| /** | |||||
| * Returns resources for the directories which matched at least | |||||
| * one of the include patterns and none of the exclude patterns. | |||||
| * | |||||
| * @return resources for the directories which matched at least | |||||
| * one of the include patterns and none of the exclude patterns. | |||||
| */ | |||||
| Resource[] getIncludedDirectoryResources(); | |||||
| /** | |||||
| * Returns resources for the files which matched at least one of | |||||
| * the include patterns and none of the exclude patterns. | |||||
| * | |||||
| * @return the names of the files which matched at least one of the | |||||
| * include patterns and none of the exclude patterns. | |||||
| */ | |||||
| Resource[] getIncludedFileResources(); | |||||
| } | |||||
| @@ -70,7 +70,6 @@ import java.util.zip.ZipEntry; | |||||
| import java.util.zip.ZipFile; | import java.util.zip.ZipFile; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.ResourceScanner; | |||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | import org.apache.tools.ant.types.EnumeratedAttribute; | ||||
| import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
| import org.apache.tools.ant.types.Resource; | import org.apache.tools.ant.types.Resource; | ||||
| @@ -73,7 +73,6 @@ import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | import org.apache.tools.ant.DirectoryScanner; | ||||
| import org.apache.tools.ant.FileScanner; | import org.apache.tools.ant.FileScanner; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.ResourceScanner; | |||||
| import org.apache.tools.ant.types.EnumeratedAttribute; | import org.apache.tools.ant.types.EnumeratedAttribute; | ||||
| import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
| import org.apache.tools.ant.types.PatternSet; | import org.apache.tools.ant.types.PatternSet; | ||||
| @@ -441,10 +440,15 @@ public class Zip extends MatchingTask { | |||||
| PatternSet.NameEntry ne = oldFiles.createExclude(); | PatternSet.NameEntry ne = oldFiles.createExclude(); | ||||
| ne.setName((String) addedFiles.elementAt(i)); | ne.setName((String) addedFiles.elementAt(i)); | ||||
| } | } | ||||
| addResources(oldFiles, | |||||
| oldFiles.getDirectoryScanner(getProject()) | |||||
| .getIncludedFileResources(), | |||||
| zOut); | |||||
| DirectoryScanner ds = | |||||
| oldFiles.getDirectoryScanner(getProject()); | |||||
| String[] f = ds.getIncludedFiles(); | |||||
| Resource[] r = new Resource[f.length]; | |||||
| for (int i = 0; i < f.length; i++) { | |||||
| r[i] = ds.getResource(f[i]); | |||||
| } | |||||
| addResources(oldFiles, r, zOut); | |||||
| } | } | ||||
| finalizeZipOutputStream(zOut); | finalizeZipOutputStream(zOut); | ||||
| @@ -801,13 +805,20 @@ public class Zip extends MatchingTask { | |||||
| protected Resource[][] grabResources(FileSet[] filesets) { | protected Resource[][] grabResources(FileSet[] filesets) { | ||||
| Resource[][] result = new Resource[filesets.length][]; | Resource[][] result = new Resource[filesets.length][]; | ||||
| for (int i = 0; i < filesets.length; i++) { | for (int i = 0; i < filesets.length; i++) { | ||||
| ResourceScanner rs = filesets[i].getDirectoryScanner(getProject()); | |||||
| Resource[] files = rs.getIncludedFileResources(); | |||||
| Resource[] directories = rs.getIncludedDirectoryResources(); | |||||
| result[i] = new Resource[files.length + directories.length]; | |||||
| System.arraycopy(directories, 0, result[i], 0, directories.length); | |||||
| System.arraycopy(files, 0, result[i], directories.length, | |||||
| files.length); | |||||
| DirectoryScanner rs = | |||||
| filesets[i].getDirectoryScanner(getProject()); | |||||
| Vector resources = new Vector(); | |||||
| String[] directories = rs.getIncludedDirectories(); | |||||
| for (int j = 0; j < directories.length; j++) { | |||||
| resources.add(rs.getResource(directories[j])); | |||||
| } | |||||
| String[] files = rs.getIncludedFiles(); | |||||
| for (int j = 0; j < files.length; j++) { | |||||
| resources.add(rs.getResource(files[j])); | |||||
| } | |||||
| result[i] = new Resource[resources.size()]; | |||||
| resources.copyInto(result[i]); | |||||
| } | } | ||||
| return result; | return result; | ||||
| } | } | ||||
| @@ -201,66 +201,6 @@ public class ZipScanner extends DirectoryScanner { | |||||
| return isIncluded(vpath) && !isExcluded(vpath); | return isIncluded(vpath) && !isExcluded(vpath); | ||||
| } | } | ||||
| /** | |||||
| * Returns the resources 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 resource information for the files which matched at | |||||
| * least one of the include patterns and none of the exclude | |||||
| * patterns. | |||||
| * | |||||
| * @since Ant 1.5.2 | |||||
| */ | |||||
| public Resource[] getIncludedFileResources() { | |||||
| if (srcFile != null) { | |||||
| Vector myvector = new Vector(); | |||||
| // first check if the archive needs to be scanned again | |||||
| scanme(); | |||||
| for (Enumeration e = myentries.elements(); e.hasMoreElements() ;) { | |||||
| Resource myresource= (Resource) e.nextElement(); | |||||
| if (!myresource.isDirectory() && match(myresource.getName())) { | |||||
| myvector.addElement(myresource.clone()); | |||||
| } | |||||
| } | |||||
| Resource[] resources = new Resource[myvector.size()]; | |||||
| myvector.copyInto(resources); | |||||
| return resources; | |||||
| } else { | |||||
| return super.getIncludedFileResources(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Returns the resources 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 resource information for the files which matched at | |||||
| * least one of the include patterns and none of the exclude | |||||
| * patterns. | |||||
| * | |||||
| * @since Ant 1.5.2 | |||||
| */ | |||||
| public Resource[] getIncludedDirectoryResources() { | |||||
| if (srcFile != null) { | |||||
| Vector myvector = new Vector(); | |||||
| // first check if the archive needs to be scanned again | |||||
| scanme(); | |||||
| for (Enumeration e = myentries.elements(); e.hasMoreElements() ;) { | |||||
| Resource myresource= (Resource) e.nextElement(); | |||||
| if (myresource.isDirectory() && match(myresource.getName())) { | |||||
| myvector.addElement(myresource.clone()); | |||||
| } | |||||
| } | |||||
| Resource[] resources = new Resource[myvector.size()]; | |||||
| myvector.copyInto(resources); | |||||
| return resources; | |||||
| } else { | |||||
| return super.getIncludedDirectoryResources(); | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * @param name path name of the file sought in the archive | * @param name path name of the file sought in the archive | ||||
| * | * | ||||
| @@ -187,20 +187,6 @@ public class DirectoryScannerTest extends TestCase { | |||||
| assertTrue("(1) zip package included", haveZipPackage); | assertTrue("(1) zip package included", haveZipPackage); | ||||
| assertTrue("(1) taskdefs package not included", !haveTaskdefsPackage); | assertTrue("(1) taskdefs package not included", !haveTaskdefsPackage); | ||||
| haveZipPackage = false; | |||||
| Resource[] includedResources = ds.getIncludedDirectoryResources(); | |||||
| for (int i=0; i<includedResources.length; i++) { | |||||
| if (includedResources[i].getName().equals("zip")) { | |||||
| haveZipPackage = true; | |||||
| } else if (includedResources[i].getName().equals("ant" | |||||
| + File.separator | |||||
| + "taskdefs")) { | |||||
| haveTaskdefsPackage = true; | |||||
| } | |||||
| } | |||||
| assertTrue("(1b) zip package included", haveZipPackage); | |||||
| assertTrue("(1b) taskdefs package not included", !haveTaskdefsPackage); | |||||
| ds = new DirectoryScanner(); | ds = new DirectoryScanner(); | ||||
| ds.setBasedir(dir); | ds.setBasedir(dir); | ||||
| ds.setExcludes(new String[] {"ant"}); | ds.setExcludes(new String[] {"ant"}); | ||||
| @@ -216,22 +202,6 @@ public class DirectoryScannerTest extends TestCase { | |||||
| } | } | ||||
| assertTrue("(2) zip package included", haveZipPackage); | assertTrue("(2) zip package included", haveZipPackage); | ||||
| assertTrue("(2) taskdefs package included", haveTaskdefsPackage); | assertTrue("(2) taskdefs package included", haveTaskdefsPackage); | ||||
| haveZipPackage = false; | |||||
| haveTaskdefsPackage = false; | |||||
| includedResources = ds.getIncludedDirectoryResources(); | |||||
| for (int i=0; i<includedResources.length; i++) { | |||||
| if (includedResources[i].getName().equals("zip")) { | |||||
| haveZipPackage = true; | |||||
| } else if (includedResources[i].getName().equals("ant" | |||||
| + File.separator | |||||
| + "taskdefs")) { | |||||
| haveTaskdefsPackage = true; | |||||
| } | |||||
| } | |||||
| assertTrue("(2b) zip package included", haveZipPackage); | |||||
| assertTrue("(2b) taskdefs package included", haveTaskdefsPackage); | |||||
| } | } | ||||
| } | } | ||||