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) { + } + } +}