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()); | |||
} | |||
} |