You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by mb...@apache.org on 2022/03/11 15:10:13 UTC
[ant] branch master updated: pathconvert: avoid buffering for log/property output
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 <mb...@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());
}
};
}