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
The following commit(s) were added to refs/heads/master by this push: new a052913 pathconvert: avoid buffering for log/property output a052913 is described below commit a05291383e7c58bbff22b32fa3182ad94cb6bdc5 Author: Matt Benson <mben...@apache.org> AuthorDate: Fri Mar 11 09:10:06 2022 -0600 pathconvert: avoid buffering for log/property output --- .../org/apache/tools/ant/taskdefs/PathConvert.java | 67 ++++++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/PathConvert.java b/src/main/org/apache/tools/ant/taskdefs/PathConvert.java index cc7581d..81d6b0b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/PathConvert.java +++ b/src/main/org/apache/tools/ant/taskdefs/PathConvert.java @@ -17,6 +17,7 @@ */ package org.apache.tools.ant.taskdefs; +import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -25,6 +26,7 @@ import java.io.Writer; import java.util.List; import java.util.Objects; import java.util.Vector; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -53,6 +55,29 @@ import org.apache.tools.ant.util.PropertyOutputStream; * @ant.task category="utility" */ public class PathConvert extends Task { + private abstract class Output<T extends Closeable> implements Consumer<String>, Closeable { + final T target; + + Output(T target) { + this.target = target; + } + + @Override + public void close() throws IOException { + target.close(); + } + + @Override + public void accept(String t) { + try { + doAccept(t); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + abstract void doAccept(String t) throws Exception; + } /** * Set if we're running on windows @@ -368,14 +393,14 @@ public class PathConvert extends Task { validateSetup(); // validate our setup boolean first = true; - try (Writer w = new OutputStreamWriter(createOutputStream())) { + try (Output<?> o = createOutput()) { for (String s : (Iterable<String>) streamResources()::iterator) { if (first) { first = false; } else { - w.write(pathSep); + o.accept(pathSep); } - w.write(s); + o.accept(s); } } catch (IOException e) { throw new BuildException(e); @@ -387,20 +412,38 @@ public class PathConvert extends Task { } } - private OutputStream createOutputStream() throws IOException { + @SuppressWarnings("resource") + private Output<?> createOutput() throws IOException { if (dest != null) { - return dest.getOutputStream(); + return new Output<Writer>(new OutputStreamWriter(dest.getOutputStream())) { + + @Override + void doAccept(String t) throws IOException { + target.write(t); + } + }; } + // avoid OutputStreamWriter's buffering: + final OutputStream out; if (property == null) { - return new LogOutputStream(this); + out = new LogOutputStream(this); + } else { + out = new PropertyOutputStream(getProject(), property) { + @Override + public void close() { + if (setonempty || size() > 0) { + super.close(); + log("Set property " + property + " = " + getProject().getProperty(property), + Project.MSG_VERBOSE); + } + } + }; } - return new PropertyOutputStream(getProject(), property) { + return new Output<OutputStream>(out) { + @Override - public void close() { - if (setonempty || size() > 0) { - super.close(); - log("Set property " + property + " = " + getProject().getProperty(property), Project.MSG_VERBOSE); - } + void doAccept(String t) throws IOException { + target.write(t.getBytes()); } }; }