Browse Source

pathconvert: avoid buffering for log/property output

master
Matt Benson 3 years ago
parent
commit
a05291383e
1 changed files with 55 additions and 12 deletions
  1. +55
    -12
      src/main/org/apache/tools/ant/taskdefs/PathConvert.java

+ 55
- 12
src/main/org/apache/tools/ant/taskdefs/PathConvert.java View File

@@ -17,6 +17,7 @@
*/ */
package org.apache.tools.ant.taskdefs; package org.apache.tools.ant.taskdefs;


import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
@@ -25,6 +26,7 @@ import java.io.Writer;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Vector; import java.util.Vector;
import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
@@ -53,6 +55,29 @@ import org.apache.tools.ant.util.PropertyOutputStream;
* @ant.task category="utility" * @ant.task category="utility"
*/ */
public class PathConvert extends Task { 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 * Set if we're running on windows
@@ -368,14 +393,14 @@ public class PathConvert extends Task {
validateSetup(); // validate our setup validateSetup(); // validate our setup


boolean first = true; boolean first = true;
try (Writer w = new OutputStreamWriter(createOutputStream())) {
try (Output<?> o = createOutput()) {
for (String s : (Iterable<String>) streamResources()::iterator) { for (String s : (Iterable<String>) streamResources()::iterator) {
if (first) { if (first) {
first = false; first = false;
} else { } else {
w.write(pathSep);
o.accept(pathSep);
} }
w.write(s);
o.accept(s);
} }
} catch (IOException e) { } catch (IOException e) {
throw new BuildException(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) { 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) { 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 @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());
} }
}; };
} }


Loading…
Cancel
Save