Browse Source

rework inheritance tree for DirSet and FileSet, they are not

interchangeable.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272294 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
1f992c596b
7 changed files with 648 additions and 444 deletions
  1. +1
    -0
      build.xml
  2. +350
    -0
      src/main/org/apache/tools/ant/types/AbstractFileSet.java
  3. +5
    -3
      src/main/org/apache/tools/ant/types/DirSet.java
  4. +5
    -261
      src/main/org/apache/tools/ant/types/FileSet.java
  5. +283
    -0
      src/testcases/org/apache/tools/ant/types/AbstractFileSetTest.java
  6. +2
    -4
      src/testcases/org/apache/tools/ant/types/DirSetTest.java
  7. +2
    -176
      src/testcases/org/apache/tools/ant/types/FileSetTest.java

+ 1
- 0
build.xml View File

@@ -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/**" />


+ 350
- 0
src/main/org/apache/tools/ant/types/AbstractFileSet.java View File

@@ -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;
}
}

}

+ 5
- 3
src/main/org/apache/tools/ant/types/DirSet.java View File

@@ -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";
} }


/** /**


+ 5
- 261
src/main/org/apache/tools/ant/types/FileSet.java View File

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


+ 283
- 0
src/testcases/org/apache/tools/ant/types/AbstractFileSetTest.java View File

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

+ 2
- 4
src/testcases/org/apache/tools/ant/types/DirSetTest.java View File

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


} }

+ 2
- 176
src/testcases/org/apache/tools/ant/types/FileSetTest.java View File

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

Loading…
Cancel
Save