@@ -28,7 +28,8 @@ | |||
<h3>Description</h3> | |||
<p>Converts nested <a href="../Types/resources.html#collection">resource collections</a>, or a | |||
reference to just one, into a path form for a particular platform, optionally storing the result | |||
into a given property. It can also be used when you need to convert a resource collection into a | |||
into a property or writing to an Ant <a href="../Types/resources.html">resource</a>. | |||
It can also be used when you need to convert a resource collection into a | |||
list, separated by a given character, such as a comma or space, or, conversely, e.g. to convert a | |||
list of files in a FileList into a path.</p> | |||
<p>Nested <code><map></code> elements can be specified to map Windows drive letters to Unix | |||
@@ -65,7 +66,14 @@ nested <a href="../Types/mapper.html"><code><mapper></code></a> (<em>since | |||
<tr> | |||
<td>property</td> | |||
<td>The name of the property in which to place the converted path.</td> | |||
<td>No, result will be logged if unset</td> | |||
<td>No, result will be logged if neither <code>@property</code> nor <code>@dest</code> is set</td> | |||
</tr> | |||
<tr> | |||
<td>dest</td> | |||
<td>A destination resource into which to write the converted path (Ant interprets this as a | |||
<code>File</code> by default). | |||
</td> | |||
<td>No, result will be logged if neither <code>@property</code> nor <code>@dest</code> is set</td> | |||
</tr> | |||
<tr> | |||
<td>refid</td> | |||
@@ -102,6 +102,9 @@ public class PathConvert extends Task { | |||
private boolean preserveDuplicates; | |||
/** Destination {@link Resource} */ | |||
private Resource dest; | |||
/** | |||
* Helper class, holds the nested <map> values. Elements will look like | |||
* this: <map from="d:" to="/foo"/> | |||
@@ -328,6 +331,19 @@ public class PathConvert extends Task { | |||
return refid != null; | |||
} | |||
/** | |||
* Set destination resource. | |||
* @param dest | |||
*/ | |||
public void setDest(Resource dest) { | |||
if (dest != null) { | |||
if (this.dest != null) { | |||
throw new BuildException("@dest already set"); | |||
} | |||
} | |||
this.dest = dest; | |||
} | |||
/** | |||
* Do the execution. | |||
* @throws BuildException if something is invalid. | |||
@@ -371,7 +387,10 @@ public class PathConvert extends Task { | |||
} | |||
} | |||
private OutputStream createOutputStream() { | |||
private OutputStream createOutputStream() throws IOException { | |||
if (dest != null) { | |||
return dest.getOutputStream(); | |||
} | |||
if (property == null) { | |||
return new LogOutputStream(this); | |||
} | |||
@@ -452,10 +471,12 @@ public class PathConvert extends Task { | |||
* @throws BuildException if something is not set up properly. | |||
*/ | |||
private void validateSetup() throws BuildException { | |||
if (path == null) { | |||
throw new BuildException("You must specify a path to convert"); | |||
} | |||
if (property != null && dest != null) { | |||
throw new BuildException("@property and @dest are mutually exclusive"); | |||
} | |||
// Determine the separator strings. The dirsep and pathsep attributes | |||
// override the targetOS settings. | |||
String dsep = File.separator; | |||
@@ -109,4 +109,24 @@ | |||
<isset property="result" /> | |||
</au:assertFalse> | |||
</target> | |||
<target name="testDest"> | |||
<au:assertFileDoesntExist file="${output}/destfile" /> | |||
<pathconvert dest="${output}/destfile"> | |||
<file file="foo/bar/baz" /> | |||
</pathconvert> | |||
<au:assertFileExists file="${output}/destfile" /> | |||
<au:assertTrue> | |||
<resourcesmatch> | |||
<file file="${output}/destfile" /> | |||
<string value="${basedir}/foo/bar/baz" /> | |||
</resourcesmatch> | |||
</au:assertTrue> | |||
</target> | |||
<target name="testDestPropertyMutex"> | |||
<au:expectfailure message="@property and @dest are mutually exclusive"> | |||
<pathconvert property="someprop" dest="somefile" refid="testpath" /> | |||
</au:expectfailure> | |||
</target> | |||
</project> |