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}/RegexpTest.java" /> | |||
| <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | |||
| <exclude name="${ant.package}/types/AbstractFileSetTest.java" /> | |||
| <!-- helper classes, not testcases --> | |||
| <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 | |||
| */ | |||
| public class DirSet extends FileSet { | |||
| public class DirSet extends AbstractFileSet { | |||
| public DirSet() { | |||
| super(); | |||
| setDataTypeName("dirset"); | |||
| } | |||
| protected DirSet(DirSet dirset) { | |||
| super(dirset); | |||
| setDataTypeName("dirset"); | |||
| } | |||
| protected String getDataTypeName() { | |||
| return "dirset"; | |||
| } | |||
| /** | |||
| @@ -54,15 +54,6 @@ | |||
| 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 | |||
| * 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: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() { | |||
| super(); | |||
| } | |||
| 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() { | |||
| if (isReference()) { | |||
| return new FileSet(getRef(getProject())); | |||
| return new FileSet((FileSet) getRef(getProject())); | |||
| } else { | |||
| 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> | |||
| */ | |||
| public class DirSetTest extends FileSetTest { | |||
| public class DirSetTest extends AbstractFileSetTest { | |||
| public DirSetTest(String name) { | |||
| super(name); | |||
| } | |||
| protected FileSet getInstance() { | |||
| protected AbstractFileSet getInstance() { | |||
| return new DirSet(); | |||
| } | |||
| @@ -85,7 +85,6 @@ public class DirSetTest extends FileSetTest { | |||
| assertEquals("dummy doesn\'t denote a dirset", e.getMessage()); | |||
| } | |||
| /* | |||
| ds = (DirSet) getInstance(); | |||
| ds.setProject(getProject()); | |||
| getProject().addReference("dummy2", ds); | |||
| @@ -96,7 +95,6 @@ public class DirSetTest extends FileSetTest { | |||
| } catch (BuildException e) { | |||
| 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> | |||
| */ | |||
| public class FileSetTest extends TestCase { | |||
| private Project project; | |||
| public class FileSetTest extends AbstractFileSetTest { | |||
| public FileSetTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| project = new Project(); | |||
| project.setBasedir("."); | |||
| } | |||
| protected FileSet getInstance() { | |||
| protected AbstractFileSet getInstance() { | |||
| 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()); | |||
| } | |||
| } | |||