This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch jline in repository https://gitbox.apache.org/repos/asf/camel.git
commit e77465b459f2d980acd22979bf0fddd671f7e2a1 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Dec 10 06:50:48 2025 +0100 camel-jbang - camel get history use jline to make it mode better --- .../core/commands/action/CamelHistoryAction.java | 71 +++++++++++----------- .../core/commands/action/InteractiveTerminal.java | 17 +++++- .../core/commands/action/MessageTableHelper.java | 6 +- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java index 11c923f64f6a..998c75386788 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java @@ -49,6 +49,7 @@ import org.apache.camel.util.json.JsonArray; import org.apache.camel.util.json.JsonObject; import org.apache.camel.util.json.Jsoner; import org.fusesource.jansi.Ansi; +import org.jline.keymap.KeyMap; import org.jline.utils.AttributedString; import org.jline.utils.AttributedStyle; import org.jline.utils.InfoCmp; @@ -212,42 +213,44 @@ public class CamelHistoryAction extends ActionWatchCommand { tableHelper.setShowExchangeProperties(showExchangeProperties); tableHelper.setShowExchangeVariables(showExchangeVariables); - InteractiveTerminal t = new InteractiveTerminal(); - t.start(); - t.addKeyBinding("quit", "q"); - t.addKeyBinding("up", InfoCmp.Capability.key_up); - t.addKeyBinding("down", InfoCmp.Capability.key_down); - t.addKeyBinding("refresh", InfoCmp.Capability.key_f5); - - t.clearDisplay(); - t.updateDisplay(interactiveContent(rows, index)); - t.flush(); - - do { - String operation = t.readNextKeyBinding(); - if (operation != null) { - if ("quit".equals(operation)) { - quit.set(true); - } else if ("up".equals(operation)) { - if (index.get() > 0) { - index.addAndGet(-1); - } - } else if ("down".equals(operation)) { - if (index.get() < rows.size() - 1) { - index.addAndGet(1); - } - } else if ("refresh".equals(operation)) { - var reloaded = loadRows(); - if (reloaded.size() == 1) { - rows = reloaded.get(0); + try (InteractiveTerminal t = new InteractiveTerminal()) { + t.sigint(() -> quit.set(true)); + t.addKeyBinding("quit", KeyMap.ctrl('c'), "q"); + t.addKeyBinding("up", InfoCmp.Capability.key_up); + t.addKeyBinding("down", InfoCmp.Capability.key_down); + t.addKeyBinding("refresh", InfoCmp.Capability.key_f5); + t.start(); + + t.clearDisplay(); + t.updateDisplay(interactiveContent(rows, index)); + t.flush(); + + do { + String operation = t.readNextKeyBinding(); + if (operation != null) { + if ("quit".equals(operation)) { + quit.set(true); + } else if ("up".equals(operation)) { + if (index.get() > 0) { + index.addAndGet(-1); + } + } else if ("down".equals(operation)) { + if (index.get() < rows.size() - 1) { + index.addAndGet(1); + } + } else if ("refresh".equals(operation)) { + var reloaded = loadRows(); + if (reloaded.size() == 1) { + rows = reloaded.get(0); + } + index.set(0); } - index.set(0); + t.clearDisplay(); + t.updateDisplay(interactiveContent(rows, index)); + t.flush(); } - t.clearDisplay(); - t.updateDisplay(interactiveContent(rows, index)); - t.flush(); - } - } while (!quit.get()); + } while (!quit.get()); + } return 0; } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java index f9bcb3269801..a0910d071e2c 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/InteractiveTerminal.java @@ -43,10 +43,13 @@ public class InteractiveTerminal implements Closeable { private Display display; private Size size; private BindingReader bindingReader; + private Runnable sigint; - public void start() throws Exception { + public InteractiveTerminal() throws Exception { terminal = TerminalBuilder.builder().build(); + } + public void start() { Attributes attributes = terminal.getAttributes(); int vsusp = attributes.getControlChar(Attributes.ControlChar.VSUSP); if (vsusp > 0) { @@ -72,9 +75,19 @@ public class InteractiveTerminal implements Closeable { display.resize(size.getRows(), size.getColumns()); bindingReader = new BindingReader(terminal.reader()); + + if (sigint != null) { + terminal.handle(Terminal.Signal.INT, signal -> { + sigint.run(); + }); + } + } + + public void sigint(Runnable task) { + this.sigint = task; } - public void addKeyBinding(String operation, String key) { + public void addKeyBinding(String operation, String... key) { keys.bind(operation, key); } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java index 129643f3117e..a36f81e7b917 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java @@ -415,7 +415,8 @@ public class MessageTableHelper { s = "WrappedInputStream"; } else if (type.startsWith("org.apache.camel.converter.stream.")) { s = type.substring(34); - } else if (type.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList")) { + } else if (type + .equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList")) { s = "GroupedExchangeList"; } else if (type.length() > 34) { // type must not be too long @@ -448,7 +449,8 @@ public class MessageTableHelper { s = "WrappedInputStream"; } else if (type.startsWith("org.apache.camel.converter.stream.")) { s = type.substring(34); - } else if (type.equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList")) { + } else if (type + .equals("org.apache.camel.processor.aggregate.AbstractListAggregationStrategy.GroupedExchangeList")) { s = "GroupedExchangeList"; } else { s = type;
