This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new bbc62e03d9f camel-jbang - Add thread-dump command
bbc62e03d9f is described below

commit bbc62e03d9f99fcf5daa77862e5e552e97eb11cc
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Sep 12 12:13:12 2022 +0200

    camel-jbang - Add thread-dump command
---
 camel-dependencies/pom.xml                         |   2 +-
 .../camel/impl/console/ThreadDevConsole.java       |  23 +-
 .../camel/cli/connector/LocalCliConnector.java     |  17 +-
 .../dsl/jbang/core/commands/CamelCommand.java      |   7 +
 .../dsl/jbang/core/commands/CamelJBangMain.java    |   2 +
 .../core/commands/action/CamelThreadDump.java      | 249 +++++++++++++++++++++
 .../core/commands/process/CamelContextStatus.java  |   2 +-
 .../core/commands/process/CamelContextTop.java     |   2 +-
 .../core/commands/process/CamelRouteStatus.java    |   6 +-
 .../jbang/core/commands/process/CamelRouteTop.java |   6 +-
 .../jbang/core/commands/process/ListProcess.java   |   2 +-
 parent/pom.xml                                     |   2 +-
 12 files changed, 303 insertions(+), 17 deletions(-)

diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml
index 43df25642c5..a4cfb17132d 100644
--- a/camel-dependencies/pom.xml
+++ b/camel-dependencies/pom.xml
@@ -51,7 +51,7 @@
     
<arquillian-jetty-embedded-9-version>1.0.0.CR3</arquillian-jetty-embedded-9-version>
     <arquillian-version>1.6.0.Final</arquillian-version>
     
<arquillian-weld-embedded-version>2.0.0.Final</arquillian-weld-embedded-version>
-    <ascii-table-version>1.4.0</ascii-table-version>
+    <ascii-table-version>1.6.0</ascii-table-version>
     <asm-version>8.0.1</asm-version>
     <asn1bean-version>1.13.0</asn1bean-version>
     <assertj-version>3.23.1</assertj-version>
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ThreadDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ThreadDevConsole.java
index 124c0d296d8..da09c28213e 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ThreadDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ThreadDevConsole.java
@@ -39,6 +39,7 @@ public class ThreadDevConsole extends AbstractDevConsole {
     protected String doCallText(Map<String, Object> options) {
         StringBuilder sb = new StringBuilder();
 
+        boolean st = "true".equals(options.getOrDefault("stackTrace", 
"false"));
         ThreadMXBean tb = ManagementFactory.getThreadMXBean();
         if (tb != null) {
             sb.append(String.format("Threads: %s\n", tb.getThreadCount()));
@@ -49,10 +50,16 @@ public class ThreadDevConsole extends AbstractDevConsole {
             long[] ids = tb.getAllThreadIds();
             Arrays.sort(ids);
             for (long id : ids) {
-                ThreadInfo ti = tb.getThreadInfo(id);
+                ThreadInfo ti = st ? tb.getThreadInfo(id, Integer.MAX_VALUE) : 
tb.getThreadInfo(id);
                 if (ti != null) {
                     String lock = ti.getLockName() != null ? "locked: " + 
ti.getLockName() : "";
-                    sb.append(String.format("\n    Thread %s: %s (%s) %s", id, 
ti.getThreadName(), ti.getThreadState(), lock));
+                    sb.append(String.format("\n    Thread %s: %s (%s) %s", id, 
ti.getThreadName(), ti.getThreadState().name(),
+                            lock));
+                    if (st) {
+                        for (StackTraceElement e : ti.getStackTrace()) {
+                            sb.append(String.format("\n        %s", e));
+                        }
+                    }
                 }
             }
         }
@@ -64,6 +71,7 @@ public class ThreadDevConsole extends AbstractDevConsole {
     protected JsonObject doCallJson(Map<String, Object> options) {
         JsonObject root = new JsonObject();
 
+        boolean st = "true".equals(options.getOrDefault("stackTrace", 
"false"));
         ThreadMXBean tb = ManagementFactory.getThreadMXBean();
         if (tb != null) {
             root.put("threadCount", tb.getThreadCount());
@@ -77,12 +85,12 @@ public class ThreadDevConsole extends AbstractDevConsole {
             long[] ids = tb.getAllThreadIds();
             Arrays.sort(ids);
             for (long id : ids) {
-                ThreadInfo ti = tb.getThreadInfo(id);
+                ThreadInfo ti = st ? tb.getThreadInfo(id, Integer.MAX_VALUE) : 
tb.getThreadInfo(id);
                 if (ti != null) {
                     JsonObject jo = new JsonObject();
                     jo.put("id", ti.getThreadId());
                     jo.put("name", ti.getThreadName());
-                    jo.put("state", ti.getThreadState());
+                    jo.put("state", ti.getThreadState().name());
                     jo.put("blockedCount", ti.getBlockedCount());
                     jo.put("blockedTime", ti.getBlockedTime());
                     jo.put("waitedCount", ti.getWaitedCount());
@@ -90,6 +98,13 @@ public class ThreadDevConsole extends AbstractDevConsole {
                     if (ti.getLockName() != null) {
                         jo.put("lockName", ti.getLockName());
                     }
+                    if (st) {
+                        JsonArray arr2 = new JsonArray();
+                        jo.put("stackTrace", arr2);
+                        for (StackTraceElement e : ti.getStackTrace()) {
+                            arr2.add(e.toString());
+                        }
+                    }
                     arr.add(jo);
                 }
             }
diff --git 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index 9be325e65b1..d41694fe704 100644
--- 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++ 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -74,6 +74,7 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
     private File lockFile;
     private File statusFile;
     private File actionFile;
+    private File outputFile;
 
     public LocalCliConnector(CliConnectorFactory cliConnectorFactory) {
         this.cliConnectorFactory = cliConnectorFactory;
@@ -131,6 +132,7 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
         if (lockFile != null) {
             statusFile = createLockFile(lockFile.getName() + "-status.json");
             actionFile = createLockFile(lockFile.getName() + "-action.json");
+            outputFile = createLockFile(lockFile.getName() + "-output.json");
             executor.scheduleWithFixedDelay(this::task, 0, delay, 
TimeUnit.MILLISECONDS);
             LOG.info("Camel CLI enabled (local)");
         } else {
@@ -178,7 +180,7 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
     protected void actionTask() {
         try {
             JsonObject root = loadAction();
-            if (root.isEmpty()) {
+            if (root == null || root.isEmpty()) {
                 return;
             }
 
@@ -240,6 +242,14 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
                 if (mcc != null) {
                     mcc.getManagedCamelContext().reset(true);
                 }
+            } else if ("thread-dump".equals(action)) {
+                DevConsole dc = camelContext.adapt(ExtendedCamelContext.class)
+                        .getDevConsoleResolver().resolveDevConsole("thread");
+                if (dc != null) {
+                    JsonObject json = (JsonObject) 
dc.call(DevConsole.MediaType.JSON, Map.of("stackTrace", "true"));
+                    LOG.trace("Updating output file: {}", outputFile);
+                    IOHelper.writeText(json.toJson(), outputFile);
+                }
             }
 
             // action done so delete file
@@ -247,7 +257,7 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
 
         } catch (Throwable e) {
             // ignore
-            LOG.trace(
+            LOG.debug(
                     "Error executing action file: " + actionFile + " due to: " 
+ e.getMessage()
                       + ". This exception is ignored.",
                     e);
@@ -409,6 +419,9 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
         if (actionFile != null) {
             FileUtil.deleteFile(actionFile);
         }
+        if (outputFile != null) {
+            FileUtil.deleteFile(outputFile);
+        }
         if (executor != null) {
             camelContext.getExecutorServiceManager().shutdown(executor);
             executor = null;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
index 02e43eb9710..5653768a46b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
@@ -53,4 +53,11 @@ public abstract class CamelCommand implements 
Callable<Integer> {
         return new File(camelDir, pid + "-action.json");
     }
 
+    public File getOutputFile(String pid) {
+        if (camelDir == null) {
+            camelDir = new File(System.getProperty("user.home"), ".camel");
+        }
+        return new File(camelDir, pid + "-output.json");
+    }
+
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 390289c5409..042df15d887 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -26,6 +26,7 @@ import 
org.apache.camel.dsl.jbang.core.commands.action.CamelReloadAction;
 import org.apache.camel.dsl.jbang.core.commands.action.CamelResetStatsAction;
 import org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStartAction;
 import org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction;
+import org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump;
 import org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus;
 import org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop;
 import org.apache.camel.dsl.jbang.core.commands.process.CamelRouteStatus;
@@ -61,6 +62,7 @@ public class CamelJBangMain implements Callable<Integer> {
                         .addSubcommand("stop-route", new CommandLine(new 
CamelRouteStopAction(main)))
                         .addSubcommand("reset-stats", new CommandLine(new 
CamelResetStatsAction(main)))
                         .addSubcommand("reload", new CommandLine(new 
CamelReloadAction(main)))
+                        .addSubcommand("thread-dump", new CommandLine(new 
CamelThreadDump(main)))
                         .addSubcommand("gc", new CommandLine(new 
CamelGCAction(main))))
                 .addSubcommand("generate", new CommandLine(new 
CodeGenerator(main))
                         .addSubcommand("rest", new CommandLine(new 
CodeRestGenerator(main))))
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelThreadDump.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelThreadDump.java
new file mode 100644
index 00000000000..0e067f1ccea
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelThreadDump.java
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.jbang.core.commands.action;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.github.freva.asciitable.AsciiTable;
+import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
+import com.github.freva.asciitable.OverflowBehaviour;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.support.PatternHelper;
+import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.StopWatch;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+
+@Command(name = "thread-dump", description = "List threads in a running Camel 
integration")
+public class CamelThreadDump extends ActionBaseCommand {
+
+    @CommandLine.Parameters(description = "Name or pid of running Camel 
integration", arity = "1")
+    String name;
+
+    @CommandLine.Option(names = { "--sort" },
+                        description = "Sort by id, name or state", 
defaultValue = "id")
+    String sort;
+
+    @CommandLine.Option(names = { "--filter" },
+                        description = "Filter thread names (use all to include 
all threads)", defaultValue = "Camel")
+    String filter;
+
+    @CommandLine.Option(names = { "--trace" },
+                        description = "Include stack traces", defaultValue = 
"false")
+    boolean trace;
+
+    @CommandLine.Option(names = { "--depth" },
+                        description = "Max depth of stack-trace", defaultValue 
= "1")
+    int depth;
+
+    private volatile long pid;
+
+    public CamelThreadDump(CamelJBangMain main) {
+        super(main);
+    }
+
+    @Override
+    public Integer call() throws Exception {
+        List<Row> rows = new ArrayList<>();
+
+        List<Long> pids = findPids(name);
+        if (pids.isEmpty()) {
+            return 0;
+        } else if (pids.size() > 1) {
+            System.out.println("Name or pid " + name + " matches " + 
pids.size()
+                               + " running Camel integrations. Specify a name 
or PID that matches exactly one.");
+            return 0;
+        }
+
+        // include stack-traces
+        if (trace && depth <= 1) {
+            depth = Integer.MAX_VALUE;
+        }
+
+        this.pid = pids.get(0);
+
+        // ensure output file is deleted before executing action
+        File outputFile = getOutputFile("" + pid);
+        FileUtil.deleteFile(outputFile);
+
+        JsonObject root = new JsonObject();
+        root.put("action", "thread-dump");
+        File f = getActionFile("" + pid);
+        try {
+            IOHelper.writeText(root.toJson(), f);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        JsonObject jo = waitForOutputFile(outputFile);
+        if (jo != null) {
+            JsonArray arr = (JsonArray) jo.get("threads");
+            for (int i = 0; i < arr.size(); i++) {
+                JsonObject jt = (JsonObject) arr.get(i);
+
+                Row row = new Row();
+                row.id = jt.getLong("id");
+                row.name = jt.getString("name");
+
+                // filter
+                boolean match
+                        = "all".equals(filter) || row.name.contains(filter) || 
PatternHelper.matchPattern(row.name, filter);
+                if (!match) {
+                    continue;
+                }
+
+                row.state = jt.getString("state");
+                row.waited = jt.getLong("waitedCount");
+                row.waitedTime = jt.getLong("waitedTime");
+                row.blocked = jt.getLong("blockedCount");
+                row.blockedTime = jt.getLong("blockedTime");
+                row.lock = jt.getString("lockName");
+                row.stackTrace = jt.getCollection("stackTrace");
+                rows.add(row);
+            }
+        } else {
+            System.out.println("Response from running Camel with PID " + pid + 
" not received within 5 seconds");
+            return 1;
+        }
+
+        // sort rows
+        rows.sort(this::sortRow);
+
+        if (!rows.isEmpty()) {
+            int total = jo.getInteger("threadCount");
+            int peak = jo.getInteger("peakThreadCount");
+            System.out.printf("PID: %s\tThreads: %d\tPeak: %d\t\tDisplay: 
%d/%d\n", pid, total, peak, rows.size(), total);
+
+            if (depth == 1) {
+                singleTable(rows);
+            } else {
+                tableAndStackTrace(rows);
+            }
+        }
+
+        // delete output file after use
+        FileUtil.deleteFile(outputFile);
+
+        return 0;
+    }
+
+    protected void singleTable(List<Row> rows) {
+        System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, 
Arrays.asList(
+                new 
Column().header("ID").headerAlign(HorizontalAlign.CENTER).with(r -> "" + r.id),
+                new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(60, 
OverflowBehaviour.ELLIPSIS_RIGHT)
+                        .with(r -> r.name),
+                new 
Column().header("STATE").headerAlign(HorizontalAlign.RIGHT).with(r -> r.state),
+                new Column().header("BLOCK").with(this::getBlocked),
+                new Column().header("WAIT").with(this::getWaited),
+                new 
Column().header("STACKTRACE").headerAlign(HorizontalAlign.RIGHT)
+                        .maxWidth(70, 
OverflowBehaviour.ELLIPSIS_LEFT).with(this::getStackTrace))));
+    }
+
+    protected void tableAndStackTrace(List<Row> rows) {
+        for (Row row : rows) {
+            System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, 
List.of(row), Arrays.asList(
+                    new 
Column().header("ID").headerAlign(HorizontalAlign.CENTER).with(r -> "" + r.id),
+                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(60, 
OverflowBehaviour.ELLIPSIS_RIGHT)
+                            .with(r -> r.name),
+                    new 
Column().header("STATE").headerAlign(HorizontalAlign.RIGHT).with(r -> r.state),
+                    new Column().header("BLOCK").with(this::getBlocked),
+                    new Column().header("WAIT").with(this::getWaited))));
+            for (int i = 0; i < depth && i < row.stackTrace.size(); i++) {
+                System.out.println("\t" + row.stackTrace.get(i));
+            }
+        }
+    }
+
+    protected int sortRow(Row o1, Row o2) {
+        switch (sort) {
+            case "id":
+                return Long.compare(o1.id, o2.id);
+            case "name":
+                return o1.name.compareToIgnoreCase(o2.name);
+            case "state":
+                return o1.state.compareToIgnoreCase(o2.state);
+            default:
+                return 0;
+        }
+    }
+
+    protected JsonObject waitForOutputFile(File outputFile) {
+        StopWatch watch = new StopWatch();
+        while (watch.taken() < 5000) {
+            try {
+                // give time for response to be ready
+                Thread.sleep(100);
+
+                if (outputFile.exists()) {
+                    FileInputStream fis = new FileInputStream(outputFile);
+                    String text = IOHelper.loadText(fis);
+                    IOHelper.close(fis);
+                    return (JsonObject) Jsoner.deserialize(text);
+                }
+
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+        return null;
+    }
+
+    private String getBlocked(Row r) {
+        if (r.blockedTime > 0) {
+            return r.blocked + "(" + r.blockedTime + "ms)";
+        } else {
+            return "" + r.blocked;
+        }
+    }
+
+    private String getWaited(Row r) {
+        if (r.waitedTime > 0) {
+            return r.waited + "(" + r.waitedTime + "ms)";
+        } else {
+            return "" + r.waited;
+        }
+    }
+
+    private String getStackTrace(Row r) {
+        if (r.stackTrace == null || r.stackTrace.isEmpty()) {
+            return "";
+        }
+        return "" + r.stackTrace.get(0);
+    }
+
+    private static class Row {
+        long id;
+        String name;
+        String state;
+        long waited;
+        long waitedTime;
+        long blocked;
+        long blockedTime;
+        String lock;
+        List<String> stackTrace;
+    }
+
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextStatus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextStatus.java
index 77d10278a93..dad534d3b89 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextStatus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextStatus.java
@@ -122,7 +122,7 @@ public class CamelContextStatus extends ProcessBaseCommand {
         if (!rows.isEmpty()) {
             System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, 
rows, Arrays.asList(
                     new 
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS)
+                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                             .with(r -> r.name),
                     new 
Column().header("CAMEL").dataAlign(HorizontalAlign.LEFT).with(r -> 
r.camelVersion),
                     new 
Column().header("PLATFORM").dataAlign(HorizontalAlign.LEFT).with(this::getPlatform),
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextTop.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextTop.java
index 7a2b096b07d..6c5c7f1a5b9 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextTop.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelContextTop.java
@@ -120,7 +120,7 @@ public class CamelContextTop extends ProcessBaseCommand {
         if (!rows.isEmpty()) {
             System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, 
rows, Arrays.asList(
                     new 
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS)
+                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                             .with(r -> r.name),
                     new 
Column().header("JAVA").dataAlign(HorizontalAlign.LEFT).with(this::getJavaVersion),
                     new 
Column().header("CAMEL").dataAlign(HorizontalAlign.LEFT).with(r -> 
r.camelVersion),
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteStatus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteStatus.java
index 592fe53a265..2957886070a 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteStatus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteStatus.java
@@ -148,11 +148,11 @@ public class CamelRouteStatus extends ProcessBaseCommand {
     protected void printTable(List<Row> rows) {
         System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, 
Arrays.asList(
                 new 
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.name),
-                new 
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.routeId),
-                new 
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.from),
                 new 
Column().header("STATUS").headerAlign(HorizontalAlign.CENTER)
                         .with(r -> r.state),
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteTop.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteTop.java
index 8dd9adbe710..4778097498f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteTop.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelRouteTop.java
@@ -37,11 +37,11 @@ public class CamelRouteTop extends CamelRouteStatus {
     protected void printTable(List<Row> rows) {
         System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, 
Arrays.asList(
                 new 
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.name),
-                new 
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.routeId),
-                new 
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS)
+                new 
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                         .with(r -> r.from),
                 new 
Column().header("STATUS").headerAlign(HorizontalAlign.CENTER)
                         .with(r -> r.state),
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProcess.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProcess.java
index 8d1492ffca7..b104522c50f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProcess.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProcess.java
@@ -78,7 +78,7 @@ public class ListProcess extends ProcessBaseCommand {
         if (!rows.isEmpty()) {
             System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, 
rows, Arrays.asList(
                     new 
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS)
+                    new 
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(40, 
OverflowBehaviour.ELLIPSIS_RIGHT)
                             .with(r -> r.name),
                     new 
Column().header("READY").dataAlign(HorizontalAlign.CENTER).with(r -> r.ready),
                     new 
Column().header("STATUS").headerAlign(HorizontalAlign.CENTER)
diff --git a/parent/pom.xml b/parent/pom.xml
index f9cee71cc2e..b9d5642589a 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -68,7 +68,7 @@
         
<arquillian-jetty-embedded-9-version>1.0.0.CR3</arquillian-jetty-embedded-9-version>
         <arquillian-version>1.6.0.Final</arquillian-version>
         
<arquillian-weld-embedded-version>2.0.0.Final</arquillian-weld-embedded-version>
-        <ascii-table-version>1.4.0</ascii-table-version>
+        <ascii-table-version>1.6.0</ascii-table-version>
         <asm-version>8.0.1</asm-version>
         <asn1bean-version>1.13.0</asn1bean-version>
         <assertj-version>3.23.1</assertj-version>

Reply via email to