diff --git a/build.xml b/build.xml index 1831e1cd6..5e8d74917 100644 --- a/build.xml +++ b/build.xml @@ -1168,6 +1168,7 @@ + diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java new file mode 100644 index 000000000..42b1a703d --- /dev/null +++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java @@ -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 + * . + */ + +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. + * + *

Common base class for DirSet and FileSet.

+ * + * @author Arnout J. Kuiper + * @author Stefano Mazzocchi + * @author Sam Ruby + * @author Jon S. Stevens + * @author Stefan Bodewig + * @author Magesh Umasankar + */ +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. + * + *

You must not set another attribute or nest elements inside + * this element if you make it a reference.

+ */ + 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 includes 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); + } + + /** + * Appends excludes 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 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; + } + } + +} diff --git a/src/main/org/apache/tools/ant/types/DirSet.java b/src/main/org/apache/tools/ant/types/DirSet.java index 21a55e0e9..8111102dd 100644 --- a/src/main/org/apache/tools/ant/types/DirSet.java +++ b/src/main/org/apache/tools/ant/types/DirSet.java @@ -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"; } /** diff --git a/src/main/org/apache/tools/ant/types/FileSet.java b/src/main/org/apache/tools/ant/types/FileSet.java index 3497190bf..b697525d6 100644 --- a/src/main/org/apache/tools/ant/types/FileSet.java +++ b/src/main/org/apache/tools/ant/types/FileSet.java @@ -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 Stefan Bodewig * @author Magesh Umasankar */ -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. - * - *

You must not set another attribute or nest elements inside - * this element if you make it a reference.

- */ - 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 includes 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 excludes 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); } diff --git a/src/testcases/org/apache/tools/ant/types/AbstractFileSetTest.java b/src/testcases/org/apache/tools/ant/types/AbstractFileSetTest.java new file mode 100644 index 000000000..e0a7b4b43 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/types/AbstractFileSetTest.java @@ -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 + * . + */ + +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. + * + *

This doesn't actually test much, mainly reference handling. + * + * @author Stefan Bodewig + */ + +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()); + } +} diff --git a/src/testcases/org/apache/tools/ant/types/DirSetTest.java b/src/testcases/org/apache/tools/ant/types/DirSetTest.java index b9777bc48..1439712a8 100644 --- a/src/testcases/org/apache/tools/ant/types/DirSetTest.java +++ b/src/testcases/org/apache/tools/ant/types/DirSetTest.java @@ -61,13 +61,13 @@ import org.apache.tools.ant.BuildException; * * @author Stefan Bodewig */ -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()); } -*/ } } diff --git a/src/testcases/org/apache/tools/ant/types/FileSetTest.java b/src/testcases/org/apache/tools/ant/types/FileSetTest.java index f874aad23..6f45d81bb 100644 --- a/src/testcases/org/apache/tools/ant/types/FileSetTest.java +++ b/src/testcases/org/apache/tools/ant/types/FileSetTest.java @@ -70,188 +70,14 @@ import java.io.File; * @author Stefan Bodewig */ -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()); - } }