// Copyright (C) 2016 by six42@gmx.net, All rights reserved.
package fitnesse.slim;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.FileUtil;
import fitnesse.util.MockSocket;
public class SlimPipeSocket extends ServerSocket {
public static final String STDOUT_PREFIX = "SOUT";
public static final String STDERR_PREFIX = "SERR";
public static final String FIRST_LINE_PREFIX = ".:";
public static final String FOLLOWING_LINE_PREFIX = " :";
static {// Better to check this at compile time, but don't know how
if (FIRST_LINE_PREFIX.length() != FOLLOWING_LINE_PREFIX.length()) {
System.err
.println("FIRST_LINE_PREFIX and FOLLOWING_LINE_PREFIX must have the same length!!");
System.exit(-99);
}
}
private static final Logger LOG = Logger.getLogger(SlimPipeSocket.class
.getName());
private PrintStream stdout;
private PrintStream stderr;
private InputStream stdin;
public SlimPipeSocket() throws IOException {
// preserve original streams
this.stdout = System.out;
this.stderr = System.err;
this.stdin = System.in;
// bind System.stdout/System.stderr to original stderr
System.setOut(new PrintStream(new LoggingOutputStream(this.stderr, STDOUT_PREFIX),
true, FileUtil.CHARENCODING));
System.setErr(new PrintStream(new LoggingOutputStream(this.stderr, STDERR_PREFIX),
true, FileUtil.CHARENCODING));
LOG.log(Level.FINER, "Creating Slim Server with pipe socket.");
}
@Override
public int getLocalPort() {
return 1;
}
@Override
public void close() {
FileUtil.close(stdin);
System.out.flush();
System.err.flush();
stdout.flush();
FileUtil.close(stdout);
FileUtil.close(stderr);
}
@Override
public Socket accept() {
return new MockSocket(this.stdin, this.stdout);
}
}