diff --git a/build.xml b/build.xml index e95bd9db2..8adf90967 100644 --- a/build.xml +++ b/build.xml @@ -136,7 +136,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -219,7 +219,7 @@ - + @@ -233,7 +233,7 @@ - + @@ -280,8 +280,7 @@ + deprecation="off" > @@ -294,6 +293,8 @@ + + diff --git a/docs/index.html b/docs/index.html index 9cec43182..b3b79bd5d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -25,7 +25,7 @@
  • Dave Walend (dwalend@cs.tufts.edu)
  • -

    Version 1.2 - 2000/08/10

    +

    Version 1.2 - 2000/09/07


    Table of Contents

    @@ -444,8 +444,7 @@ location attributes of its own, so

    <classpath path="${classpath}" />

    In addition, FileSets can be specified via -nested <fileset> and -<filesetref> elements. The order in which the files +nested <fileset> elements. The order in which the files building up FileSet are added to the PATH like structure is not defined.

    @@ -746,7 +745,7 @@ directory based task that constitutes an implicit FileSet. In addition
     

    Builds a set of patterns, that matches all .java files that do not contain the text Test in their name. This set can be referred to via -<patternsetref refid="non.test.sources" +<patternset refid="non.test.sources" /> by tasks that support this feature or by FileSets.

    FileSets

    FileSets are groups of files. These files can be found in a @@ -756,7 +755,7 @@ href="#patternset">PatternSets. FileSets can appear inside task that support this feature or at the same level as target - i.e. as children of project.

    PatternSets can be specified as nested -<patternset> or <patternsetref> +<patternset> elements. In addition FileSet holds an implicit PatternSet and supports the nested <include> and <exclude> elements of PatternSet directly as well @@ -817,7 +816,7 @@ source files and don't have the text Test in their name.

     <fileset dir="${client.src}" >
    -  <patternsetref refid="non.test.sources" />
    +  <patternset refid="non.test.sources" />
     </fileset>
     

    Groups all files in directory ${client.src} using the @@ -998,8 +997,7 @@ write patterns.

    This task holds an implicit FileSet and supports all of FileSet's attributes and nested elements directly. More FileSets can be specified using nested -<fileset> or <filesetref> -elements.

    +<fileset> elements.

    Parameters

    @@ -1088,7 +1086,7 @@ readable and executable for anyone on a UNIX system.

    <fileset dir="shared/sources1" > <exclude name="**/trial/**" /> </fileset> - <filesetref refid="other.shared.sources" /> + <fileset refid="other.shared.sources" /> </chmod> @@ -1113,9 +1111,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes src) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters

    @@ -1326,9 +1323,8 @@ href="#directorybasedtasks">directory based tasks, on how the inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> as well as the -nested <include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +nested <include>, <exclude> and +<patternset> elements.

    Parameters

    @@ -1558,8 +1554,7 @@ the command is only executed when Ant is run on one of the specified operating systems.

    The files and/or directories of a number of FileSets are passed as arguments to the system -command. At least one nested <fileset> or -<filesetref> is required.

    +command. At least one nested <fileset> is required.

    Parameters

    @@ -1619,11 +1614,10 @@ command. At least one nested <fileset> or

    Parameters specified as nested elements

    -

    fileset and filesetref

    +

    fileset

    You can use any number of nested <fileset> elements to define the files for this task and refer to -<fileset>s defined elsewhere via -<filesetref> elements.

    +<fileset>s defined elsewhere.

    arg

    Command line arguments should be specified as nested <arg> elements. See exec

    <exclude name="**/*.txt" /> </patternset> </fileset> - <filesetref refid="other.files" /> + <fileset refid="other.files" /> </execon>

    invokes ls -l, adding the absolute filenames of all @@ -1698,9 +1692,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes srcdir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters

    @@ -2075,9 +2068,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes basedir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    You can also use nested file sets for more flexibility, and specify multiple ones to merge together different trees of files into one JAR. See the Zip task for more details and examples.

    @@ -2424,9 +2416,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes srcdir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    src, classpath, bootclasspath and extdirs

    Javac's srcdir, classpath, bootclasspath and extdirs attributes are <replacetoken> element.

    Parameters specified as nested elements

    This task forms an implicit FileSet and supports all attributes of <fileset> as well as the -nested <include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +nested <include>, <exclude> and +<patternset> elements.

    If either the text you want to replace or the replacement text cross line boundaries, you can use nested elements to specify them.

    @@ -3206,9 +3196,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes base) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters

    @@ -3399,9 +3388,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes basedir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Note that this task does not perform compression. You might want to use the GZip task to come up with a .tar.gz package.

    Parameters

    @@ -3576,9 +3564,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes basedir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters

    @@ -3734,16 +3721,14 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes basedir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Or, you may place within it nested file sets, or references to file sets. In this case basedir is optional; the implicit file set is only used if basedir is set. You may use any mixture of the implicit file set (with basedir set, and optional attributes like includes and optional subelements like <include>); explicit nested -<fileset> elements; and nested <filesetref> -elements; so long as at least one fileset total is specified. The ZIP file will +<fileset> elements so long as at least one fileset total is specified. The ZIP file will only reflect the relative paths of files within each fileset.

    The whenempty parameter controls what happens when no files match. If skip (the default), the ZIP is not created and a warning is issued. @@ -3864,9 +3849,8 @@ write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes basedir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters:

    @@ -4193,9 +4177,8 @@ inclusion/exclusion of files works, and how to write patterns.

    This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes srcdir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters:

    @@ -4443,9 +4426,8 @@ inclusion/exclusion of files works, and how to write patterns. This task forms an implicit FileSet and supports all attributes of <fileset> (dir becomes srcDir) as well as the nested -<include>, <exclude>, -<patternset> and <patternsetref> -elements.

    +<include>, <exclude> and +<patternset> elements.

    Parameters:

    diff --git a/docs/junit.html b/docs/junit.html index 1be50e8d2..fe8d16036 100644 --- a/docs/junit.html +++ b/docs/junit.html @@ -186,11 +186,9 @@ can be specified.

    batchtest collects the included files from any number of nested <fileset> and -<filesetref> (referring to a -<fileset> defined elsewhere via its id -attribute) elements. It then generates a test class name for each file -that ends in .java or .class.

    +href="index.html#fileset"><fileset>s. It then +generates a test class name for each file that ends in +.java or .class.

    diff --git a/src/main/org/apache/tools/ant/taskdefs/Chmod.java b/src/main/org/apache/tools/ant/taskdefs/Chmod.java index 77aa5185d..2929ff4ee 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Chmod.java +++ b/src/main/org/apache/tools/ant/taskdefs/Chmod.java @@ -89,13 +89,6 @@ public class Chmod extends ExecuteOn { defaultSet.setDir(src); } - public void XsetSrc(File src) { - log("The src attribute is deprecated. " + - "Please use the file attribute.", - Project.MSG_WARN); - setFile(src); - } - public void setPerm(String perm) { createArg().setValue(perm); havePerm = true; @@ -122,13 +115,6 @@ public class Chmod extends ExecuteOn { return defaultSet.createPatternSet(); } - /** - * add a reference to a set of patterns - */ - public Reference createPatternSetRef() { - return defaultSet.createPatternSetRef(); - } - /** * Sets the set of include patterns. Patterns may be separated by a comma * or a space. @@ -166,7 +152,7 @@ public class Chmod extends ExecuteOn { location); } - if (defaultSet.getDir() != null) { + if (defaultSet.getDir(project) != null) { addFileset(defaultSet); } super.checkConfiguration(); diff --git a/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java b/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java index baca677be..56863c23c 100644 --- a/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java +++ b/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java @@ -80,13 +80,6 @@ public class ExecuteOn extends ExecTask { filesets.addElement(set); } - /** - * Adds a reference to a set of files (nested filesetref element). - */ - public void addFilesetref(Reference ref) { - filesets.addElement(ref); - } - /** * Shall the command work on all specified files in parallel? */ @@ -113,34 +106,20 @@ public class ExecuteOn extends ExecTask { Vector v = new Vector(); for (int i=0; ifail (throw an exception @@ -144,19 +137,7 @@ public class Zip extends MatchingTask { if (baseDir != null) dss.addElement(getDirectoryScanner(baseDir)); for (int i=0; i. + */ + +package org.apache.tools.ant.types; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; + +import java.util.Stack; + +/** + * Base class for those classes that can appear inside the build file + * as stand alone data types. + * + *

    This class handles the common description attribute and provides + * a default implementation for reference handling and checking for + * circular references that is appropriate for types that can not be + * nested inside elements of the same type (i.e. <patternset> + * but not <path>).

    + * + * @author Stefan Bodewig + */ +public abstract class DataType { + /** + * The descriptin the user has set. + */ + protected String description = null; + /** + * Value to the refid attribute. + */ + protected Reference ref = null; + /** + * Are we sure we don't hold circular references? + * + *

    Subclasses are responsible for setting this value to false + * if we'd need to investigate this condition (usually because a + * child element has been added that is a subclass of + * DataType).

    + */ + protected boolean checked = true; + + /** + * Sets a description of the current data type. It will be useful + * in commenting what we are doing. + */ + public void setDescription( String desc ) { + description=desc; + } + + /** + * Return the description for the current data type. + */ + public String getDescription() { + return description; + } + + /** + * Has the refid attribute of this element been set? + */ + public boolean isReference() { + return ref != null; + } + + /** + * Set the value of the refid attribute. + * + *

    Subclasses may need to check whether any other attributes + * have been set as well or child elements have been created and + * thus override this method. if they do the must call + * super.setRefid.

    + */ + public void setRefid(Reference ref) { + this.ref = ref; + checked = false; + } + + /** + * Check to see whether any DataType we hold references to is + * included in the Stack (which holds all DataType instances that + * directly or indirectly reference this instance, including this + * instance itself). + * + *

    If one is included, throw a BuildException created by {@link + * #circularReference circularReference}.

    + * + *

    This implementation is appropriate only for a DataType that + * cannot hold other DataTypes as children.

    + * + *

    The general contract of this method is that it shouldn't do + * anything if {@link #checked checked} is true and + * set it to true on exit.

    + */ + protected void dieOnCircularReference(Stack stk, Project p) + throws BuildException { + + if (checked || !isReference()) { + return; + } + Object o = ref.getReferencedObject(p); + + if (o instanceof DataType) { + if (stk.contains(o)) { + throw circularReference(); + } else { + stk.push(o); + ((DataType) o).dieOnCircularReference(stk, p); + stk.pop(); + } + } + checked = true; + } + + /** + * Creates an exception that indicates that refid has to be the + * only attribute if it is set. + */ + protected BuildException tooManyAttributes() { + return new BuildException("You must not specify more than one attribute when using refid"); + } + + /** + * Creates an exception that indicates that this XML element must + * not have child elements if the refid attribute is set. + */ + protected BuildException noChildrenAllowed() { + return new BuildException("You must not specify nested elements when using refid"); + } + + /** + * Creates an exception that indicates the user has generated a + * loop of data types referencing each other. + */ + protected BuildException circularReference() { + return new BuildException("This data type contains a circular reference."); + } +} diff --git a/src/main/org/apache/tools/ant/types/FileSet.java b/src/main/org/apache/tools/ant/types/FileSet.java index a543e8ddf..e2461646e 100644 --- a/src/main/org/apache/tools/ant/types/FileSet.java +++ b/src/main/org/apache/tools/ant/types/FileSet.java @@ -60,6 +60,7 @@ import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import java.io.File; +import java.util.Stack; import java.util.Vector; /** @@ -72,7 +73,7 @@ import java.util.Vector; * @author Jon S. Stevens jon@clearink.com * @author Stefan Bodewig */ -public class FileSet { +public class FileSet extends DataType { private PatternSet defaultPatterns = new PatternSet(); private Vector additionalPatterns = new Vector(); @@ -84,7 +85,28 @@ public class FileSet { super(); } + /** + * Makes this instance in effect a reference to another PatternSet + * instance. + * + *

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

    + */ + public void setRefid(Reference r) throws BuildException { + if (dir != null || defaultPatterns.countPatterns() > 0) { + throw tooManyAttributes(); + } + if (!additionalPatterns.isEmpty()) { + throw noChildrenAllowed(); + } + super.setRefid(r); + } + public void setDir(File dir) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } + /* * XXX cannot check as long as tasks get configured at parse time. * @@ -100,26 +122,29 @@ public class FileSet { this.dir = dir; } - public File getDir() { + 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; } - public Reference createPatternSetRef() { - Reference r = new Reference(); - additionalPatterns.addElement(r); - return r; - } - /** * add a name entry on the include list */ public PatternSet.NameEntry createInclude() { + if (isReference()) { + throw noChildrenAllowed(); + } return defaultPatterns.createInclude(); } @@ -127,6 +152,9 @@ public class FileSet { * add a name entry on the exclude list */ public PatternSet.NameEntry createExclude() { + if (isReference()) { + throw noChildrenAllowed(); + } return defaultPatterns.createExclude(); } @@ -137,6 +165,10 @@ public class FileSet { * @param includes the string containing the include patterns */ public void setIncludes(String includes) { + if (isReference()) { + throw tooManyAttributes(); + } + defaultPatterns.setIncludes(includes); } @@ -147,6 +179,10 @@ public class FileSet { * @param excludes the string containing the exclude patterns */ public void setExcludes(String excludes) { + if (isReference()) { + throw tooManyAttributes(); + } + defaultPatterns.setExcludes(excludes); } @@ -156,6 +192,10 @@ public class FileSet { * @param incl The file to fetch the include patterns from. */ public void setIncludesfile(File incl) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } + defaultPatterns.setIncludesfile(incl); } @@ -165,6 +205,10 @@ public class FileSet { * @param excl The file to fetch the exclude patterns from. */ public void setExcludesfile(File excl) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } + defaultPatterns.setExcludesfile(excl); } @@ -176,6 +220,10 @@ public class FileSet { * shouldn't be used. */ public void setDefaultexcludes(boolean useDefaultExcludes) { + if (isReference()) { + throw tooManyAttributes(); + } + this.useDefaultExcludes = useDefaultExcludes; } @@ -183,6 +231,10 @@ public class FileSet { * 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 fileset."); } @@ -213,22 +265,32 @@ public class FileSet { for (int i=0; iStefan Bodewig */ -public class Path implements Cloneable { +public class Path extends DataType implements Cloneable { private Vector elements; private Project project; - private boolean isReference = false; - /** - * Are we sure we don't hold circular references? - */ - private boolean checked = true; public static Path systemClasspath = new Path(null, System.getProperty("java.class.path")); @@ -148,7 +143,7 @@ public class Path implements Cloneable { * null nor empty. */ public void setLocation(File location) throws BuildException { - if (isReference) { + if (isReference()) { throw tooManyAttributes(); } createPathElement().setLocation(location); @@ -160,32 +155,31 @@ public class Path implements Cloneable { * @param path the path definition. */ public void setPath(String path) throws BuildException { - if (isReference) { + if (isReference()) { throw tooManyAttributes(); } createPathElement().setPath(path); } /** - * Makes this instance in effect a reference too another Path instance. + * Makes this instance in effect a reference to another Path instance. * *

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

    */ public void setRefid(Reference r) throws BuildException { - isReference = true; if (!elements.isEmpty()) { throw tooManyAttributes(); } elements.addElement(r); - checked = false; + super.setRefid(r); } /** * Creates the nested element. */ public PathElement createPathElement() throws BuildException { - if (isReference) { + if (isReference()) { throw noChildrenAllowed(); } PathElement pe = new PathElement(); @@ -197,27 +191,18 @@ public class Path implements Cloneable { * Adds a nested element. */ public void addFileset(FileSet fs) throws BuildException { - if (isReference) { + if (isReference()) { throw noChildrenAllowed(); } elements.addElement(fs); - } - - /** - * Adds a nested element. - */ - public void addFilesetRef(Reference r) throws BuildException { - if (isReference) { - throw noChildrenAllowed(); - } - elements.addElement(r); + checked = false; } /** * Creates a nested element. */ public Path createPath() throws BuildException { - if (isReference) { + if (isReference()) { throw noChildrenAllowed(); } Path p = new Path(project); @@ -271,7 +256,7 @@ public class Path implements Cloneable { // make sure we don't have a circular reference here Stack stk = new Stack(); stk.push(this); - bailOnCircularReference(stk); + dieOnCircularReference(stk, project); } Vector result = new Vector(2*elements.size()); @@ -280,9 +265,9 @@ public class Path implements Cloneable { if (o instanceof Reference) { Reference r = (Reference) o; o = r.getReferencedObject(project); - // we only support references to filesets and paths right now - if (!(o instanceof FileSet) && !(o instanceof Path)) { - String msg = r.getRefId()+" doesn\'t denote a fileset or path"; + // we only support references to paths right now + if (!(o instanceof Path)) { + String msg = r.getRefId()+" doesn\'t denote a path"; throw new BuildException(msg); } } @@ -307,7 +292,7 @@ public class Path implements Cloneable { FileSet fs = (FileSet) o; DirectoryScanner ds = fs.getDirectoryScanner(project); String[] s = ds.getIncludedFiles(); - File dir = fs.getDir(); + File dir = fs.getDir(project); for (int j=0; jAssume the filename is absolute if project is null.

    + */ private static String resolveFile(Project project, String relativeName) { if (project != null) { return project.resolveFile(relativeName).getAbsolutePath(); @@ -427,21 +435,13 @@ public class Path implements Cloneable { return relativeName; } + /** + * Adds a String to the Vector if it isn't already included. + */ private static void addUnlessPresent(Vector v, String s) { if (v.indexOf(s) == -1) { v.addElement(s); } } - private BuildException tooManyAttributes() { - return new BuildException("You must not specify more than one attribute when using refid"); - } - - private BuildException noChildrenAllowed() { - return new BuildException("You must not specify nested elements when using refid"); - } - - private BuildException circularReference() { - return new BuildException("This path contains a circular reference."); - } } diff --git a/src/main/org/apache/tools/ant/types/PatternSet.java b/src/main/org/apache/tools/ant/types/PatternSet.java index b76aa923d..ddf325118 100644 --- a/src/main/org/apache/tools/ant/types/PatternSet.java +++ b/src/main/org/apache/tools/ant/types/PatternSet.java @@ -59,6 +59,7 @@ import org.apache.tools.ant.BuildException; import java.io.*; import java.util.Enumeration; +import java.util.Stack; import java.util.StringTokenizer; import java.util.Vector; @@ -74,7 +75,7 @@ import java.util.Vector; * @author Jon S. Stevens jon@clearink.com * @author Stefan Bodewig */ -public class PatternSet { +public class PatternSet extends DataType { private Vector includeList = new Vector(); private Vector excludeList = new Vector(); @@ -122,10 +123,27 @@ public class PatternSet { super(); } + /** + * Makes this instance in effect a reference to another PatternSet + * instance. + * + *

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

    + */ + public void setRefid(Reference r) throws BuildException { + if (!includeList.isEmpty() || !excludeList.isEmpty()) { + throw tooManyAttributes(); + } + super.setRefid(r); + } + /** * add a name entry on the include list */ public NameEntry createInclude() { + if (isReference()) { + throw noChildrenAllowed(); + } return addPatternToList(includeList); } @@ -133,6 +151,9 @@ public class PatternSet { * add a name entry on the exclude list */ public NameEntry createExclude() { + if (isReference()) { + throw noChildrenAllowed(); + } return addPatternToList(excludeList); } @@ -143,6 +164,9 @@ public class PatternSet { * @param includes the string containing the include patterns */ public void setIncludes(String includes) { + if (isReference()) { + throw tooManyAttributes(); + } if (includes != null && includes.length() > 0) { StringTokenizer tok = new StringTokenizer(includes, ", ", false); while (tok.hasMoreTokens()) { @@ -158,6 +182,9 @@ public class PatternSet { * @param excludes the string containing the exclude patterns */ public void setExcludes(String excludes) { + if (isReference()) { + throw tooManyAttributes(); + } if (excludes != null && excludes.length() > 0) { StringTokenizer tok = new StringTokenizer(excludes, ", ", false); while (tok.hasMoreTokens()) { @@ -181,6 +208,9 @@ public class PatternSet { * @param incl The file to fetch the include patterns from. */ public void setIncludesfile(File incl) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } if (!incl.exists()) { throw new BuildException("Includesfile "+incl.getAbsolutePath() +" not found."); @@ -195,6 +225,9 @@ public class PatternSet { * @param excl The file to fetch the exclude patterns from. */ public void setExcludesfile(File excl) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } if (!excl.exists()) { throw new BuildException("Excludesfile "+excl.getAbsolutePath() +" not found."); @@ -234,12 +267,23 @@ public class PatternSet { /** * Adds the patterns of the other instance to this set. */ - public void append(PatternSet other) { - for (int i=0; i. + */ + +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; + +/** + * JUnit 3 testcases for org.apache.tools.ant.types.FileSet. + * + *

    This doesn't actually test much, mainly reference handling. + * + * @author Stefan Bodewig + */ + +public class FileSetTest extends TestCase { + + private Project project; + + public FileSetTest(String name) { + super(name); + } + + public void setUp() { + project = new Project(); + project.setBasedir("."); + } + + public void testEmptyElementIfIsReference() { + FileSet f = new FileSet(); + 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 = new FileSet(); + 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 = new FileSet(); + 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 = new FileSet(); + 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.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 = new FileSet(); + 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 = new FileSet(); + project.addReference("dummy1", f1); + f1.setRefid(new Reference("dummy2")); + FileSet f2 = new FileSet(); + project.addReference("dummy2", f2); + f2.setRefid(new Reference("dummy3")); + FileSet f3 = new FileSet(); + 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 = new FileSet(); + project.addReference("dummy1", f1); + f1.setRefid(new Reference("dummy2")); + f2 = new FileSet(); + project.addReference("dummy2", f2); + f2.setRefid(new Reference("dummy3")); + f3 = new FileSet(); + project.addReference("dummy3", f3); + f3.setDir(project.resolveFile(".")); + File dir = f1.getDir(project); + assertEquals("Die is basedir", dir, project.getBaseDir()); + } +} diff --git a/src/testcases/org/apache/tools/ant/types/PathTest.java b/src/testcases/org/apache/tools/ant/types/PathTest.java index d7665360d..1524fd5ec 100644 --- a/src/testcases/org/apache/tools/ant/types/PathTest.java +++ b/src/testcases/org/apache/tools/ant/types/PathTest.java @@ -63,9 +63,9 @@ import junit.framework.AssertionFailedError; import java.io.File; /** - * JUnit 3 testcases for org.apache.tools.ant.Path + * JUnit 3 testcases for org.apache.tools.ant.types.Path * - * @author Stefan Bodewig stefan.bodewig@megabit.net + * @author Stefan Bodewig */ public class PathTest extends TestCase { @@ -270,15 +270,6 @@ public class PathTest extends TestCase { assertEquals("You must not specify nested elements when using refid", be.getMessage()); } - - try { - p.addFilesetRef(new Reference("dummy2")); - fail("Can add nested FileSetRef in Path that is a reference."); - } catch (BuildException be) { - assertEquals("You must not specify nested elements when using refid", - be.getMessage()); - } - } public void testCircularReferenceCheck() { @@ -289,7 +280,7 @@ public class PathTest extends TestCase { p.list(); fail("Can make Path a Reference to itself."); } catch (BuildException be) { - assertEquals("This path contains a circular reference.", + assertEquals("This data type contains a circular reference.", be.getMessage()); } @@ -305,7 +296,7 @@ public class PathTest extends TestCase { p1.list(); fail("Can make circular reference."); } catch (BuildException be) { - assertEquals("This path contains a circular reference.", + assertEquals("This data type contains a circular reference.", be.getMessage()); } @@ -318,7 +309,7 @@ public class PathTest extends TestCase { project.addReference("dummy3", p3); p3.setLocation(new File("/a")); String[] l = p1.list(); - assertEquals("One element burried deep inside a nested path structure", + assertEquals("One element buried deep inside a nested path structure", 1, l.length); if (isUnixStyle) { assertEquals("/a", l[0]); diff --git a/src/testcases/org/apache/tools/ant/types/PatternSetTest.java b/src/testcases/org/apache/tools/ant/types/PatternSetTest.java new file mode 100644 index 000000000..f68d4c326 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/types/PatternSetTest.java @@ -0,0 +1,211 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 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", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.types; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; + +import junit.framework.TestCase; +import junit.framework.AssertionFailedError; + +import java.io.File; + +/** + * JUnit 3 testcases for org.apache.tools.ant.types.PatternSet. + * + *

    This doesn't actually test much, mainly reference handling. + * + * @author Stefan Bodewig + */ + +public class PatternSetTest extends TestCase { + + private Project project; + + public PatternSetTest(String name) { + super(name); + } + + public void setUp() { + project = new Project(); + project.setBasedir("."); + } + + public void testEmptyElementIfIsReference() { + PatternSet p = new PatternSet(); + p.setIncludes("**/*.java"); + try { + p.setRefid(new Reference("dummyref")); + fail("Can add reference to PatternSet with elements from setIncludes"); + } catch (BuildException be) { + assertEquals("You must not specify more than one attribute when using refid", + be.getMessage()); + } + + p = new PatternSet(); + p.setRefid(new Reference("dummyref")); + try { + p.setIncludes("**/*.java"); + fail("Can set includes in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify more than one attribute when using refid", + be.getMessage()); + } + + p = new PatternSet(); + p.setRefid(new Reference("dummyref")); + try { + p.setIncludesfile(new File("/a")); + fail("Can set includesfile in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify more than one attribute when using refid", + be.getMessage()); + } + try { + p.setExcludes("**/*.java"); + fail("Can set excludes in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify more than one attribute when using refid", + be.getMessage()); + } + try { + p.setExcludesfile(new File("/a")); + fail("Can set excludesfile in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify more than one attribute when using refid", + be.getMessage()); + } + try { + p.createInclude(); + fail("Can add nested include in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify nested elements when using refid", + be.getMessage()); + } + try { + p.createExclude(); + fail("Can add nested exclude in PatternSet that is a reference."); + } catch (BuildException be) { + assertEquals("You must not specify nested elements when using refid", + be.getMessage()); + } + } + + public void testCircularReferenceCheck() { + PatternSet p = new PatternSet(); + project.addReference("dummy", p); + p.setRefid(new Reference("dummy")); + try { + p.getIncludePatterns(project); + fail("Can make PatternSet a Reference to itself."); + } catch (BuildException be) { + assertEquals("This data type contains a circular reference.", + be.getMessage()); + } + try { + p.getExcludePatterns(project); + fail("Can make PatternSet a Reference to itself."); + } catch (BuildException be) { + assertEquals("This data type contains a circular reference.", + be.getMessage()); + } + + // dummy1 --> dummy2 --> dummy3 --> dummy1 + PatternSet p1 = new PatternSet(); + project.addReference("dummy1", p1); + p1.setRefid(new Reference("dummy2")); + PatternSet p2 = new PatternSet(); + project.addReference("dummy2", p2); + p2.setRefid(new Reference("dummy3")); + PatternSet p3 = new PatternSet(); + project.addReference("dummy3", p3); + p3.setRefid(new Reference("dummy1")); + try { + p1.getIncludePatterns(project); + fail("Can make circular reference."); + } catch (BuildException be) { + assertEquals("This data type contains a circular reference.", + be.getMessage()); + } + try { + p1.getExcludePatterns(project); + fail("Can make circular reference."); + } catch (BuildException be) { + assertEquals("This data type contains a circular reference.", + be.getMessage()); + } + + // dummy1 --> dummy2 --> dummy3 + // (which holds patterns "include" and "exclude") + p1 = new PatternSet(); + project.addReference("dummy1", p1); + p1.setRefid(new Reference("dummy2")); + p2 = new PatternSet(); + project.addReference("dummy2", p2); + p2.setRefid(new Reference("dummy3")); + p3 = new PatternSet(); + project.addReference("dummy3", p3); + p3.setIncludes("include"); + p3.createExclude().setName("exclude"); + String[] i = p1.getIncludePatterns(project); + assertEquals("One include pattern buried deep inside a nested patternset structure", + 1, i.length); + assertEquals("include", i[0]); + i = p3.getExcludePatterns(project); + assertEquals("One exclude pattern buried deep inside a nested patternset structure", + 1, i.length); + assertEquals("exclude", i[0]); + } +}