| @@ -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()); | |||
| } | |||
| }; | |||
| } | |||