From 6d0ada1af3b138043dc937cdfd68a22f3ce2d88f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 11:26:08 +0300 Subject: [PATCH 1/7] =?UTF-8?q?Zond:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=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) { From 97b83815d2e7379a7f2904a0c37bcbf0888bc185 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 14:59:16 +0300 Subject: [PATCH 2/7] =?UTF-8?q?Zond:=20=D0=BC=D0=BE=D0=B4=D0=B8=D1=84?= =?UTF-8?q?=D0=B8=D1=86=D0=B8=D1=80=D1=83=D0=B5=D0=BC=20ProxyStdIn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- .../main/java/asys/zond/JlineProxySysIn.java | 88 +++++++++++++++++++ zond/src/main/java/asys/zond/Main.java | 38 ++++---- 3 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 zond/src/main/java/asys/zond/JlineProxySysIn.java diff --git a/zond/build.gradle b/zond/build.gradle index a294e94..67f0c9d 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6-SNAPSHOT' +version = '0.6.7-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/JlineProxySysIn.java b/zond/src/main/java/asys/zond/JlineProxySysIn.java new file mode 100644 index 0000000..5fb6963 --- /dev/null +++ b/zond/src/main/java/asys/zond/JlineProxySysIn.java @@ -0,0 +1,88 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond; + +import java.io.IOException; +import java.io.InputStream; + +public class JlineProxySysIn extends InputStream { + private byte[] buffer = new byte[15]; + private int lastWritePos = 0, + lastReadPos = 0, + wallPos = buffer.length-1; + + public synchronized void write(String s) { + byte[] strBytes = s.getBytes(); + + while ((lastWritePos < lastReadPos) && ((lastReadPos - lastWritePos) >= strBytes.length)) { + try { + wait(); + } catch (InterruptedException e) { + return; + } + } + + if ((lastWritePos + strBytes.length) >= 1024) { + wallPos = lastWritePos; + lastWritePos = 0; + } + + System.arraycopy(strBytes, 0, this.buffer, lastWritePos, strBytes.length); + lastWritePos += strBytes.length; + notify(); + } + + @Override + public synchronized int read() throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + + return this.buffer[lastReadPos++]; + } + + @Override + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + @Override + public synchronized int read(byte[] buffOut, int off, int len) throws IOException { + if (lastReadPos == lastWritePos) { + try { + wait(); + } catch (InterruptedException ignore) { + return 0; + } + } + int actualLen = len; + + if (lastReadPos > lastWritePos) { + if ((lastReadPos + len) > wallPos) { + actualLen = (wallPos - lastReadPos); + } + } else { + if ((lastReadPos + len) > lastWritePos) { + actualLen = (lastWritePos - lastReadPos); + } + } + + System.arraycopy(this.buffer, lastReadPos, buffOut, off, actualLen); + lastReadPos += actualLen; + if (lastReadPos == wallPos) { + lastReadPos = 0; + } + notify(); + return actualLen; + } +} diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 612b769..f86ee40 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -7,10 +7,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; -import org.apache.commons.exec.PumpStreamHandler; +import org.apache.commons.exec.*; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; import org.fusesource.jansi.AnsiConsole; @@ -52,9 +49,11 @@ public class Main { loadConfig(); JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + JlineProxySysIn proxySysIn = new JlineProxySysIn(); ConsoleReader console = new ConsoleReader(System.in, proxySysOut); proxySysOut.setConsoleReader(console); console.setPrompt(ConsoleReader.RESET_LINE + ":"); + Thread thread = new Thread(() -> { Thread current = Thread.currentThread(); @@ -62,7 +61,12 @@ public class Main { while (!current.isInterrupted()) { String line; if ((line = console.readLine()) != null) { - proxySysOut.println(line); + if (line.equalsIgnoreCase(":exit")) { + proxySysOut.println("force exit"); + watchdog.destroyProcess(); + break; + } + proxySysIn.write(line+"\r\n"); } } } catch (Exception e) { @@ -79,30 +83,34 @@ public class Main { // Connector.getInstance().startReconnect(); -// int resultCode = executeProcess(args); + int resultCode = executeProcess(args, proxySysOut, proxySysIn); // 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() -// ); + 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) { + private static ExecuteWatchdog watchdog; + private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); - PrintStream proxySysOut = new ProxySysOut(System.out); - InputStream proxySysIn = new ProxySysIn(); +// PrintStream proxySysOut = new ProxySysOut(System.out); +// InputStream proxySysIn = new ProxySysIn(); - PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); +// PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); + PumpStreamHandler psh = new PumpStreamHandler(printStream, printStream, stdin); psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд executor.setStreamHandler(psh); + watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT); + executor.setWatchdog(watchdog); int resultCode = 0; try { From 4f9c4790a3450f5ea1e4c6aebb0721ffa00f955d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 15:27:42 +0300 Subject: [PATCH 3/7] =?UTF-8?q?Zond:=20=D0=B2=D0=B5=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BA=20=D0=B0=D1=81=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 63 ++++++++------------------ 2 files changed, 19 insertions(+), 46 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 67f0c9d..01e88c6 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.7-SNAPSHOT' +version = '0.6.9-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index f86ee40..5f03951 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -17,6 +17,8 @@ import java.util.Arrays; import java.util.stream.Collectors; public class Main { + private static JlineProxySysOut proxySysOut; + private static void printLogo() { System.out.println( Ansi.ansi().reset() @@ -26,11 +28,14 @@ public class Main { } public static void log(String message){ - System.out.println( - Ansi.ansi().reset() + String msg = Ansi.ansi().reset() .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") - .a(message).reset() - ); + .a(message).reset().toString(); + if (proxySysOut != null) { + proxySysOut.println(msg); + } else { + System.out.println(msg); + } } public static void main(String[] args) throws IOException { @@ -48,7 +53,7 @@ public class Main { loadConfig(); - JlineProxySysOut proxySysOut = new JlineProxySysOut(System.out); + proxySysOut = new JlineProxySysOut(System.out); JlineProxySysIn proxySysIn = new JlineProxySysIn(); ConsoleReader console = new ConsoleReader(System.in, proxySysOut); proxySysOut.setConsoleReader(console); @@ -69,25 +74,26 @@ public class Main { proxySysIn.write(line+"\r\n"); } } - } catch (Exception e) { - e.printStackTrace(); //FIXME + } catch (Throwable ignore) { } }); try { - thread.join(); thread.start(); } catch (Exception e) { e.printStackTrace();//FIXME } -// Connector.getInstance().startReconnect(); + Connector.getInstance().startReconnect(); int resultCode = executeProcess(args, proxySysOut, proxySysIn); -// Connector.getInstance().setNeedReconnect(false); -// Connector.getInstance().stopReconnect(); -// Connector.getInstance().disconnect(); + Connector.getInstance().setNeedReconnect(false); + Connector.getInstance().stopReconnect(); + Connector.getInstance().disconnect(); + + thread.interrupt(); + console.shutdown(); System.out.println( Ansi.ansi().reset().newline() @@ -102,10 +108,6 @@ public class Main { CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); -// PrintStream proxySysOut = new ProxySysOut(System.out); -// InputStream proxySysIn = new ProxySysIn(); - -// PumpStreamHandler psh = new PumpStreamHandler(proxySysOut, proxySysOut, proxySysIn); PumpStreamHandler psh = new PumpStreamHandler(printStream, printStream, stdin); psh.setStopTimeout(-1999); //hack: по-умолчанию в Apache Exec добавляется еще 2000L милисекунд executor.setStreamHandler(psh); @@ -142,33 +144,4 @@ public class Main { Config.load(fis); fis.close(); } - - private static class ProxySysOut extends PrintStream { - ProxySysOut(OutputStream out) { - super(out); - } - - @Override - public void write(byte[] buf, int off, int len) { - super.write(buf, off, len); - Connector.getInstance().sendMessage(new String(buf, off, len)); - } - } - - private static class ProxySysIn extends InputStream { - @Override - public int read() throws IOException { - return System.in.read(); - } - - @Override - public int read(byte[] b) throws IOException { - return System.in.read(b); - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - return System.in.read(b, off, len); - } - } } From 52c5a739420ce67a1bd866dad75e2199af087c10 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 16:41:14 +0300 Subject: [PATCH 4/7] =?UTF-8?q?Zond:=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=BC=D1=8B=20=D1=81=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 56 +++++----------- ...neProxySysIn.java => PipeInputStream.java} | 4 +- .../asys/zond/shell/CommandLineHandler.java | 9 +++ .../zond/{ => shell}/JlineProxySysOut.java | 2 +- zond/src/main/java/asys/zond/shell/Shell.java | 67 +++++++++++++++++++ 6 files changed, 96 insertions(+), 44 deletions(-) rename zond/src/main/java/asys/zond/{JlineProxySysIn.java => PipeInputStream.java} (95%) create mode 100644 zond/src/main/java/asys/zond/shell/CommandLineHandler.java rename zond/src/main/java/asys/zond/{ => shell}/JlineProxySysOut.java (98%) create mode 100644 zond/src/main/java/asys/zond/shell/Shell.java diff --git a/zond/build.gradle b/zond/build.gradle index 01e88c6..c86e4f8 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.9-SNAPSHOT' +version = '0.6.10-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 5f03951..e3cd6d3 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -6,7 +6,7 @@ package asys.zond; import asys.zond.proxy.Connector; -import jline.console.ConsoleReader; +import asys.zond.shell.Shell; import org.apache.commons.exec.*; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.stream.Collectors; public class Main { - private static JlineProxySysOut proxySysOut; + private static ExecuteWatchdog watchdog; private static void printLogo() { System.out.println( @@ -31,8 +31,8 @@ public class Main { String msg = Ansi.ansi().reset() .bg(Color.BLUE).fg(Color.WHITE).a("[ASys Zond] ") .a(message).reset().toString(); - if (proxySysOut != null) { - proxySysOut.println(msg); + if (Shell.getInstance().isActive()) { + Shell.getInstance().getOutput().println(msg); } else { System.out.println(msg); } @@ -53,56 +53,32 @@ public class Main { loadConfig(); - proxySysOut = new JlineProxySysOut(System.out); - JlineProxySysIn proxySysIn = new JlineProxySysIn(); - ConsoleReader console = new ConsoleReader(System.in, proxySysOut); - proxySysOut.setConsoleReader(console); - console.setPrompt(ConsoleReader.RESET_LINE + ":"); - - Thread thread = new Thread(() -> { - Thread current = Thread.currentThread(); - - try { - while (!current.isInterrupted()) { - String line; - if ((line = console.readLine()) != null) { - if (line.equalsIgnoreCase(":exit")) { - proxySysOut.println("force exit"); - watchdog.destroyProcess(); - break; - } - proxySysIn.write(line+"\r\n"); - } - } - } catch (Throwable ignore) { + PipeInputStream pipeInputStream = new PipeInputStream(); + Shell.getInstance().start(System.in, commandLine -> { + if (commandLine.equalsIgnoreCase(":exit")) { + Shell.getInstance().getOutput().println("force exit"); + watchdog.destroyProcess(); + Shell.getInstance().shutdown(); } + pipeInputStream.write(commandLine+"\r\n"); }); - try { - thread.start(); - } catch (Exception e) { - e.printStackTrace();//FIXME - } Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args, proxySysOut, proxySysIn); + int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); Connector.getInstance().setNeedReconnect(false); Connector.getInstance().stopReconnect(); Connector.getInstance().disconnect(); - thread.interrupt(); - console.shutdown(); + Shell.getInstance().shutdown(); - System.out.println( - Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset() - ); + System.out.println(Ansi.ansi().reset().newline() + .fg(Color.GREEN).a("Process Finished. Code: ") + .bold().fg(Color.WHITE).a(resultCode).reset()); } - private static ExecuteWatchdog watchdog; private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); diff --git a/zond/src/main/java/asys/zond/JlineProxySysIn.java b/zond/src/main/java/asys/zond/PipeInputStream.java similarity index 95% rename from zond/src/main/java/asys/zond/JlineProxySysIn.java rename to zond/src/main/java/asys/zond/PipeInputStream.java index 5fb6963..5ea3ef4 100644 --- a/zond/src/main/java/asys/zond/JlineProxySysIn.java +++ b/zond/src/main/java/asys/zond/PipeInputStream.java @@ -7,8 +7,8 @@ package asys.zond; import java.io.IOException; import java.io.InputStream; -public class JlineProxySysIn extends InputStream { - private byte[] buffer = new byte[15]; +public class PipeInputStream extends InputStream { + private byte[] buffer = new byte[1024]; private int lastWritePos = 0, lastReadPos = 0, wallPos = buffer.length-1; diff --git a/zond/src/main/java/asys/zond/shell/CommandLineHandler.java b/zond/src/main/java/asys/zond/shell/CommandLineHandler.java new file mode 100644 index 0000000..fc1d7de --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/CommandLineHandler.java @@ -0,0 +1,9 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond.shell; + +public interface CommandLineHandler { + void handle(String commandLine); +} diff --git a/zond/src/main/java/asys/zond/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java similarity index 98% rename from zond/src/main/java/asys/zond/JlineProxySysOut.java rename to zond/src/main/java/asys/zond/shell/JlineProxySysOut.java index d43470a..49a164a 100644 --- a/zond/src/main/java/asys/zond/JlineProxySysOut.java +++ b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java @@ -2,7 +2,7 @@ * DmitriyMX * 2017-06-14 */ -package asys.zond; +package asys.zond.shell; import jline.console.ConsoleReader; diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java new file mode 100644 index 0000000..c9ecbba --- /dev/null +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -0,0 +1,67 @@ +/* + * DmitriyMX + * 2017-06-14 + */ +package asys.zond.shell; + +import jline.console.ConsoleReader; + +import java.io.*; + +public class Shell { + private static Shell instance = new Shell(); + private boolean active = false; + private ConsoleReader console; + private JlineProxySysOut proxySysOut; + private Thread threadCommandHandler; + + public static Shell getInstance() { + return instance; + } + + private Shell() { + } + + public void start(final InputStream inputStream, final CommandLineHandler commandLineHandler) throws IOException { + proxySysOut = new JlineProxySysOut(System.out); + console = new ConsoleReader(inputStream, proxySysOut); + proxySysOut.setConsoleReader(console); + console.setPrompt(ConsoleReader.RESET_LINE + ":"); + + threadCommandHandler = new Thread(() -> { + Thread current = Thread.currentThread(); + + try { + String line; + while (!current.isInterrupted() && ((line = console.readLine()) != null)) { + commandLineHandler.handle(line); + } + } catch (IOException ignore) { + } + + console.shutdown(); + }, "Shell: command handler"); + active = true; + threadCommandHandler.start(); + } + + public void shutdown() { + threadCommandHandler.interrupt(); + active = false; + } + + public JlineProxySysOut getOutput() { + return proxySysOut; + } + + public boolean isActive() { + return active; + } + + private void safeSleep() { + try { + Thread.sleep(1); + } catch (InterruptedException ignore) { + } + } +} From 349deaa837ee62c4b20fa3ff535c64dc601f3fc1 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 17:39:48 +0300 Subject: [PATCH 5/7] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 28 +++++++++------ .../main/java/asys/zond/proxy/Connector.java | 8 ++--- .../asys/zond/shell/JlineProxySysOut.java | 34 ++++++++++++++++--- zond/src/main/java/asys/zond/shell/Shell.java | 2 ++ 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index c86e4f8..030c805 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.10-SNAPSHOT' +version = '0.6.11-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index e3cd6d3..af901fb 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -57,8 +57,10 @@ public class Main { Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { Shell.getInstance().getOutput().println("force exit"); - watchdog.destroyProcess(); +// watchdog.destroyProcess(); Shell.getInstance().shutdown(); + Main.shutdown(); + return; } pipeInputStream.write(commandLine+"\r\n"); }); @@ -66,17 +68,15 @@ public class Main { Connector.getInstance().startReconnect(); - int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); +// int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); - Connector.getInstance().setNeedReconnect(false); - Connector.getInstance().stopReconnect(); - Connector.getInstance().disconnect(); - - Shell.getInstance().shutdown(); - - System.out.println(Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset()); +// Shell.getInstance().shutdown(); +// +// +// int resultCode = -2; +// 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, PrintStream printStream, InputStream stdin) throws IOException { @@ -120,4 +120,10 @@ public class Main { Config.load(fis); fis.close(); } + + private static void shutdown() { + Connector.getInstance().setNeedReconnect(false); + Connector.getInstance().stopReconnect(); + Connector.getInstance().shutdown(); + } } diff --git a/zond/src/main/java/asys/zond/proxy/Connector.java b/zond/src/main/java/asys/zond/proxy/Connector.java index 7827d49..e41a25b 100644 --- a/zond/src/main/java/asys/zond/proxy/Connector.java +++ b/zond/src/main/java/asys/zond/proxy/Connector.java @@ -54,11 +54,9 @@ public class Connector { } } - public void disconnect() { - if (client.isConnected()) { - log("Disconnect..."); - client.disconnect(); - } + public void shutdown() { + log("Disconnect..."); + client.disconnect(); } public void setChannel(Channel channel) { diff --git a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java index 49a164a..2ead4a6 100644 --- a/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java +++ b/zond/src/main/java/asys/zond/shell/JlineProxySysOut.java @@ -18,7 +18,16 @@ public class JlineProxySysOut extends PrintStream { public void setConsoleReader(ConsoleReader consoleReader) { this.consoleReader = consoleReader; - this.writer = new PrintWriter(consoleReader.getOutput()); + if (consoleReader != null) { + this.writer = new PrintWriter(consoleReader.getOutput()); + } else { + try { + super.out.write('\r'); + super.out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } } private void _print(String s) { @@ -47,12 +56,29 @@ public class JlineProxySysOut extends PrintStream { @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)); + if (consoleReader != null) { + if ((char) buf[len - 1] == '\n') len--; //TODO проверить в windows + _print(new String(buf, off, len)); + } else { + super.write(buf, off, len); + } + } + + @Override + public void print(String x) { + if (consoleReader != null) { + _print(x); + } else { + super.print(x); + } } @Override public void println(String x) { - _print(x); + if (consoleReader != null) { + _print(x); + } else { + super.println(x); + } } } diff --git a/zond/src/main/java/asys/zond/shell/Shell.java b/zond/src/main/java/asys/zond/shell/Shell.java index c9ecbba..0809ca3 100644 --- a/zond/src/main/java/asys/zond/shell/Shell.java +++ b/zond/src/main/java/asys/zond/shell/Shell.java @@ -5,6 +5,7 @@ package asys.zond.shell; import jline.console.ConsoleReader; +import jline.internal.Ansi; import java.io.*; @@ -48,6 +49,7 @@ public class Shell { public void shutdown() { threadCommandHandler.interrupt(); active = false; + proxySysOut.setConsoleReader(null); } public JlineProxySysOut getOutput() { From 915e612862995e4e3d2523d0e9d489fca6a19854 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 17:43:00 +0300 Subject: [PATCH 6/7] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 030c805..6c3b453 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.11-SNAPSHOT' +version = '0.6.12-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index af901fb..182632f 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -57,7 +57,7 @@ public class Main { Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { Shell.getInstance().getOutput().println("force exit"); -// watchdog.destroyProcess(); + watchdog.destroyProcess(); Shell.getInstance().shutdown(); Main.shutdown(); return; @@ -65,18 +65,13 @@ public class Main { pipeInputStream.write(commandLine+"\r\n"); }); - Connector.getInstance().startReconnect(); -// int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); + int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); -// Shell.getInstance().shutdown(); -// -// -// int resultCode = -2; -// System.out.println(Ansi.ansi().reset().newline() -// .fg(Color.GREEN).a("Process Finished. Code: ") -// .bold().fg(Color.WHITE).a(resultCode).reset()); + 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, PrintStream printStream, InputStream stdin) throws IOException { From 07a4324a28d6fd46262f465b7bdd8b1f43688c7f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 14 Jun 2017 18:02:27 +0300 Subject: [PATCH 7/7] =?UTF-8?q?Zond:=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zond/build.gradle | 2 +- zond/src/main/java/asys/zond/Main.java | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/zond/build.gradle b/zond/build.gradle index 6c3b453..64b24b6 100644 --- a/zond/build.gradle +++ b/zond/build.gradle @@ -1,5 +1,5 @@ group = 'asys' -version = '0.6.12-SNAPSHOT' +version = '0.6.13-SNAPSHOT' apply plugin: 'application' diff --git a/zond/src/main/java/asys/zond/Main.java b/zond/src/main/java/asys/zond/Main.java index 182632f..b6db385 100644 --- a/zond/src/main/java/asys/zond/Main.java +++ b/zond/src/main/java/asys/zond/Main.java @@ -56,7 +56,7 @@ public class Main { PipeInputStream pipeInputStream = new PipeInputStream(); Shell.getInstance().start(System.in, commandLine -> { if (commandLine.equalsIgnoreCase(":exit")) { - Shell.getInstance().getOutput().println("force exit"); + log("force exit"); watchdog.destroyProcess(); Shell.getInstance().shutdown(); Main.shutdown(); @@ -64,17 +64,11 @@ public class Main { } pipeInputStream.write(commandLine+"\r\n"); }); - Connector.getInstance().startReconnect(); - - int resultCode = executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); - - System.out.println(Ansi.ansi().reset().newline() - .fg(Color.GREEN).a("Process Finished. Code: ") - .bold().fg(Color.WHITE).a(resultCode).reset()); + executeProcess(args, Shell.getInstance().getOutput(), pipeInputStream); } - private static int executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { + private static void executeProcess(String[] args, PrintStream printStream, InputStream stdin) throws IOException { String cmdLine = Arrays.stream(args).collect(Collectors.joining(" ")); CommandLine commandLine = CommandLine.parse(cmdLine); DefaultExecutor executor = new DefaultExecutor(); @@ -94,7 +88,8 @@ public class Main { resultCode = -1; } - return resultCode; + watchdog = null; + log("Process finished. Code: " + resultCode); } private static void loadConfig() throws IOException {