git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1578003 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -135,6 +135,11 @@ Other changes: | |||
| * The <get> task now explicitly accepts and supports the gzip content encoding. | |||
| Bugzilla Report 49453 | |||
| * A new resourcecollection type <multirootfileset> acts like a union | |||
| of <fileset>s and <dirset>s that share the same configuration but | |||
| have different base directories. | |||
| Bugzilla Report 48621 | |||
| Changes from Ant 1.9.2 TO Ant 1.9.3 | |||
| =================================== | |||
| @@ -0,0 +1,173 @@ | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"> | |||
| <link rel="stylesheet" type="text/css" href="../stylesheets/style.css"> | |||
| <title>MultiRooFileSet Type</title> | |||
| </head> | |||
| <body> | |||
| <h2><a name="multirootfileset">MultiRootFileSet</a></h2> | |||
| <p><em>Since Ant 1.9.4</em></p> | |||
| <p>A MultiRootFileSet is a group of files or directories. These files | |||
| or drectories can be found in a directory forrest starting with a set | |||
| of base directories and are matched by patterns taken from a number of | |||
| <a href="patternset.html">PatternSets</a> and <a | |||
| href="selectors.html">Selectors</a>.</p> | |||
| <p>MultiRootFileSet acts as a union of <a | |||
| href="fileset.html">FileSets</a> and <a href="dirset.html">DirSets</a> | |||
| that share the same patterns and selectors.</p> | |||
| <p>MultiRootFileSet supports all attributes and nested elements of | |||
| FileSet and DirSet except for the "dir" attribute.</p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">basedirs</td> | |||
| <td valign="top">Comma separated list of directories that build | |||
| the roots of the MultiRootFileSet.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">cache</td> | |||
| <td valign="top">Whether to cache results; disabling | |||
| may seriously impact performance</td> | |||
| <td valign="top" align="center">No, default <i>true</i></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">type</td> | |||
| <td valign="top">The type of file system entities which will be | |||
| included in this set. | |||
| Acceptable values are: | |||
| <ul> | |||
| <li>file - regular files</li> | |||
| <li>dir - directories</li> | |||
| <li>both - regular files and directories</li> | |||
| </ul> | |||
| </td> | |||
| <td valign="top" align="center">No, defaults to <i>file</i></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">includes</td> | |||
| <td valign="top">A comma- or space-separated list of patterns of directories that | |||
| must be included; all directories are included when omitted.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">includesfile</td> | |||
| <td valign="top">The name of a file; each line of this file is | |||
| taken to be an include pattern.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">excludes</td> | |||
| <td valign="top">A comma- or space-separated list of patterns of directories that | |||
| must be excluded; no directories are excluded when omitted.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">excludesfile</td> | |||
| <td valign="top">The name of a file; each line of this file is | |||
| taken to be an exclude pattern.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">casesensitive</td> | |||
| <td valign="top">Specifies whether case-sensitivity should be applied | |||
| (<code>true</code>|<code>yes</code>|<code>on</code> or | |||
| <code>false</code>|<code>no</code>|<code>off</code>).</td> | |||
| <td valign="top" align="center">No; defaults to true.</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">followsymlinks</td> | |||
| <td valign="top">Shall symbolic links be followed? Defaults to | |||
| true. See <a href="fileset.html#symlink">fileset's documentation</a>.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">erroronmissingdir</td> | |||
| <td valign="top"> | |||
| Specify what happens if one of the base directories does not exist. | |||
| If true a build error will happen, if false, the subtree | |||
| will be ignored/empty. | |||
| Defaults to true. | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Parameters specified as nested elements</h3> | |||
| <p>PatternSets can be specified as nested | |||
| <code><patternset></code> elements. In addition, MultiRootFileSet holds | |||
| an implicit PatternSet and supports the nested | |||
| <code><include></code>, <code><includesfile></code>, | |||
| <code><exclude></code> and <code><excludesfile></code> | |||
| elements of <code><patternset></code> directly, as well as | |||
| <code><patternset></code>'s attributes.</p> | |||
| <p>Selectors are available as nested elements within the | |||
| MultiRootFileSet. If any of the selectors within the MultiRootFileSet | |||
| do not select the file or directory, it is not considered part of the | |||
| MultiRootFileSet. This makes a MultiRootFileSet equivalent to | |||
| an <code><and></code> selector container.</p> | |||
| <p>In addition basedirs for the MultiRootFileSet can be specified as | |||
| nested <code>basedir</code> elements that have a | |||
| single <code>file</code> attribute.</p> | |||
| <h4>Examples</h4> | |||
| <blockquote><pre> | |||
| <multirootfileset basedirs="${build.dir},${other.project.dir}"> | |||
| <include name="apps/**/classes"/> | |||
| <exclude name="apps/**/*Test*"/> | |||
| </multirootfileset> | |||
| </pre></blockquote> | |||
| <p>Groups all files inside <code>classes</code> found under the | |||
| <code>apps</code> subdirectory of <code>${build.dir}</code> or | |||
| <code>${other.project.dir}</code>, except those that have the text | |||
| <code>Test</code> in their name.</p> | |||
| <blockquote><pre> | |||
| <multirootfileset> | |||
| <basedir file="${build.dir}"/> | |||
| <basedir file="${other.project.dir}" | |||
| <include name="apps/**/classes"/> | |||
| <exclude name="apps/**/*Test*"/> | |||
| </multirootfileset> | |||
| </pre></blockquote> | |||
| <p>Is equivalent to the first example but used | |||
| nested <code>basedir</code> elements. The nested elements and | |||
| the <code>basedirs</code> attribute can be used at the same time and | |||
| the will be merged.</p> | |||
| </body> | |||
| </html> | |||
| @@ -320,6 +320,7 @@ Ant's "legacy" datatypes have been modified to behave as Resource Collections: | |||
| <ul> | |||
| <li><a href="fileset.html">fileset</a>, | |||
| <a href="dirset.html">dirset</a>, | |||
| <a href="multirootfileset.html">multirootfileset</a>, | |||
| <a href="filelist.html">filelist</a>, and | |||
| <a href="../using.html#path">path</a> | |||
| (and derivative types) expose <a href="#file">file</a> resources | |||
| @@ -51,6 +51,7 @@ | |||
| <li><a href="Types/mapper.html">File Mappers</a></li> | |||
| <li><a href="Types/filterchain.html">FilterChains and FilterReaders</a></li> | |||
| <li><a href="Types/filterset.html">FilterSet</a></li> | |||
| <li><a href="Types/multirootfileset.html">MultiRootFileSet</a></li> | |||
| <li><a href="Types/patternset.html">PatternSet</a></li> | |||
| <li><a href="using.html#path">Path-like Structures</a></li> | |||
| <li><a href="Types/permissions.html">Permissions</a></li> | |||
| @@ -90,6 +90,7 @@ tarentry=org.apache.tools.ant.types.resources.TarResource | |||
| gzipresource=org.apache.tools.ant.types.resources.GZipResource | |||
| bzip2resource=org.apache.tools.ant.types.resources.BZip2Resource | |||
| javaresource=org.apache.tools.ant.types.resources.JavaResource | |||
| multirootfileset=org.apache.tools.ant.types.resources.MultiRootFileSet | |||
| #tokenizer implementations | |||
| linetokenizer=org.apache.tools.ant.util.LineTokenizer | |||
| @@ -0,0 +1,232 @@ | |||
| /* | |||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||
| * contributor license agreements. See the NOTICE file distributed with | |||
| * this work for additional information regarding copyright ownership. | |||
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| * (the "License"); you may not use this file except in compliance with | |||
| * the License. You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.types.resources; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.types.AbstractFileSet; | |||
| import org.apache.tools.ant.types.Reference; | |||
| import org.apache.tools.ant.types.Resource; | |||
| import org.apache.tools.ant.types.ResourceCollection; | |||
| /** | |||
| * Union of file/dirsets that share the same patterns and selectors | |||
| * but have different roots. | |||
| * @since Ant 1.9.4 | |||
| */ | |||
| public class MultiRootFileSet extends AbstractFileSet | |||
| implements ResourceCollection { | |||
| private SetType type = SetType.file; | |||
| private boolean cache = true; | |||
| private List<File> baseDirs = new ArrayList<File>(); | |||
| private Union union; | |||
| public void setDir(File dir) { | |||
| throw new BuildException(getDataTypeName() | |||
| + " doesn't support the dir attribute"); | |||
| } | |||
| /** | |||
| * Determines the types of resources to return. | |||
| * @param type the types of resources to return | |||
| */ | |||
| public void setType(SetType type) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| this.type = type; | |||
| } | |||
| /** | |||
| * Set whether to cache collections. | |||
| * @param b boolean cache flag. | |||
| */ | |||
| public synchronized void setCache(boolean b) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| cache = b; | |||
| } | |||
| /** | |||
| * Adds basedirs as a comman separated list. | |||
| * @param b boolean cache flag. | |||
| */ | |||
| public void setBaseDirs(String dirs) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| if (dirs != null && dirs.length() > 0) { | |||
| String[] ds = dirs.split(","); | |||
| for (String d : ds) { | |||
| baseDirs.add(getProject().resolveFile(d)); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Adds a basedir as nested element. | |||
| */ | |||
| public void addConfiguredBaseDir(FileResource r) { | |||
| if (isReference()) { | |||
| throw noChildrenAllowed(); | |||
| } | |||
| baseDirs.add(r.getFile()); | |||
| } | |||
| public void setRefid(Reference r) { | |||
| if (!baseDirs.isEmpty()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| super.setRefid(r); | |||
| } | |||
| /** | |||
| * Return a MultiRootFileSet that has the same basedirs and same patternsets | |||
| * as this one. | |||
| * @return the cloned MultiRootFileSet. | |||
| */ | |||
| public Object clone() { | |||
| if (isReference()) { | |||
| return ((MultiRootFileSet) getRef(getProject())).clone(); | |||
| } else { | |||
| MultiRootFileSet fs = (MultiRootFileSet) super.clone(); | |||
| fs.baseDirs = new ArrayList<File>(baseDirs); | |||
| fs.union = null; | |||
| return fs; | |||
| } | |||
| } | |||
| /** | |||
| * Fulfill the ResourceCollection contract. | |||
| * @return an Iterator of Resources. | |||
| */ | |||
| public Iterator<Resource> iterator() { | |||
| if (isReference()) { | |||
| return ((MultiRootFileSet) getRef(getProject())).iterator(); | |||
| } | |||
| return merge().iterator(); | |||
| } | |||
| /** | |||
| * Fulfill the ResourceCollection contract. | |||
| * @return number of elements as int. | |||
| */ | |||
| public int size() { | |||
| if (isReference()) { | |||
| return ((MultiRootFileSet) getRef(getProject())).size(); | |||
| } | |||
| return merge().size(); | |||
| } | |||
| /** | |||
| * Always returns true. | |||
| * @return true indicating that all elements will be FileResources. | |||
| */ | |||
| public boolean isFilesystemOnly() { | |||
| return true; | |||
| } | |||
| /** | |||
| * Returns included directories as a list of semicolon-separated paths. | |||
| * | |||
| * @return a <code>String</code> of included directories. | |||
| */ | |||
| public String toString() { | |||
| if (isReference()) { | |||
| return ((MultiRootFileSet) getRef(getProject())).toString(); | |||
| } | |||
| return merge().toString(); | |||
| } | |||
| private synchronized Union merge() { | |||
| if (cache && union != null) { | |||
| return union; | |||
| } | |||
| Union u = new Union(); | |||
| setup(u); | |||
| if (cache) { | |||
| union = u; | |||
| } | |||
| return u; | |||
| } | |||
| private void setup(Union u) { | |||
| for (File d : baseDirs) { | |||
| u.add(new Worker(this, type, d)); | |||
| } | |||
| } | |||
| /** | |||
| * What to return from the set: files, directories or both. | |||
| */ | |||
| public static enum SetType { | |||
| file, dir, both | |||
| } | |||
| private static class Worker extends AbstractFileSet | |||
| implements ResourceCollection { | |||
| private final SetType type; | |||
| private Worker(MultiRootFileSet fs, SetType type, File dir) { | |||
| super(fs); | |||
| this.type = type; | |||
| setDir(dir); | |||
| } | |||
| public boolean isFilesystemOnly() { | |||
| return true; | |||
| } | |||
| public Iterator<Resource> iterator() { | |||
| DirectoryScanner ds = getDirectoryScanner(getProject()); | |||
| String[] names = type == SetType.file | |||
| ? ds.getIncludedFiles() | |||
| : ds.getIncludedDirectories(); | |||
| if (type == SetType.both) { | |||
| String[] files = ds.getIncludedFiles(); | |||
| String[] merged = new String[names.length + files.length]; | |||
| System.arraycopy(names, 0, merged, 0, names.length); | |||
| System.arraycopy(files, 0, merged, names.length, files.length); | |||
| names = merged; | |||
| } | |||
| return new FileResourceIterator(getProject(), getDir(getProject()), | |||
| names); | |||
| } | |||
| public int size() { | |||
| DirectoryScanner ds = getDirectoryScanner(getProject()); | |||
| int count = type == SetType.file | |||
| ? ds.getIncludedFilesCount() | |||
| : ds.getIncludedDirs Count(); | |||
| if (type == SetType.both) { | |||
| count += ds.getIncludedFilesCount(); | |||
| } | |||
| return count; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,144 @@ | |||
| <?xml version="1.0"?> | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||
| <import file="../../antunit-base.xml"/> | |||
| <target name="setUp"> | |||
| <touch mkdirs="true" file="${input}/a/1/1.txt"/> | |||
| <touch mkdirs="true" file="${input}/a/1/2.txt"/> | |||
| <touch mkdirs="true" file="${input}/a/1/3.txt"/> | |||
| <touch mkdirs="true" file="${input}/b/2/3.txt"/> | |||
| <touch mkdirs="true" file="${input}/b/2/4.txt"/> | |||
| <mkdir dir="${output}"/> | |||
| </target> | |||
| <target name="test-count-in-simple-configuration" depends="setUp"> | |||
| <resourcecount property="files"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b"/> | |||
| </resourcecount> | |||
| <resourcecount property="dirs"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="dir"/> | |||
| </resourcecount> | |||
| <resourcecount property="files-and-dirs"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="both"/> | |||
| </resourcecount> | |||
| <au:assertPropertyEquals value="5" name="files"/> | |||
| <au:assertPropertyEquals value="4" name="dirs"/> | |||
| <au:assertPropertyEquals value="9" name="files-and-dirs"/> | |||
| </target> | |||
| <target name="test-count-nested-basedir-elements" depends="setUp"> | |||
| <resourcecount property="files"> | |||
| <multirootfileset> | |||
| <basedir file="${input}/a"/> | |||
| <basedir file="${input}/b"/> | |||
| </multirootfileset> | |||
| </resourcecount> | |||
| <resourcecount property="dirs"> | |||
| <multirootfileset type="dir"> | |||
| <basedir file="${input}/a"/> | |||
| <basedir file="${input}/b"/> | |||
| </multirootfileset> | |||
| </resourcecount> | |||
| <resourcecount property="files-and-dirs"> | |||
| <multirootfileset type="both"> | |||
| <basedir file="${input}/a"/> | |||
| <basedir file="${input}/b"/> | |||
| </multirootfileset> | |||
| </resourcecount> | |||
| <au:assertPropertyEquals value="5" name="files"/> | |||
| <au:assertPropertyEquals value="4" name="dirs"/> | |||
| <au:assertPropertyEquals value="9" name="files-and-dirs"/> | |||
| </target> | |||
| <target name="test-copying" depends="setUp"> | |||
| <copy todir="${output}"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b"/> | |||
| </copy> | |||
| <au:assertFileExists file="${output}/1/1.txt"/> | |||
| <au:assertFileExists file="${output}/1/2.txt"/> | |||
| <au:assertFileExists file="${output}/1/3.txt"/> | |||
| <au:assertFileExists file="${output}/2/3.txt"/> | |||
| <au:assertFileExists file="${output}/2/4.txt"/> | |||
| </target> | |||
| <target name="test-dirs" depends="setUp"> | |||
| <pathconvert property="dirs" pathsep=":"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="dir"/> | |||
| </pathconvert> | |||
| <au:assertPropertyEquals value="${input}/a:${input}/a/1:${input}/b:${input}/b/2" | |||
| name="dirs"/> | |||
| </target> | |||
| <target name="test-include-pattern" depends="setUp"> | |||
| <copy todir="${output}"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b"> | |||
| <include name="**/3.txt"/> | |||
| </multirootfileset> | |||
| </copy> | |||
| <au:assertFileDoesntExist file="${output}/1/1.txt"/> | |||
| <au:assertFileExists file="${output}/1/3.txt"/> | |||
| <au:assertFileExists file="${output}/2/3.txt"/> | |||
| <au:assertFileDoesntExist file="${output}/2/4.txt"/> | |||
| <pathconvert property="dirs" pathsep=":"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="dir"> | |||
| <include name="1/"/> | |||
| </multirootfileset> | |||
| </pathconvert> | |||
| <au:assertPropertyEquals value="${input}/a/1" name="dirs"/> | |||
| </target> | |||
| <target name="test-exclude-pattern" depends="setUp"> | |||
| <copy todir="${output}"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b"> | |||
| <exclude name="**/3.txt"/> | |||
| </multirootfileset> | |||
| </copy> | |||
| <au:assertFileExists file="${output}/1/1.txt"/> | |||
| <au:assertFileDoesntExist file="${output}/1/3.txt"/> | |||
| <au:assertFileDoesntExist file="${output}/2/3.txt"/> | |||
| <au:assertFileExists file="${output}/2/4.txt"/> | |||
| <pathconvert property="dirs" pathsep=":"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="dir"> | |||
| <exclude name="1/"/> | |||
| </multirootfileset> | |||
| </pathconvert> | |||
| <au:assertPropertyEquals value="${input}/a:${input}/b:${input}/b/2" | |||
| name="dirs"/> | |||
| </target> | |||
| <target name="test-selectors" depends="setUp"> | |||
| <copy todir="${output}"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b"> | |||
| <filename regex=".*3\.txt"/> | |||
| </multirootfileset> | |||
| </copy> | |||
| <au:assertFileDoesntExist file="${output}/1/1.txt"/> | |||
| <au:assertFileExists file="${output}/1/3.txt"/> | |||
| <au:assertFileExists file="${output}/2/3.txt"/> | |||
| <au:assertFileDoesntExist file="${output}/2/4.txt"/> | |||
| <pathconvert property="dirs" pathsep=":"> | |||
| <multirootfileset basedirs="${input}/a,${input}/b" type="dir"> | |||
| <filename regex="1"/> | |||
| </multirootfileset> | |||
| </pathconvert> | |||
| <au:assertPropertyEquals value="${input}/a/1" name="dirs"/> | |||
| </target> | |||
| </project> | |||
| @@ -0,0 +1,127 @@ | |||
| /* | |||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||
| * contributor license agreements. See the NOTICE file distributed with | |||
| * this work for additional information regarding copyright ownership. | |||
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| * (the "License"); you may not use this file except in compliance with | |||
| * the License. You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.types.resources; | |||
| import java.io.File; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.AbstractFileSet; | |||
| import org.apache.tools.ant.types.AbstractFileSetTest; | |||
| import org.apache.tools.ant.types.Reference; | |||
| /** | |||
| * This doesn't actually test much, mainly reference handling. | |||
| */ | |||
| public class MultiRootFileSetTest extends AbstractFileSetTest { | |||
| public MultiRootFileSetTest(String name) { | |||
| super(name); | |||
| } | |||
| protected AbstractFileSet getInstance() { | |||
| return new MultiRootFileSet() { | |||
| // overriding so set/getDir works as expected by the base test class | |||
| private File dir; | |||
| public void setDir(File dir) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| this.dir = dir; | |||
| } | |||
| public synchronized File getDir(Project p) { | |||
| if (isReference()) { | |||
| return getRef(p).getDir(p); | |||
| } | |||
| dieOnCircularReference(); | |||
| return dir; | |||
| } | |||
| }; | |||
| } | |||
| public void testEmptyElementIfIsReferenceAdditionalAttributes() { | |||
| MultiRootFileSet f = new MultiRootFileSet(); | |||
| f.setProject(getProject()); | |||
| f.setBaseDirs("a"); | |||
| try { | |||
| f.setRefid(new Reference(getProject(), "dummyref")); | |||
| fail("Can add reference to multirootfileset " | |||
| + " with elements from setBasedirs"); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify more than one attribute " | |||
| + "when using refid", be.getMessage()); | |||
| } | |||
| f = new MultiRootFileSet(); | |||
| f.addConfiguredBaseDir(new FileResource(new File("."))); | |||
| try { | |||
| f.setRefid(new Reference(getProject(), "dummyref")); | |||
| fail("Can add reference to multirootfileset" | |||
| + " with elements from addConfiguredBaseDir"); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify more than one attribute " | |||
| + "when using refid", be.getMessage()); | |||
| } | |||
| f = new MultiRootFileSet(); | |||
| f.setRefid(new Reference(getProject(), "dummyref")); | |||
| try { | |||
| f.setBaseDirs("a"); | |||
| fail("Can set basedirs in multirootfileset" | |||
| + " that is a reference."); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify more than one attribute " | |||
| + "when using refid", be.getMessage()); | |||
| } | |||
| try { | |||
| f.setCache(true); | |||
| fail("Can set cache in multirootfileset" | |||
| + " that is a reference."); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify more than one attribute " | |||
| + "when using refid", be.getMessage()); | |||
| } | |||
| try { | |||
| f.setType(MultiRootFileSet.SetType.file); | |||
| fail("Can set type in multirootfileset" | |||
| + " that is a reference."); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify more than one attribute " | |||
| + "when using refid", be.getMessage()); | |||
| } | |||
| try { | |||
| f.addConfiguredBaseDir(new FileResource(new File("."))); | |||
| fail("Can add nested basedir in multirootfileset " | |||
| + " that is a reference."); | |||
| } catch (BuildException be) { | |||
| assertEquals("You must not specify nested elements when using " | |||
| + "refid", be.getMessage()); | |||
| } | |||
| } | |||
| public void testDirCannotBeSet() { | |||
| try { | |||
| new MultiRootFileSet().setDir(new File(".")); | |||
| fail("Can set dir in a multirootfileset"); | |||
| } catch (BuildException e) { | |||
| assertTrue(e.getMessage() | |||
| .endsWith(" doesn't support the dir attribute")); | |||
| } | |||
| } | |||
| } | |||