interchangeable. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272294 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1168,6 +1168,7 @@ | |||||
| <exclude name="${regexp.package}/RegexpMatcherTest.java" /> | <exclude name="${regexp.package}/RegexpMatcherTest.java" /> | ||||
| <exclude name="${regexp.package}/RegexpTest.java" /> | <exclude name="${regexp.package}/RegexpTest.java" /> | ||||
| <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | ||||
| <exclude name="${ant.package}/types/AbstractFileSetTest.java" /> | |||||
| <!-- helper classes, not testcases --> | <!-- helper classes, not testcases --> | ||||
| <exclude name="org/example/**" /> | <exclude name="org/example/**" /> | ||||
| @@ -0,0 +1,350 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2002 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 "The Jakarta Project", "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.types; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.FileScanner; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | |||||
| import java.io.File; | |||||
| import java.util.Stack; | |||||
| import java.util.Vector; | |||||
| /** | |||||
| * Class that holds an implicit patternset and supports nested | |||||
| * patternsets and creates a DirectoryScanner using these patterns. | |||||
| * | |||||
| * <p>Common base class for DirSet and FileSet.</p> | |||||
| * | |||||
| * @author <a href="mailto:ajkuiper@wxs.nl">Arnout J. Kuiper</a> | |||||
| * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a> | |||||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | |||||
| * @author <a href="mailto:jon@clearink.com">Jon S. Stevens</a> | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||||
| */ | |||||
| public abstract class AbstractFileSet extends DataType implements Cloneable { | |||||
| private PatternSet defaultPatterns = new PatternSet(); | |||||
| private Vector additionalPatterns = new Vector(); | |||||
| private File dir; | |||||
| private boolean useDefaultExcludes = true; | |||||
| private boolean isCaseSensitive = true; | |||||
| public AbstractFileSet() { | |||||
| super(); | |||||
| } | |||||
| protected AbstractFileSet(AbstractFileSet fileset) { | |||||
| this.dir = fileset.dir; | |||||
| this.defaultPatterns = fileset.defaultPatterns; | |||||
| this.additionalPatterns = fileset.additionalPatterns; | |||||
| this.useDefaultExcludes = fileset.useDefaultExcludes; | |||||
| this.isCaseSensitive = fileset.isCaseSensitive; | |||||
| setProject(getProject()); | |||||
| } | |||||
| /** | |||||
| * Makes this instance in effect a reference to another instance. | |||||
| * | |||||
| * <p>You must not set another attribute or nest elements inside | |||||
| * this element if you make it a reference.</p> | |||||
| */ | |||||
| public void setRefid(Reference r) throws BuildException { | |||||
| if (dir != null || defaultPatterns.hasPatterns()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| if (!additionalPatterns.isEmpty()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| super.setRefid(r); | |||||
| } | |||||
| /** | |||||
| * Sets the base-directory for this instance. | |||||
| */ | |||||
| public void setDir(File dir) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| this.dir = dir; | |||||
| } | |||||
| /** | |||||
| * Retrieves the base-directory for this instance. | |||||
| */ | |||||
| public File getDir(Project p) { | |||||
| if (isReference()) { | |||||
| return getRef(p).getDir(p); | |||||
| } | |||||
| return dir; | |||||
| } | |||||
| /** | |||||
| * Creates a nested patternset. | |||||
| */ | |||||
| public PatternSet createPatternSet() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| PatternSet patterns = new PatternSet(); | |||||
| additionalPatterns.addElement(patterns); | |||||
| return patterns; | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include list | |||||
| */ | |||||
| public PatternSet.NameEntry createInclude() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createInclude(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include files list | |||||
| */ | |||||
| public PatternSet.NameEntry createIncludesFile() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createIncludesFile(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the exclude list | |||||
| */ | |||||
| public PatternSet.NameEntry createExclude() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createExclude(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include files list | |||||
| */ | |||||
| public PatternSet.NameEntry createExcludesFile() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createExcludesFile(); | |||||
| } | |||||
| /** | |||||
| * Appends <code>includes</code> to the current list of include | |||||
| * patterns. | |||||
| * | |||||
| * <p>Patterns may be separated by a comma or a space.</p> | |||||
| * | |||||
| * @param includes the string containing the include patterns | |||||
| */ | |||||
| public void setIncludes(String includes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setIncludes(includes); | |||||
| } | |||||
| /** | |||||
| * Appends <code>excludes</code> to the current list of exclude | |||||
| * patterns. | |||||
| * | |||||
| * <p>Patterns may be separated by a comma or a space.</p> | |||||
| * | |||||
| * @param excludes the string containing the exclude patterns | |||||
| */ | |||||
| public void setExcludes(String excludes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setExcludes(excludes); | |||||
| } | |||||
| /** | |||||
| * Sets the name of the file containing the includes patterns. | |||||
| * | |||||
| * @param incl The file to fetch the include patterns from. | |||||
| */ | |||||
| public void setIncludesfile(File incl) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setIncludesfile(incl); | |||||
| } | |||||
| /** | |||||
| * Sets the name of the file containing the includes patterns. | |||||
| * | |||||
| * @param excl The file to fetch the exclude patterns from. | |||||
| */ | |||||
| public void setExcludesfile(File excl) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setExcludesfile(excl); | |||||
| } | |||||
| /** | |||||
| * Sets whether default exclusions should be used or not. | |||||
| * | |||||
| * @param useDefaultExcludes "true"|"on"|"yes" when default exclusions | |||||
| * should be used, "false"|"off"|"no" when they | |||||
| * shouldn't be used. | |||||
| */ | |||||
| public void setDefaultexcludes(boolean useDefaultExcludes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| this.useDefaultExcludes = useDefaultExcludes; | |||||
| } | |||||
| /** | |||||
| * Sets case sensitivity of the file system | |||||
| * | |||||
| * @param isCaseSensitive "true"|"on"|"yes" if file system is case | |||||
| * sensitive, "false"|"off"|"no" when not. | |||||
| */ | |||||
| public void setCaseSensitive(boolean isCaseSensitive) { | |||||
| this.isCaseSensitive = isCaseSensitive; | |||||
| } | |||||
| /** | |||||
| * sets the name used for this datatype instance. | |||||
| */ | |||||
| protected abstract String getDataTypeName(); | |||||
| /** | |||||
| * Returns the directory scanner needed to access the files to process. | |||||
| */ | |||||
| public DirectoryScanner getDirectoryScanner(Project p) { | |||||
| if (isReference()) { | |||||
| return getRef(p).getDirectoryScanner(p); | |||||
| } | |||||
| if (dir == null) { | |||||
| throw new BuildException("No directory specified for " | |||||
| + getDataTypeName() + "."); | |||||
| } | |||||
| if (!dir.exists()) { | |||||
| throw new BuildException(dir.getAbsolutePath()+" not found."); | |||||
| } | |||||
| if (!dir.isDirectory()) { | |||||
| throw new BuildException(dir.getAbsolutePath() | |||||
| +" is not a directory."); | |||||
| } | |||||
| DirectoryScanner ds = new DirectoryScanner(); | |||||
| setupDirectoryScanner(ds, p); | |||||
| ds.scan(); | |||||
| return ds; | |||||
| } | |||||
| public void setupDirectoryScanner(FileScanner ds, Project p) { | |||||
| if (ds == null) { | |||||
| throw new IllegalArgumentException("ds cannot be null"); | |||||
| } | |||||
| ds.setBasedir(dir); | |||||
| final int count = additionalPatterns.size(); | |||||
| for (int i = 0; i < count; i++) { | |||||
| Object o = additionalPatterns.elementAt(i); | |||||
| defaultPatterns.append((PatternSet) o, p); | |||||
| } | |||||
| p.log(getDataTypeName() + ": Setup scanner in dir " + dir + | |||||
| " with " + defaultPatterns, Project.MSG_DEBUG ); | |||||
| ds.setIncludes(defaultPatterns.getIncludePatterns(p)); | |||||
| ds.setExcludes(defaultPatterns.getExcludePatterns(p)); | |||||
| if (useDefaultExcludes) { | |||||
| ds.addDefaultExcludes(); | |||||
| } | |||||
| ds.setCaseSensitive(isCaseSensitive); | |||||
| } | |||||
| /** | |||||
| * Performs the check for circular references and returns the | |||||
| * referenced FileSet. | |||||
| */ | |||||
| protected AbstractFileSet getRef(Project p) { | |||||
| if (!checked) { | |||||
| Stack stk = new Stack(); | |||||
| stk.push(this); | |||||
| dieOnCircularReference(stk, p); | |||||
| } | |||||
| Object o = ref.getReferencedObject(p); | |||||
| if (!getClass().isAssignableFrom(o.getClass())) { | |||||
| String msg = ref.getRefId()+" doesn\'t denote a " | |||||
| + getDataTypeName(); | |||||
| throw new BuildException(msg); | |||||
| } else { | |||||
| return (AbstractFileSet) o; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -60,16 +60,18 @@ package org.apache.tools.ant.types; | |||||
| * | * | ||||
| * @since Ant 1.5 | * @since Ant 1.5 | ||||
| */ | */ | ||||
| public class DirSet extends FileSet { | |||||
| public class DirSet extends AbstractFileSet { | |||||
| public DirSet() { | public DirSet() { | ||||
| super(); | super(); | ||||
| setDataTypeName("dirset"); | |||||
| } | } | ||||
| protected DirSet(DirSet dirset) { | protected DirSet(DirSet dirset) { | ||||
| super(dirset); | super(dirset); | ||||
| setDataTypeName("dirset"); | |||||
| } | |||||
| protected String getDataTypeName() { | |||||
| return "dirset"; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -54,15 +54,6 @@ | |||||
| package org.apache.tools.ant.types; | package org.apache.tools.ant.types; | ||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.FileScanner; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | |||||
| import java.io.File; | |||||
| import java.util.Stack; | |||||
| import java.util.Vector; | |||||
| /** | /** | ||||
| * Moved out of MatchingTask to make it a standalone object that could | * Moved out of MatchingTask to make it a standalone object that could | ||||
| * be referenced (by scripts for example). | * be referenced (by scripts for example). | ||||
| @@ -74,265 +65,18 @@ import java.util.Vector; | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
| */ | */ | ||||
| public class FileSet extends DataType implements Cloneable { | |||||
| public class FileSet extends AbstractFileSet { | |||||
| private PatternSet defaultPatterns = new PatternSet(); | |||||
| private Vector additionalPatterns = new Vector(); | |||||
| private File dir; | |||||
| private boolean useDefaultExcludes = true; | |||||
| private boolean isCaseSensitive = true; | |||||
| private String dataTypeName = "fileset"; | |||||
| public FileSet() { | public FileSet() { | ||||
| super(); | super(); | ||||
| } | } | ||||
| protected FileSet(FileSet fileset) { | protected FileSet(FileSet fileset) { | ||||
| this.dir = fileset.dir; | |||||
| this.defaultPatterns = fileset.defaultPatterns; | |||||
| this.additionalPatterns = fileset.additionalPatterns; | |||||
| this.useDefaultExcludes = fileset.useDefaultExcludes; | |||||
| this.isCaseSensitive = fileset.isCaseSensitive; | |||||
| setProject(getProject()); | |||||
| } | |||||
| /** | |||||
| * Makes this instance in effect a reference to another PatternSet | |||||
| * instance. | |||||
| * | |||||
| * <p>You must not set another attribute or nest elements inside | |||||
| * this element if you make it a reference.</p> | |||||
| */ | |||||
| public void setRefid(Reference r) throws BuildException { | |||||
| if (dir != null || defaultPatterns.hasPatterns()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| if (!additionalPatterns.isEmpty()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| super.setRefid(r); | |||||
| } | |||||
| public void setDir(File dir) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| this.dir = dir; | |||||
| } | |||||
| public File getDir(Project p) { | |||||
| if (isReference()) { | |||||
| return getRef(p).getDir(p); | |||||
| } | |||||
| return dir; | |||||
| } | |||||
| public PatternSet createPatternSet() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| PatternSet patterns = new PatternSet(); | |||||
| additionalPatterns.addElement(patterns); | |||||
| return patterns; | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include list | |||||
| */ | |||||
| public PatternSet.NameEntry createInclude() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createInclude(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include files list | |||||
| */ | |||||
| public PatternSet.NameEntry createIncludesFile() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createIncludesFile(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the exclude list | |||||
| */ | |||||
| public PatternSet.NameEntry createExclude() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createExclude(); | |||||
| } | |||||
| /** | |||||
| * add a name entry on the include files list | |||||
| */ | |||||
| public PatternSet.NameEntry createExcludesFile() { | |||||
| if (isReference()) { | |||||
| throw noChildrenAllowed(); | |||||
| } | |||||
| return defaultPatterns.createExcludesFile(); | |||||
| } | |||||
| /** | |||||
| * Appends <code>includes</code> to the current list of include patterns. | |||||
| * Patterns may be separated by a comma or a space. | |||||
| * | |||||
| * @param includes the string containing the include patterns | |||||
| */ | |||||
| public void setIncludes(String includes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setIncludes(includes); | |||||
| super(fileset); | |||||
| } | } | ||||
| /** | |||||
| * Appends <code>excludes</code> to the current list of exclude patterns. | |||||
| * Patterns may be separated by a comma or a space. | |||||
| * | |||||
| * @param excludes the string containing the exclude patterns | |||||
| */ | |||||
| public void setExcludes(String excludes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setExcludes(excludes); | |||||
| } | |||||
| /** | |||||
| * Sets the name of the file containing the includes patterns. | |||||
| * | |||||
| * @param incl The file to fetch the include patterns from. | |||||
| */ | |||||
| public void setIncludesfile(File incl) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setIncludesfile(incl); | |||||
| } | |||||
| /** | |||||
| * Sets the name of the file containing the includes patterns. | |||||
| * | |||||
| * @param excl The file to fetch the exclude patterns from. | |||||
| */ | |||||
| public void setExcludesfile(File excl) throws BuildException { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| defaultPatterns.setExcludesfile(excl); | |||||
| } | |||||
| /** | |||||
| * Sets whether default exclusions should be used or not. | |||||
| * | |||||
| * @param useDefaultExcludes "true"|"on"|"yes" when default exclusions | |||||
| * should be used, "false"|"off"|"no" when they | |||||
| * shouldn't be used. | |||||
| */ | |||||
| public void setDefaultexcludes(boolean useDefaultExcludes) { | |||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| this.useDefaultExcludes = useDefaultExcludes; | |||||
| } | |||||
| /** | |||||
| * Sets case sensitivity of the file system | |||||
| * | |||||
| * @param isCaseSensitive "true"|"on"|"yes" if file system is case | |||||
| * sensitive, "false"|"off"|"no" when not. | |||||
| */ | |||||
| public void setCaseSensitive(boolean isCaseSensitive) { | |||||
| this.isCaseSensitive = isCaseSensitive; | |||||
| } | |||||
| /** | |||||
| * sets the name used for this datatype instance. | |||||
| */ | |||||
| protected final void setDataTypeName(String name) { | |||||
| dataTypeName = name; | |||||
| } | |||||
| /** | |||||
| * Returns the directory scanner needed to access the files to process. | |||||
| */ | |||||
| public DirectoryScanner getDirectoryScanner(Project p) { | |||||
| if (isReference()) { | |||||
| return getRef(p).getDirectoryScanner(p); | |||||
| } | |||||
| if (dir == null) { | |||||
| throw new BuildException("No directory specified for " | |||||
| + dataTypeName + "."); | |||||
| } | |||||
| if (!dir.exists()) { | |||||
| throw new BuildException(dir.getAbsolutePath()+" not found."); | |||||
| } | |||||
| if (!dir.isDirectory()) { | |||||
| throw new BuildException(dir.getAbsolutePath()+" is not a directory."); | |||||
| } | |||||
| DirectoryScanner ds = new DirectoryScanner(); | |||||
| setupDirectoryScanner(ds, p); | |||||
| ds.scan(); | |||||
| return ds; | |||||
| } | |||||
| public void setupDirectoryScanner(FileScanner ds, Project p) { | |||||
| if (ds == null) { | |||||
| throw new IllegalArgumentException("ds cannot be null"); | |||||
| } | |||||
| ds.setBasedir(dir); | |||||
| final int count = additionalPatterns.size(); | |||||
| for (int i = 0; i < count; i++) { | |||||
| Object o = additionalPatterns.elementAt(i); | |||||
| defaultPatterns.append((PatternSet) o, p); | |||||
| } | |||||
| p.log(dataTypeName + ": Setup scanner in dir " + dir + | |||||
| " with " + defaultPatterns, Project.MSG_DEBUG ); | |||||
| ds.setIncludes(defaultPatterns.getIncludePatterns(p)); | |||||
| ds.setExcludes(defaultPatterns.getExcludePatterns(p)); | |||||
| if (useDefaultExcludes) { | |||||
| ds.addDefaultExcludes(); | |||||
| } | |||||
| ds.setCaseSensitive(isCaseSensitive); | |||||
| } | |||||
| /** | |||||
| * Performs the check for circular references and returns the | |||||
| * referenced FileSet. | |||||
| */ | |||||
| protected FileSet getRef(Project p) { | |||||
| if (!checked) { | |||||
| Stack stk = new Stack(); | |||||
| stk.push(this); | |||||
| dieOnCircularReference(stk, p); | |||||
| } | |||||
| Object o = ref.getReferencedObject(p); | |||||
| if (!getClass().isAssignableFrom(o.getClass())) { | |||||
| String msg = ref.getRefId()+" doesn\'t denote a " + dataTypeName; | |||||
| throw new BuildException(msg); | |||||
| } else { | |||||
| return (FileSet) o; | |||||
| } | |||||
| protected String getDataTypeName() { | |||||
| return "fileset"; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -341,7 +85,7 @@ public class FileSet extends DataType implements Cloneable { | |||||
| */ | */ | ||||
| public Object clone() { | public Object clone() { | ||||
| if (isReference()) { | if (isReference()) { | ||||
| return new FileSet(getRef(getProject())); | |||||
| return new FileSet((FileSet) getRef(getProject())); | |||||
| } else { | } else { | ||||
| return new FileSet(this); | return new FileSet(this); | ||||
| } | } | ||||
| @@ -0,0 +1,283 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2002 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 "The Jakarta Project", "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.types; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import junit.framework.TestCase; | |||||
| import junit.framework.AssertionFailedError; | |||||
| import java.io.File; | |||||
| /** | |||||
| * Base class for FileSetTest and DirSetTest. | |||||
| * | |||||
| * <p>This doesn't actually test much, mainly reference handling. | |||||
| * | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
| */ | |||||
| public abstract class AbstractFileSetTest extends TestCase { | |||||
| private Project project; | |||||
| public AbstractFileSetTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| project = new Project(); | |||||
| project.setBasedir("."); | |||||
| } | |||||
| protected abstract AbstractFileSet getInstance(); | |||||
| protected final Project getProject() { | |||||
| return project; | |||||
| } | |||||
| public final void testEmptyElementIfIsReference() { | |||||
| AbstractFileSet f = getInstance(); | |||||
| f.setIncludes("**/*.java"); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to " | |||||
| + f.getDataTypeName() | |||||
| + " with elements from setIncludes"); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.createPatternSet(); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to " | |||||
| + f.getDataTypeName() | |||||
| + " with nested patternset element."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when " | |||||
| + "using refid", be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.createInclude(); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to " | |||||
| + f.getDataTypeName() | |||||
| + " with nested include element."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| try { | |||||
| f.setIncludes("**/*.java"); | |||||
| fail("Can set includes in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setIncludesfile(new File("/a")); | |||||
| fail("Can set includesfile in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setExcludes("**/*.java"); | |||||
| fail("Can set excludes in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setExcludesfile(new File("/a")); | |||||
| fail("Can set excludesfile in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setDir(project.resolveFile(".")); | |||||
| fail("Can set dir in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute " | |||||
| + "when using refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createInclude(); | |||||
| fail("Can add nested include in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using " | |||||
| + "refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createExclude(); | |||||
| fail("Can add nested exclude in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using " | |||||
| + "refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createIncludesFile(); | |||||
| fail("Can add nested includesfile in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using " | |||||
| + "refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createExcludesFile(); | |||||
| fail("Can add nested excludesfile in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using " | |||||
| + "refid", be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createPatternSet(); | |||||
| fail("Can add nested patternset in " | |||||
| + f.getDataTypeName() | |||||
| + " that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using " | |||||
| + "refid", be.getMessage()); | |||||
| } | |||||
| } | |||||
| public void testCircularReferenceCheck() { | |||||
| AbstractFileSet f = getInstance(); | |||||
| project.addReference("dummy", f); | |||||
| f.setRefid(new Reference("dummy")); | |||||
| try { | |||||
| f.getDir(project); | |||||
| fail("Can make " + f.getDataTypeName() | |||||
| + " a Reference to itself."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.getDirectoryScanner(project); | |||||
| fail("Can make " + f.getDataTypeName() | |||||
| + " a Reference to itself."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| // dummy1 --> dummy2 --> dummy3 --> dummy1 | |||||
| AbstractFileSet f1 = getInstance(); | |||||
| project.addReference("dummy1", f1); | |||||
| f1.setRefid(new Reference("dummy2")); | |||||
| AbstractFileSet f2 = getInstance(); | |||||
| project.addReference("dummy2", f2); | |||||
| f2.setRefid(new Reference("dummy3")); | |||||
| AbstractFileSet f3 = getInstance(); | |||||
| project.addReference("dummy3", f3); | |||||
| f3.setRefid(new Reference("dummy1")); | |||||
| try { | |||||
| f1.getDir(project); | |||||
| fail("Can make circular reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f1.getDirectoryScanner(project); | |||||
| fail("Can make circular reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| // dummy1 --> dummy2 --> dummy3 | |||||
| // (which has the Project's basedir as root). | |||||
| f1 = getInstance(); | |||||
| project.addReference("dummy1", f1); | |||||
| f1.setRefid(new Reference("dummy2")); | |||||
| f2 = getInstance(); | |||||
| project.addReference("dummy2", f2); | |||||
| f2.setRefid(new Reference("dummy3")); | |||||
| f3 = getInstance(); | |||||
| project.addReference("dummy3", f3); | |||||
| f3.setDir(project.resolveFile(".")); | |||||
| File dir = f1.getDir(project); | |||||
| assertEquals("Dir is basedir", dir, project.getBaseDir()); | |||||
| } | |||||
| } | |||||
| @@ -61,13 +61,13 @@ import org.apache.tools.ant.BuildException; | |||||
| * | * | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| */ | */ | ||||
| public class DirSetTest extends FileSetTest { | |||||
| public class DirSetTest extends AbstractFileSetTest { | |||||
| public DirSetTest(String name) { | public DirSetTest(String name) { | ||||
| super(name); | super(name); | ||||
| } | } | ||||
| protected FileSet getInstance() { | |||||
| protected AbstractFileSet getInstance() { | |||||
| return new DirSet(); | return new DirSet(); | ||||
| } | } | ||||
| @@ -85,7 +85,6 @@ public class DirSetTest extends FileSetTest { | |||||
| assertEquals("dummy doesn\'t denote a dirset", e.getMessage()); | assertEquals("dummy doesn\'t denote a dirset", e.getMessage()); | ||||
| } | } | ||||
| /* | |||||
| ds = (DirSet) getInstance(); | ds = (DirSet) getInstance(); | ||||
| ds.setProject(getProject()); | ds.setProject(getProject()); | ||||
| getProject().addReference("dummy2", ds); | getProject().addReference("dummy2", ds); | ||||
| @@ -96,7 +95,6 @@ public class DirSetTest extends FileSetTest { | |||||
| } catch (BuildException e) { | } catch (BuildException e) { | ||||
| assertEquals("dummy2 doesn\'t denote a fileset", e.getMessage()); | assertEquals("dummy2 doesn\'t denote a fileset", e.getMessage()); | ||||
| } | } | ||||
| */ | |||||
| } | } | ||||
| } | } | ||||
| @@ -70,188 +70,14 @@ import java.io.File; | |||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| */ | */ | ||||
| public class FileSetTest extends TestCase { | |||||
| private Project project; | |||||
| public class FileSetTest extends AbstractFileSetTest { | |||||
| public FileSetTest(String name) { | public FileSetTest(String name) { | ||||
| super(name); | super(name); | ||||
| } | } | ||||
| public void setUp() { | |||||
| project = new Project(); | |||||
| project.setBasedir("."); | |||||
| } | |||||
| protected FileSet getInstance() { | |||||
| protected AbstractFileSet getInstance() { | |||||
| return new FileSet(); | return new FileSet(); | ||||
| } | } | ||||
| protected Project getProject() { | |||||
| return project; | |||||
| } | |||||
| public void testEmptyElementIfIsReference() { | |||||
| FileSet f = getInstance(); | |||||
| f.setIncludes("**/*.java"); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to FileSet with elements from setIncludes"); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.createPatternSet(); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to FileSet with nested patternset element."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.createInclude(); | |||||
| try { | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| fail("Can add reference to FileSet with nested include element."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| f = getInstance(); | |||||
| f.setRefid(new Reference("dummyref")); | |||||
| try { | |||||
| f.setIncludes("**/*.java"); | |||||
| fail("Can set includes in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setIncludesfile(new File("/a")); | |||||
| fail("Can set includesfile in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setExcludes("**/*.java"); | |||||
| fail("Can set excludes in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setExcludesfile(new File("/a")); | |||||
| fail("Can set excludesfile in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.setDir(project.resolveFile(".")); | |||||
| fail("Can set dir in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify more than one attribute when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createInclude(); | |||||
| fail("Can add nested include in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createExclude(); | |||||
| fail("Can add nested exclude in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createIncludesFile(); | |||||
| fail("Can add nested includesfile in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createExcludesFile(); | |||||
| fail("Can add nested excludesfile in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.createPatternSet(); | |||||
| fail("Can add nested patternset in FileSet that is a reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("You must not specify nested elements when using refid", | |||||
| be.getMessage()); | |||||
| } | |||||
| } | |||||
| public void testCircularReferenceCheck() { | |||||
| FileSet f = getInstance(); | |||||
| project.addReference("dummy", f); | |||||
| f.setRefid(new Reference("dummy")); | |||||
| try { | |||||
| f.getDir(project); | |||||
| fail("Can make FileSet a Reference to itself."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f.getDirectoryScanner(project); | |||||
| fail("Can make FileSet a Reference to itself."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| // dummy1 --> dummy2 --> dummy3 --> dummy1 | |||||
| FileSet f1 = getInstance(); | |||||
| project.addReference("dummy1", f1); | |||||
| f1.setRefid(new Reference("dummy2")); | |||||
| FileSet f2 = getInstance(); | |||||
| project.addReference("dummy2", f2); | |||||
| f2.setRefid(new Reference("dummy3")); | |||||
| FileSet f3 = getInstance(); | |||||
| project.addReference("dummy3", f3); | |||||
| f3.setRefid(new Reference("dummy1")); | |||||
| try { | |||||
| f1.getDir(project); | |||||
| fail("Can make circular reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| try { | |||||
| f1.getDirectoryScanner(project); | |||||
| fail("Can make circular reference."); | |||||
| } catch (BuildException be) { | |||||
| assertEquals("This data type contains a circular reference.", | |||||
| be.getMessage()); | |||||
| } | |||||
| // dummy1 --> dummy2 --> dummy3 | |||||
| // (which has the Project's basedir as root). | |||||
| f1 = getInstance(); | |||||
| project.addReference("dummy1", f1); | |||||
| f1.setRefid(new Reference("dummy2")); | |||||
| f2 = getInstance(); | |||||
| project.addReference("dummy2", f2); | |||||
| f2.setRefid(new Reference("dummy3")); | |||||
| f3 = getInstance(); | |||||
| project.addReference("dummy3", f3); | |||||
| f3.setDir(project.resolveFile(".")); | |||||
| File dir = f1.getDir(project); | |||||
| assertEquals("Dir is basedir", dir, project.getBaseDir()); | |||||
| } | |||||
| } | } | ||||