desc.fromFileName.text + "': " + ex.getMessage());
}
try {
// redirect to
if (desc.toFileName != null) {
out = new CommandOutput(new FileOutputStream(desc.toFileName.text));
desc.openedStreams.add(out);
}
} catch (IOException ex) {
throw new ShellInvocationException("cannot open '" +
desc.toFileName + "': " + ex.getMessage());
}
if (stageNo > 0) {
// pipe from
if (pipeOut != null) {
// the previous stage is sending stdout to the pipe
if (in == CommandLine.DEFAULT_STDIN) {
// this stage is going to read from the pipe
PipedInputStream pipeIn = new PipedInputStream();
try {
pipeIn.connect(pipeOut);
} catch (IOException ex) {
throw new ShellInvocationException(
"Problem connecting pipe", ex);
}
in = new CommandInput(pipeIn);
desc.openedStreams.add(in);
} else {
// this stage has redirected stdin from a file ...
// so go back and replace the previous stage's
// pipeOut with devnull
CommandDescriptor prev = descs.get(stageNo - 1);
CommandIO[] prevIOs = prev.commandLine.getStreams();
try {
pipeOut.close();
} catch (IOException ex) {
// squash
}
prevIOs[Command.STD_OUT] = CommandLine.DEVNULL;
}
} else {
// the previous stage has explicitly redirected stdout
if (in == CommandLine.DEFAULT_STDIN) {
// this stage hasn't redirected stdin, so we need to
// give it a NullInputStream to suck on.
in = CommandLine.DEVNULL;
}
}
}
if (stageNo < nosStages - 1) {
// this stage is not the last one, and it hasn't redirected
// its stdout, so it will write to a pipe
if (out == CommandLine.DEFAULT_STDOUT) {
pipeOut = new PipedOutputStream();
out = new CommandOutput(new PrintStream(pipeOut));
desc.openedStreams.add(out);
}
}
desc.commandLine.setStreams(new CommandIO[] {in, out, err, CommandLine.DEFAULT_STDERR});
try {