interchangeable. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272294 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1168,6 +1168,7 @@ | |||||
<exclude name="${regexp.package}/RegexpMatcherTest.java" /> | <exclude name="${regexp.package}/RegexpMatcherTest.java" /> | ||||
<exclude name="${regexp.package}/RegexpTest.java" /> | <exclude name="${regexp.package}/RegexpTest.java" /> | ||||
<exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java" /> | ||||
<exclude name="${ant.package}/types/AbstractFileSetTest.java" /> | |||||
<!-- helper classes, not testcases --> | <!-- helper classes, not testcases --> | ||||
<exclude name="org/example/**" /> | <exclude name="org/example/**" /> | ||||
@@ -0,0 +1,350 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.types; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.FileScanner; | |||||
import org.apache.tools.ant.DirectoryScanner; | |||||
import org.apache.tools.ant.Project; | |||||
import java.io.File; | |||||
import java.util.Stack; | |||||
import java.util.Vector; | |||||
/** | |||||
* Class that holds an implicit patternset and supports nested | |||||
* patternsets and creates a DirectoryScanner using these patterns. | |||||
* | |||||
* <p>Common base class for DirSet and FileSet.</p> | |||||
* | |||||
* @author <a href="mailto:ajkuiper@wxs.nl">Arnout J. Kuiper</a> | |||||
* @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a> | |||||
* @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | |||||
* @author <a href="mailto:jon@clearink.com">Jon S. Stevens</a> | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||||
*/ | |||||
public abstract class AbstractFileSet extends DataType implements Cloneable { | |||||
private PatternSet defaultPatterns = new PatternSet(); | |||||
private Vector additionalPatterns = new Vector(); | |||||
private File dir; | |||||
private boolean useDefaultExcludes = true; | |||||
private boolean isCaseSensitive = true; | |||||
public AbstractFileSet() { | |||||
super(); | |||||
} | |||||
protected AbstractFileSet(AbstractFileSet fileset) { | |||||
this.dir = fileset.dir; | |||||
this.defaultPatterns = fileset.defaultPatterns; | |||||
this.additionalPatterns = fileset.additionalPatterns; | |||||
this.useDefaultExcludes = fileset.useDefaultExcludes; | |||||
this.isCaseSensitive = fileset.isCaseSensitive; | |||||
setProject(getProject()); | |||||
} | |||||
/** | |||||
* Makes this instance in effect a reference to another instance. | |||||
* | |||||
* <p>You must not set another attribute or nest elements inside | |||||
* this element if you make it a reference.</p> | |||||
*/ | |||||
public void setRefid(Reference r) throws BuildException { | |||||
if (dir != null || defaultPatterns.hasPatterns()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
if (!additionalPatterns.isEmpty()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
super.setRefid(r); | |||||
} | |||||
/** | |||||
* Sets the base-directory for this instance. | |||||
*/ | |||||
public void setDir(File dir) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.dir = dir; | |||||
} | |||||
/** | |||||
* Retrieves the base-directory for this instance. | |||||
*/ | |||||
public File getDir(Project p) { | |||||
if (isReference()) { | |||||
return getRef(p).getDir(p); | |||||
} | |||||
return dir; | |||||
} | |||||
/** | |||||
* Creates a nested patternset. | |||||
*/ | |||||
public PatternSet createPatternSet() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
PatternSet patterns = new PatternSet(); | |||||
additionalPatterns.addElement(patterns); | |||||
return patterns; | |||||
} | |||||
/** | |||||
* add a name entry on the include list | |||||
*/ | |||||
public PatternSet.NameEntry createInclude() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createInclude(); | |||||
} | |||||
/** | |||||
* add a name entry on the include files list | |||||
*/ | |||||
public PatternSet.NameEntry createIncludesFile() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createIncludesFile(); | |||||
} | |||||
/** | |||||
* add a name entry on the exclude list | |||||
*/ | |||||
public PatternSet.NameEntry createExclude() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createExclude(); | |||||
} | |||||
/** | |||||
* add a name entry on the include files list | |||||
*/ | |||||
public PatternSet.NameEntry createExcludesFile() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createExcludesFile(); | |||||
} | |||||
/** | |||||
* Appends <code>includes</code> to the current list of include | |||||
* patterns. | |||||
* | |||||
* <p>Patterns may be separated by a comma or a space.</p> | |||||
* | |||||
* @param includes the string containing the include patterns | |||||
*/ | |||||
public void setIncludes(String includes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludes(includes); | |||||
} | |||||
/** | |||||
* Appends <code>excludes</code> to the current list of exclude | |||||
* patterns. | |||||
* | |||||
* <p>Patterns may be separated by a comma or a space.</p> | |||||
* | |||||
* @param excludes the string containing the exclude patterns | |||||
*/ | |||||
public void setExcludes(String excludes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludes(excludes); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param incl The file to fetch the include patterns from. | |||||
*/ | |||||
public void setIncludesfile(File incl) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludesfile(incl); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param excl The file to fetch the exclude patterns from. | |||||
*/ | |||||
public void setExcludesfile(File excl) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludesfile(excl); | |||||
} | |||||
/** | |||||
* Sets whether default exclusions should be used or not. | |||||
* | |||||
* @param useDefaultExcludes "true"|"on"|"yes" when default exclusions | |||||
* should be used, "false"|"off"|"no" when they | |||||
* shouldn't be used. | |||||
*/ | |||||
public void setDefaultexcludes(boolean useDefaultExcludes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.useDefaultExcludes = useDefaultExcludes; | |||||
} | |||||
/** | |||||
* Sets case sensitivity of the file system | |||||
* | |||||
* @param isCaseSensitive "true"|"on"|"yes" if file system is case | |||||
* sensitive, "false"|"off"|"no" when not. | |||||
*/ | |||||
public void setCaseSensitive(boolean isCaseSensitive) { | |||||
this.isCaseSensitive = isCaseSensitive; | |||||
} | |||||
/** | |||||
* sets the name used for this datatype instance. | |||||
*/ | |||||
protected abstract String getDataTypeName(); | |||||
/** | |||||
* Returns the directory scanner needed to access the files to process. | |||||
*/ | |||||
public DirectoryScanner getDirectoryScanner(Project p) { | |||||
if (isReference()) { | |||||
return getRef(p).getDirectoryScanner(p); | |||||
} | |||||
if (dir == null) { | |||||
throw new BuildException("No directory specified for " | |||||
+ getDataTypeName() + "."); | |||||
} | |||||
if (!dir.exists()) { | |||||
throw new BuildException(dir.getAbsolutePath()+" not found."); | |||||
} | |||||
if (!dir.isDirectory()) { | |||||
throw new BuildException(dir.getAbsolutePath() | |||||
+" is not a directory."); | |||||
} | |||||
DirectoryScanner ds = new DirectoryScanner(); | |||||
setupDirectoryScanner(ds, p); | |||||
ds.scan(); | |||||
return ds; | |||||
} | |||||
public void setupDirectoryScanner(FileScanner ds, Project p) { | |||||
if (ds == null) { | |||||
throw new IllegalArgumentException("ds cannot be null"); | |||||
} | |||||
ds.setBasedir(dir); | |||||
final int count = additionalPatterns.size(); | |||||
for (int i = 0; i < count; i++) { | |||||
Object o = additionalPatterns.elementAt(i); | |||||
defaultPatterns.append((PatternSet) o, p); | |||||
} | |||||
p.log(getDataTypeName() + ": Setup scanner in dir " + dir + | |||||
" with " + defaultPatterns, Project.MSG_DEBUG ); | |||||
ds.setIncludes(defaultPatterns.getIncludePatterns(p)); | |||||
ds.setExcludes(defaultPatterns.getExcludePatterns(p)); | |||||
if (useDefaultExcludes) { | |||||
ds.addDefaultExcludes(); | |||||
} | |||||
ds.setCaseSensitive(isCaseSensitive); | |||||
} | |||||
/** | |||||
* Performs the check for circular references and returns the | |||||
* referenced FileSet. | |||||
*/ | |||||
protected AbstractFileSet getRef(Project p) { | |||||
if (!checked) { | |||||
Stack stk = new Stack(); | |||||
stk.push(this); | |||||
dieOnCircularReference(stk, p); | |||||
} | |||||
Object o = ref.getReferencedObject(p); | |||||
if (!getClass().isAssignableFrom(o.getClass())) { | |||||
String msg = ref.getRefId()+" doesn\'t denote a " | |||||
+ getDataTypeName(); | |||||
throw new BuildException(msg); | |||||
} else { | |||||
return (AbstractFileSet) o; | |||||
} | |||||
} | |||||
} |
@@ -60,16 +60,18 @@ package org.apache.tools.ant.types; | |||||
* | * | ||||
* @since Ant 1.5 | * @since Ant 1.5 | ||||
*/ | */ | ||||
public class DirSet extends FileSet { | |||||
public class DirSet extends AbstractFileSet { | |||||
public DirSet() { | public DirSet() { | ||||
super(); | super(); | ||||
setDataTypeName("dirset"); | |||||
} | } | ||||
protected DirSet(DirSet dirset) { | protected DirSet(DirSet dirset) { | ||||
super(dirset); | super(dirset); | ||||
setDataTypeName("dirset"); | |||||
} | |||||
protected String getDataTypeName() { | |||||
return "dirset"; | |||||
} | } | ||||
/** | /** | ||||
@@ -54,15 +54,6 @@ | |||||
package org.apache.tools.ant.types; | package org.apache.tools.ant.types; | ||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.FileScanner; | |||||
import org.apache.tools.ant.DirectoryScanner; | |||||
import org.apache.tools.ant.Project; | |||||
import java.io.File; | |||||
import java.util.Stack; | |||||
import java.util.Vector; | |||||
/** | /** | ||||
* Moved out of MatchingTask to make it a standalone object that could | * Moved out of MatchingTask to make it a standalone object that could | ||||
* be referenced (by scripts for example). | * be referenced (by scripts for example). | ||||
@@ -74,265 +65,18 @@ import java.util.Vector; | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class FileSet extends DataType implements Cloneable { | |||||
public class FileSet extends AbstractFileSet { | |||||
private PatternSet defaultPatterns = new PatternSet(); | |||||
private Vector additionalPatterns = new Vector(); | |||||
private File dir; | |||||
private boolean useDefaultExcludes = true; | |||||
private boolean isCaseSensitive = true; | |||||
private String dataTypeName = "fileset"; | |||||
public FileSet() { | public FileSet() { | ||||
super(); | super(); | ||||
} | } | ||||
protected FileSet(FileSet fileset) { | protected FileSet(FileSet fileset) { | ||||
this.dir = fileset.dir; | |||||
this.defaultPatterns = fileset.defaultPatterns; | |||||
this.additionalPatterns = fileset.additionalPatterns; | |||||
this.useDefaultExcludes = fileset.useDefaultExcludes; | |||||
this.isCaseSensitive = fileset.isCaseSensitive; | |||||
setProject(getProject()); | |||||
} | |||||
/** | |||||
* Makes this instance in effect a reference to another PatternSet | |||||
* instance. | |||||
* | |||||
* <p>You must not set another attribute or nest elements inside | |||||
* this element if you make it a reference.</p> | |||||
*/ | |||||
public void setRefid(Reference r) throws BuildException { | |||||
if (dir != null || defaultPatterns.hasPatterns()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
if (!additionalPatterns.isEmpty()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
super.setRefid(r); | |||||
} | |||||
public void setDir(File dir) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.dir = dir; | |||||
} | |||||
public File getDir(Project p) { | |||||
if (isReference()) { | |||||
return getRef(p).getDir(p); | |||||
} | |||||
return dir; | |||||
} | |||||
public PatternSet createPatternSet() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
PatternSet patterns = new PatternSet(); | |||||
additionalPatterns.addElement(patterns); | |||||
return patterns; | |||||
} | |||||
/** | |||||
* add a name entry on the include list | |||||
*/ | |||||
public PatternSet.NameEntry createInclude() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createInclude(); | |||||
} | |||||
/** | |||||
* add a name entry on the include files list | |||||
*/ | |||||
public PatternSet.NameEntry createIncludesFile() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createIncludesFile(); | |||||
} | |||||
/** | |||||
* add a name entry on the exclude list | |||||
*/ | |||||
public PatternSet.NameEntry createExclude() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createExclude(); | |||||
} | |||||
/** | |||||
* add a name entry on the include files list | |||||
*/ | |||||
public PatternSet.NameEntry createExcludesFile() { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
return defaultPatterns.createExcludesFile(); | |||||
} | |||||
/** | |||||
* Appends <code>includes</code> to the current list of include patterns. | |||||
* Patterns may be separated by a comma or a space. | |||||
* | |||||
* @param includes the string containing the include patterns | |||||
*/ | |||||
public void setIncludes(String includes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludes(includes); | |||||
super(fileset); | |||||
} | } | ||||
/** | |||||
* Appends <code>excludes</code> to the current list of exclude patterns. | |||||
* Patterns may be separated by a comma or a space. | |||||
* | |||||
* @param excludes the string containing the exclude patterns | |||||
*/ | |||||
public void setExcludes(String excludes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludes(excludes); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param incl The file to fetch the include patterns from. | |||||
*/ | |||||
public void setIncludesfile(File incl) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setIncludesfile(incl); | |||||
} | |||||
/** | |||||
* Sets the name of the file containing the includes patterns. | |||||
* | |||||
* @param excl The file to fetch the exclude patterns from. | |||||
*/ | |||||
public void setExcludesfile(File excl) throws BuildException { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
defaultPatterns.setExcludesfile(excl); | |||||
} | |||||
/** | |||||
* Sets whether default exclusions should be used or not. | |||||
* | |||||
* @param useDefaultExcludes "true"|"on"|"yes" when default exclusions | |||||
* should be used, "false"|"off"|"no" when they | |||||
* shouldn't be used. | |||||
*/ | |||||
public void setDefaultexcludes(boolean useDefaultExcludes) { | |||||
if (isReference()) { | |||||
throw tooManyAttributes(); | |||||
} | |||||
this.useDefaultExcludes = useDefaultExcludes; | |||||
} | |||||
/** | |||||
* Sets case sensitivity of the file system | |||||
* | |||||
* @param isCaseSensitive "true"|"on"|"yes" if file system is case | |||||
* sensitive, "false"|"off"|"no" when not. | |||||
*/ | |||||
public void setCaseSensitive(boolean isCaseSensitive) { | |||||
this.isCaseSensitive = isCaseSensitive; | |||||
} | |||||
/** | |||||
* sets the name used for this datatype instance. | |||||
*/ | |||||
protected final void setDataTypeName(String name) { | |||||
dataTypeName = name; | |||||
} | |||||
/** | |||||
* Returns the directory scanner needed to access the files to process. | |||||
*/ | |||||
public DirectoryScanner getDirectoryScanner(Project p) { | |||||
if (isReference()) { | |||||
return getRef(p).getDirectoryScanner(p); | |||||
} | |||||
if (dir == null) { | |||||
throw new BuildException("No directory specified for " | |||||
+ dataTypeName + "."); | |||||
} | |||||
if (!dir.exists()) { | |||||
throw new BuildException(dir.getAbsolutePath()+" not found."); | |||||
} | |||||
if (!dir.isDirectory()) { | |||||
throw new BuildException(dir.getAbsolutePath()+" is not a directory."); | |||||
} | |||||
DirectoryScanner ds = new DirectoryScanner(); | |||||
setupDirectoryScanner(ds, p); | |||||
ds.scan(); | |||||
return ds; | |||||
} | |||||
public void setupDirectoryScanner(FileScanner ds, Project p) { | |||||
if (ds == null) { | |||||
throw new IllegalArgumentException("ds cannot be null"); | |||||
} | |||||
ds.setBasedir(dir); | |||||
final int count = additionalPatterns.size(); | |||||
for (int i = 0; i < count; i++) { | |||||
Object o = additionalPatterns.elementAt(i); | |||||
defaultPatterns.append((PatternSet) o, p); | |||||
} | |||||
p.log(dataTypeName + ": Setup scanner in dir " + dir + | |||||
" with " + defaultPatterns, Project.MSG_DEBUG ); | |||||
ds.setIncludes(defaultPatterns.getIncludePatterns(p)); | |||||
ds.setExcludes(defaultPatterns.getExcludePatterns(p)); | |||||
if (useDefaultExcludes) { | |||||
ds.addDefaultExcludes(); | |||||
} | |||||
ds.setCaseSensitive(isCaseSensitive); | |||||
} | |||||
/** | |||||
* Performs the check for circular references and returns the | |||||
* referenced FileSet. | |||||
*/ | |||||
protected FileSet getRef(Project p) { | |||||
if (!checked) { | |||||
Stack stk = new Stack(); | |||||
stk.push(this); | |||||
dieOnCircularReference(stk, p); | |||||
} | |||||
Object o = ref.getReferencedObject(p); | |||||
if (!getClass().isAssignableFrom(o.getClass())) { | |||||
String msg = ref.getRefId()+" doesn\'t denote a " + dataTypeName; | |||||
throw new BuildException(msg); | |||||
} else { | |||||
return (FileSet) o; | |||||
} | |||||
protected String getDataTypeName() { | |||||
return "fileset"; | |||||
} | } | ||||
/** | /** | ||||
@@ -341,7 +85,7 @@ public class FileSet extends DataType implements Cloneable { | |||||
*/ | */ | ||||
public Object clone() { | public Object clone() { | ||||
if (isReference()) { | if (isReference()) { | ||||
return new FileSet(getRef(getProject())); | |||||
return new FileSet((FileSet) getRef(getProject())); | |||||
} else { | } else { | ||||
return new FileSet(this); | return new FileSet(this); | ||||
} | } | ||||
@@ -0,0 +1,283 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2002 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.types; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.Project; | |||||
import junit.framework.TestCase; | |||||
import junit.framework.AssertionFailedError; | |||||
import java.io.File; | |||||
/** | |||||
* Base class for FileSetTest and DirSetTest. | |||||
* | |||||
* <p>This doesn't actually test much, mainly reference handling. | |||||
* | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||||
*/ | |||||
public abstract class AbstractFileSetTest extends TestCase { | |||||
private Project project; | |||||
public AbstractFileSetTest(String name) { | |||||
super(name); | |||||
} | |||||
public void setUp() { | |||||
project = new Project(); | |||||
project.setBasedir("."); | |||||
} | |||||
protected abstract AbstractFileSet getInstance(); | |||||
protected final Project getProject() { | |||||
return project; | |||||
} | |||||
public final void testEmptyElementIfIsReference() { | |||||
AbstractFileSet f = getInstance(); | |||||
f.setIncludes("**/*.java"); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to " | |||||
+ f.getDataTypeName() | |||||
+ " with elements from setIncludes"); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.createPatternSet(); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to " | |||||
+ f.getDataTypeName() | |||||
+ " with nested patternset element."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when " | |||||
+ "using refid", be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.createInclude(); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to " | |||||
+ f.getDataTypeName() | |||||
+ " with nested include element."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.setRefid(new Reference("dummyref")); | |||||
try { | |||||
f.setIncludes("**/*.java"); | |||||
fail("Can set includes in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.setIncludesfile(new File("/a")); | |||||
fail("Can set includesfile in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.setExcludes("**/*.java"); | |||||
fail("Can set excludes in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.setExcludesfile(new File("/a")); | |||||
fail("Can set excludesfile in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.setDir(project.resolveFile(".")); | |||||
fail("Can set dir in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute " | |||||
+ "when using refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.createInclude(); | |||||
fail("Can add nested include in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using " | |||||
+ "refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.createExclude(); | |||||
fail("Can add nested exclude in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using " | |||||
+ "refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.createIncludesFile(); | |||||
fail("Can add nested includesfile in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using " | |||||
+ "refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.createExcludesFile(); | |||||
fail("Can add nested excludesfile in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using " | |||||
+ "refid", be.getMessage()); | |||||
} | |||||
try { | |||||
f.createPatternSet(); | |||||
fail("Can add nested patternset in " | |||||
+ f.getDataTypeName() | |||||
+ " that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using " | |||||
+ "refid", be.getMessage()); | |||||
} | |||||
} | |||||
public void testCircularReferenceCheck() { | |||||
AbstractFileSet f = getInstance(); | |||||
project.addReference("dummy", f); | |||||
f.setRefid(new Reference("dummy")); | |||||
try { | |||||
f.getDir(project); | |||||
fail("Can make " + f.getDataTypeName() | |||||
+ " a Reference to itself."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.getDirectoryScanner(project); | |||||
fail("Can make " + f.getDataTypeName() | |||||
+ " a Reference to itself."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
// dummy1 --> dummy2 --> dummy3 --> dummy1 | |||||
AbstractFileSet f1 = getInstance(); | |||||
project.addReference("dummy1", f1); | |||||
f1.setRefid(new Reference("dummy2")); | |||||
AbstractFileSet f2 = getInstance(); | |||||
project.addReference("dummy2", f2); | |||||
f2.setRefid(new Reference("dummy3")); | |||||
AbstractFileSet f3 = getInstance(); | |||||
project.addReference("dummy3", f3); | |||||
f3.setRefid(new Reference("dummy1")); | |||||
try { | |||||
f1.getDir(project); | |||||
fail("Can make circular reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f1.getDirectoryScanner(project); | |||||
fail("Can make circular reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
// dummy1 --> dummy2 --> dummy3 | |||||
// (which has the Project's basedir as root). | |||||
f1 = getInstance(); | |||||
project.addReference("dummy1", f1); | |||||
f1.setRefid(new Reference("dummy2")); | |||||
f2 = getInstance(); | |||||
project.addReference("dummy2", f2); | |||||
f2.setRefid(new Reference("dummy3")); | |||||
f3 = getInstance(); | |||||
project.addReference("dummy3", f3); | |||||
f3.setDir(project.resolveFile(".")); | |||||
File dir = f1.getDir(project); | |||||
assertEquals("Dir is basedir", dir, project.getBaseDir()); | |||||
} | |||||
} |
@@ -61,13 +61,13 @@ import org.apache.tools.ant.BuildException; | |||||
* | * | ||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
*/ | */ | ||||
public class DirSetTest extends FileSetTest { | |||||
public class DirSetTest extends AbstractFileSetTest { | |||||
public DirSetTest(String name) { | public DirSetTest(String name) { | ||||
super(name); | super(name); | ||||
} | } | ||||
protected FileSet getInstance() { | |||||
protected AbstractFileSet getInstance() { | |||||
return new DirSet(); | return new DirSet(); | ||||
} | } | ||||
@@ -85,7 +85,6 @@ public class DirSetTest extends FileSetTest { | |||||
assertEquals("dummy doesn\'t denote a dirset", e.getMessage()); | assertEquals("dummy doesn\'t denote a dirset", e.getMessage()); | ||||
} | } | ||||
/* | |||||
ds = (DirSet) getInstance(); | ds = (DirSet) getInstance(); | ||||
ds.setProject(getProject()); | ds.setProject(getProject()); | ||||
getProject().addReference("dummy2", ds); | getProject().addReference("dummy2", ds); | ||||
@@ -96,7 +95,6 @@ public class DirSetTest extends FileSetTest { | |||||
} catch (BuildException e) { | } catch (BuildException e) { | ||||
assertEquals("dummy2 doesn\'t denote a fileset", e.getMessage()); | assertEquals("dummy2 doesn\'t denote a fileset", e.getMessage()); | ||||
} | } | ||||
*/ | |||||
} | } | ||||
} | } |
@@ -70,188 +70,14 @@ import java.io.File; | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
*/ | */ | ||||
public class FileSetTest extends TestCase { | |||||
private Project project; | |||||
public class FileSetTest extends AbstractFileSetTest { | |||||
public FileSetTest(String name) { | public FileSetTest(String name) { | ||||
super(name); | super(name); | ||||
} | } | ||||
public void setUp() { | |||||
project = new Project(); | |||||
project.setBasedir("."); | |||||
} | |||||
protected FileSet getInstance() { | |||||
protected AbstractFileSet getInstance() { | |||||
return new FileSet(); | return new FileSet(); | ||||
} | } | ||||
protected Project getProject() { | |||||
return project; | |||||
} | |||||
public void testEmptyElementIfIsReference() { | |||||
FileSet f = getInstance(); | |||||
f.setIncludes("**/*.java"); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to FileSet with elements from setIncludes"); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.createPatternSet(); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to FileSet with nested patternset element."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.createInclude(); | |||||
try { | |||||
f.setRefid(new Reference("dummyref")); | |||||
fail("Can add reference to FileSet with nested include element."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
f = getInstance(); | |||||
f.setRefid(new Reference("dummyref")); | |||||
try { | |||||
f.setIncludes("**/*.java"); | |||||
fail("Can set includes in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.setIncludesfile(new File("/a")); | |||||
fail("Can set includesfile in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.setExcludes("**/*.java"); | |||||
fail("Can set excludes in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.setExcludesfile(new File("/a")); | |||||
fail("Can set excludesfile in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.setDir(project.resolveFile(".")); | |||||
fail("Can set dir in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify more than one attribute when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.createInclude(); | |||||
fail("Can add nested include in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.createExclude(); | |||||
fail("Can add nested exclude in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.createIncludesFile(); | |||||
fail("Can add nested includesfile in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.createExcludesFile(); | |||||
fail("Can add nested excludesfile in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.createPatternSet(); | |||||
fail("Can add nested patternset in FileSet that is a reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("You must not specify nested elements when using refid", | |||||
be.getMessage()); | |||||
} | |||||
} | |||||
public void testCircularReferenceCheck() { | |||||
FileSet f = getInstance(); | |||||
project.addReference("dummy", f); | |||||
f.setRefid(new Reference("dummy")); | |||||
try { | |||||
f.getDir(project); | |||||
fail("Can make FileSet a Reference to itself."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f.getDirectoryScanner(project); | |||||
fail("Can make FileSet a Reference to itself."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
// dummy1 --> dummy2 --> dummy3 --> dummy1 | |||||
FileSet f1 = getInstance(); | |||||
project.addReference("dummy1", f1); | |||||
f1.setRefid(new Reference("dummy2")); | |||||
FileSet f2 = getInstance(); | |||||
project.addReference("dummy2", f2); | |||||
f2.setRefid(new Reference("dummy3")); | |||||
FileSet f3 = getInstance(); | |||||
project.addReference("dummy3", f3); | |||||
f3.setRefid(new Reference("dummy1")); | |||||
try { | |||||
f1.getDir(project); | |||||
fail("Can make circular reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
try { | |||||
f1.getDirectoryScanner(project); | |||||
fail("Can make circular reference."); | |||||
} catch (BuildException be) { | |||||
assertEquals("This data type contains a circular reference.", | |||||
be.getMessage()); | |||||
} | |||||
// dummy1 --> dummy2 --> dummy3 | |||||
// (which has the Project's basedir as root). | |||||
f1 = getInstance(); | |||||
project.addReference("dummy1", f1); | |||||
f1.setRefid(new Reference("dummy2")); | |||||
f2 = getInstance(); | |||||
project.addReference("dummy2", f2); | |||||
f2.setRefid(new Reference("dummy3")); | |||||
f3 = getInstance(); | |||||
project.addReference("dummy3", f3); | |||||
f3.setDir(project.resolveFile(".")); | |||||
File dir = f1.getDir(project); | |||||
assertEquals("Dir is basedir", dir, project.getBaseDir()); | |||||
} | |||||
} | } |