package aQute.remote.agent;
import java.io.IOException;
import java.io.PrintStream;
import java.util.concurrent.CopyOnWriteArrayList;
import aQute.remote.api.Agent;
/**
* The Console Redirector redirects System.in, System.out, and System.err to the
* supervisor. This is of course quite tricky. We have to replace System.*
* fields and this can only be done if the security allows it. It also requires
* that if we have multiple agents we need to share the redirecting.
*/
public class ConsoleRedirector implements Redirector {
private static RedirectOutput stdout;
private static RedirectOutput stderr;
private static RedirectInput stdin;
private static CopyOnWriteArrayList<AgentServer> agents = new CopyOnWriteArrayList<AgentServer>();
volatile boolean quit = false;
/**
* Constructor.
*
* @param agent the agent we're redirecting for
*/
public ConsoleRedirector(AgentServer agent) throws IOException {
synchronized (agents) {
if (!agents.contains(this)) {
agents.add(agent);
if (agents.size() == 1) {
System.setOut(stdout = new RedirectOutput(agents, System.out, false));
System.setErr(stderr = new RedirectOutput(agents, System.err, true));
System.setIn(stdin = new RedirectInput(System.in));
}
}
}
}
/**
* Clean up
*/
@Override
public void close() throws IOException {
quit = true;
synchronized (agents) {
if (agents.remove(this)) {
if (agents.size() == 0) {
System.setOut(stdout.getOut());
System.setErr(stderr.getOut());
System.setIn(stdin.getOrg());
}
}
}
}
@Override
public int getPort() {
return Agent.CONSOLE;
}
@Override
public void stdin(String s) throws IOException {
stdin.add(s);
}
@Override
public PrintStream getOut() {
return stdout;
}
}