Browse Source

support writing pathconvert output to resource

master
Matt Benson 3 years ago
parent
commit
0d0971ab8a
3 changed files with 53 additions and 4 deletions
  1. +10
    -2
      manual/Tasks/pathconvert.html
  2. +23
    -2
      src/main/org/apache/tools/ant/taskdefs/PathConvert.java
  3. +20
    -0
      src/tests/antunit/taskdefs/pathconvert-test.xml

+ 10
- 2
manual/Tasks/pathconvert.html View File

@@ -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>&lt;map&gt;</code> elements can be specified to map Windows drive letters to Unix
@@ -65,7 +66,14 @@ nested <a href="../Types/mapper.html"><code>&lt;mapper&gt;</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>


+ 23
- 2
src/main/org/apache/tools/ant/taskdefs/PathConvert.java View File

@@ -102,6 +102,9 @@ public class PathConvert extends Task {

private boolean preserveDuplicates;

/** Destination {@link Resource} */
private Resource dest;

/**
* Helper class, holds the nested &lt;map&gt; values. Elements will look like
* this: &lt;map from=&quot;d:&quot; to=&quot;/foo&quot;/&gt;
@@ -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;


+ 20
- 0
src/tests/antunit/taskdefs/pathconvert-test.xml View File

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

Loading…
Cancel
Save