This is an automated email from the ASF dual-hosted git repository.

mbenson pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ant.git

commit 0d0971ab8a53e412089e48b59fd12fe16ea0beb1
Author: Matt Benson <mben...@apache.org>
AuthorDate: Wed Feb 16 13:30:29 2022 -0600

    support writing pathconvert output to resource
---
 manual/Tasks/pathconvert.html                      | 12 +++++++++--
 .../org/apache/tools/ant/taskdefs/PathConvert.java | 25 ++++++++++++++++++++--
 src/tests/antunit/taskdefs/pathconvert-test.xml    | 20 +++++++++++++++++
 3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/manual/Tasks/pathconvert.html b/manual/Tasks/pathconvert.html
index 4d1e5c3..3be11a6 100644
--- a/manual/Tasks/pathconvert.html
+++ b/manual/Tasks/pathconvert.html
@@ -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>
diff --git a/src/main/org/apache/tools/ant/taskdefs/PathConvert.java 
b/src/main/org/apache/tools/ant/taskdefs/PathConvert.java
index b962f56..cc7581d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/PathConvert.java
+++ b/src/main/org/apache/tools/ant/taskdefs/PathConvert.java
@@ -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;
@@ -329,6 +332,19 @@ public class PathConvert extends Task {
     }
 
     /**
+     * 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;
diff --git a/src/tests/antunit/taskdefs/pathconvert-test.xml 
b/src/tests/antunit/taskdefs/pathconvert-test.xml
index d43eeac..b5d0201 100644
--- a/src/tests/antunit/taskdefs/pathconvert-test.xml
+++ b/src/tests/antunit/taskdefs/pathconvert-test.xml
@@ -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>

Reply via email to