From 7dd6086e26f46e513f517be7a5f13b2744558b0d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 1 Feb 2019 13:06:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D1=91=D1=82=D0=BA=D0=B8=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=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shell/build.gradle | 16 ++++++ shell/src/main/java/mc/core/shell/Main.java | 58 +++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 shell/build.gradle create mode 100644 shell/src/main/java/mc/core/shell/Main.java diff --git a/shell/build.gradle b/shell/build.gradle new file mode 100644 index 0000000..cb3776f --- /dev/null +++ b/shell/build.gradle @@ -0,0 +1,16 @@ +version '0.1-SNAPSHOT' + +ext { + jline_version = '3.9.1-SNAPSHOT'; +} + +dependencies { + /* Core */ + compile_excludeCopy project(':core') + + compile (group: 'org.slf4j', name: 'jul-to-slf4j', version: slf4j_version) + compile (group: 'org.slf4j', name: 'slf4j-simple', version: slf4j_version) + + compile (group: 'org.jline', name: 'jline', version: jline_version) + compile (group: 'org.jline', name: 'jline-terminal-jna', version: jline_version) +} diff --git a/shell/src/main/java/mc/core/shell/Main.java b/shell/src/main/java/mc/core/shell/Main.java new file mode 100644 index 0000000..f5a92f1 --- /dev/null +++ b/shell/src/main/java/mc/core/shell/Main.java @@ -0,0 +1,58 @@ +package mc.core.shell; + +import lombok.extern.slf4j.Slf4j; +import org.jline.reader.*; +import org.jline.reader.impl.DefaultParser; +import org.jline.reader.impl.DefaultParser.Bracket; +import org.jline.terminal.Terminal; +import org.jline.terminal.TerminalBuilder; + +import java.io.IOException; + +@Slf4j +public class Main { + + public static void main(String[] args) throws IOException { + final String prompt = "mc-core> "; + final String rightPrompt = null; + + DefaultParser parser = new DefaultParser(); + parser.setEofOnUnclosedQuote(true); + parser.eofOnUnclosedBracket(Bracket.CURLY,Bracket.ROUND, Bracket.SQUARE); + + final Terminal terminal = TerminalBuilder.builder().build(); + + LineReader reader = LineReaderBuilder.builder() + .terminal(terminal) + .parser(parser) + .variable(LineReader.SECONDARY_PROMPT_PATTERN, "%M%P > ") + .build(); + + Runnable shellTask = () -> { + log.info("< SHELL >"); + while (!Thread.currentThread().isInterrupted()) { + String line = null; + + try { + line = reader.readLine(prompt, rightPrompt, (MaskingCallback) null, null); + } catch (UserInterruptException ignore) { + } catch (EndOfFileException e) { + return; + } + + if (line == null) { + continue; + } + + log.info(line.trim()); + } + }; + + Thread thread = new Thread(shellTask, "JLine reader Thread"); + thread.start(); + try { + thread.join(); + } catch (InterruptedException ignore) { + } + } +}