From 6d0ada1af3b138043dc937cdfd68a22f3ce2d88f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 11:26:08 +0300 Subject: [PATCH] =?UTF-8?q?Zond:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20JLine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 3 +- .../main/java/asys/zond/JlineProxySysOut.java | 58 +++++++++++++++++++ zond/src/main/java/asys/zond/Main.java | 48 +++++++++++---- 3 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 zond/src/main/java/asys/zond/JlineProxySysOut.java diff --git a/zond/build.gradle b/zond/build.gradle index 82c85d3..a294e94 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.5.6-SNAPSHOT' +version = '0.6-SNAPSHOT' apply plugin: 'application' @@ -46,4 +46,5 @@ dependencies { includedEx group: 'org.apache.commons', name: 'commons-exec', version: '1.3' included group: 'io.netty', name: 'netty-codec', version: nettyVersion included group: 'com.google.guava', name: 'guava', version: '21.0' + included group: 'jline', name: 'jline', version: '2.13' } diff --git a/zond/src/main/java/asys/zond/JlineProxySysOut.java b/zond/src/main/java/asys/zond/JlineProxySysOut.java new file mode 100644 index 0000000..d43470a --- /dev/null +++ b/zond/src/main/java/asys/zond/JlineProxySysOut.java @@ -0,0 +1,58 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond; + +import jline.console.ConsoleReader; + +import java.io.*; + +public class JlineProxySysOut extends PrintStream { + private ConsoleReader consoleReader; + private PrintWriter writer; + + public JlineProxySysOut(OutputStream out) { + super(out, true); + } + + public void setConsoleReader(ConsoleReader consoleReader) { + this.consoleReader = consoleReader; + this.writer = new PrintWriter(consoleReader.getOutput()); + } + + private void _print(String s) { + writer.print(ConsoleReader.RESET_LINE); + writer.print(s); + cleanTrashLine(s); + writer.println(); + try { + consoleReader.drawLine(); + } catch (IOException ignore) { + } + writer.flush(); + } + + /** + * Очистка печатной строки от мусора + */ + private void cleanTrashLine(String string) { + // очищает полностью строку + if (consoleReader.getCursorBuffer().buffer.length() + consoleReader.getPrompt().length() > string.length()) { + for (int i = string.length(); i <= consoleReader.getCursorBuffer().buffer.length() + 2; i++) { + writer.print(' '); + } + } + } + + @Override + public void write(byte[] buf, int off, int len) { + if ((char)buf[len-1] == '\n') len--; //TODO проверить в windows + _print(new String(buf, off, len)); + } + + @Override + public void println(String x) { + _print(x); + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 9d98f1e..612b769 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -6,6 +6,7 @@ package asys.zond; import asys.zond.proxy.Connector; +import jline.console.ConsoleReader; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; @@ -49,19 +50,46 @@ public class Main { } loadConfig(); - Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args); + JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + ConsoleReader console = new ConsoleReader(System.in, proxySysOut); + proxySysOut.setConsoleReader(console); + console.setPrompt(ConsoleReader.RESET_LINE + ":"); + Thread thread = new Thread(() -> { + Thread current = Thread.currentThread(); - Connector.getInstance().setNeedReconnect(false); - Connector.getInstance().stopReconnect(); - Connector.getInstance().disconnect(); + try { + while (!current.isInterrupted()) { + String line; + if ((line = console.readLine()) != null) { + proxySysOut.println(line); + } + } + } catch (Exception e) { + e.printStackTrace(); //FIXME + } + }); + try { + thread.join(); + thread.start(); + } catch (Exception e) { + e.printStackTrace();//FIXME + } - System.out.println( - Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset() - ); + +// Connector.getInstance().startReconnect(); + +// int resultCode = executeProcess(args); + +// Connector.getInstance().setNeedReconnect(false); +// Connector.getInstance().stopReconnect(); +// Connector.getInstance().disconnect(); + +// System.out.println( +// Ansi.ansi().reset().newline() +// .fg(Color.GREEN).a("Process Finished. Code: ") +// .bold().fg(Color.WHITE).a(resultCode).reset() +// ); } private static int executeProcess(String[] args) {