@Override @Nonnull public Response execute(@Nonnull R requirement, @Nullable Drains drains) throws InterruptedException, IOException { final Drain out = drains != null ? drains.stdout() : drainThatBuffers(); final Drain err = drains != null ? drains.stderr() : drainThatBuffers(); try (final P process = _processGenerator.generate(requirement)) { try (final OutputMonitor<E, ID> stdoutMonitor = new OutputMonitor<>(process, stdout, out)) { try (final OutputMonitor<E, ID> stderrMonitor = new OutputMonitor<>(process, stderr, err)) { final int exitCode = process.waitFor(); stdoutMonitor.waitFor(); stderrMonitor.waitFor(); return new Response(asString(out), asString(err), exitCode); } } } }