package games.strategy.engine.framework.headlessGameServer; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import games.strategy.util.ThreadUtil; /** * Terminal line console. */ public class HeadlessGameServerConsole { protected static final int LOOP_SLEEP_MS = 20; private final PrintStream out; private final BufferedReader in; private final HeadlessConsoleController commandController; private boolean shutdown = false; public HeadlessGameServerConsole(final HeadlessGameServer server, final InputStream in, final PrintStream out) { this(new BufferedReader(new InputStreamReader(in)), out, new HeadlessConsoleController(server, in, out)); } protected HeadlessGameServerConsole(final BufferedReader in, final PrintStream out, final HeadlessConsoleController commandController) { this.out = out; this.in = in; this.commandController = commandController; } public void start() { final Thread t = new Thread(() -> printEvalLoop(), "Headless console eval print loop"); t.setDaemon(true); t.start(); Runtime.getRuntime().addShutdownHook(new Thread(() -> out.println("Shutting Down. See log file."))); } private void printEvalLoop() { out.println(); while (!shutdown) { out.print(">>>>"); out.flush(); try { final String command = in.readLine(); if (command != null && !command.trim().isEmpty()) { commandController.process(command.trim()); } } catch (final Throwable t) { out.println("Error: " + t.getMessage()); t.printStackTrace(out); } ThreadUtil.sleep(LOOP_SLEEP_MS); } } protected void shutdown() { this.shutdown = true; } }