This is an automated email from the ASF dual-hosted git repository.
gnodet 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 5a1a83630622 CAMEL-23237: camel-jbang - Adapt CLI table output to
terminal width
5a1a83630622 is described below
commit 5a1a83630622deca4b5e25586ea865aa2c647262
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed Mar 25 08:16:21 2026 +0100
CAMEL-23237: camel-jbang - Adapt CLI table output to terminal width
- Add TerminalWidthHelper utility that detects terminal width via JLine
and provides flexWidth()/scaleWidth() methods for adaptive column sizing
- Add terminalWidth() method to CamelCommand base class
- Update all 33 command files that produce AsciiTable output to adapt
their column widths based on the detected terminal width
- Two scaling strategies: flexWidth() for single flexible columns
(NO_BORDERS tables), scaleWidth() for proportional scaling of all
columns (FANCY_ASCII tables)
- Add comprehensive unit tests for TerminalWidthHelper
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
.../dsl/jbang/core/commands/CamelCommand.java | 5 +
.../jbang/core/commands/action/CamelBeanDump.java | 31 +++-
.../core/commands/action/CamelBrowseAction.java | 10 +-
.../core/commands/action/CamelHistoryAction.java | 19 ++-
.../core/commands/action/CamelReceiveAction.java | 10 +-
.../action/CamelStartupRecorderAction.java | 8 +-
.../core/commands/action/CamelThreadDump.java | 20 ++-
.../jbang/core/commands/action/LoggerAction.java | 12 +-
.../core/commands/action/MessageTableHelper.java | 42 +++--
.../commands/action/RouteControllerAction.java | 13 +-
.../core/commands/catalog/CatalogBaseCommand.java | 15 +-
.../jbang/core/commands/catalog/CatalogDoc.java | 126 +++++++-------
.../core/commands/catalog/CatalogKamelet.java | 10 +-
.../core/commands/infra/InfraBaseCommand.java | 12 +-
.../core/commands/process/CamelContextStatus.java | 7 +-
.../commands/process/CamelProcessorStatus.java | 13 +-
.../core/commands/process/CamelRouteStatus.java | 25 ++-
.../jbang/core/commands/process/CamelRouteTop.java | 7 +-
.../jbang/core/commands/process/ListConsumer.java | 10 +-
.../jbang/core/commands/process/ListEndpoint.java | 10 +-
.../jbang/core/commands/process/ListGroovy.java | 7 +-
.../jbang/core/commands/process/ListHealth.java | 13 +-
.../core/commands/process/ListInternalTask.java | 7 +-
.../dsl/jbang/core/commands/process/ListKafka.java | 13 +-
.../jbang/core/commands/process/ListMetric.java | 15 +-
.../jbang/core/commands/process/ListProcess.java | 9 +-
.../jbang/core/commands/process/ListProducer.java | 10 +-
.../core/commands/process/ListProperties.java | 21 ++-
.../dsl/jbang/core/commands/process/ListRest.java | 7 +-
.../jbang/core/commands/process/ListService.java | 10 +-
.../jbang/core/commands/process/ListVariable.java | 14 +-
.../dsl/jbang/core/commands/process/ListVault.java | 10 +-
.../dsl/jbang/core/commands/update/UpdateList.java | 9 +-
.../dsl/jbang/core/common/TerminalWidthHelper.java | 114 +++++++++++++
.../jbang/core/common/TerminalWidthHelperTest.java | 186 +++++++++++++++++++++
35 files changed, 711 insertions(+), 139 deletions(-)
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 da95a5257e4e..f1b9b1a4002b 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
@@ -28,6 +28,7 @@ import java.util.concurrent.Callable;
import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
import org.apache.camel.dsl.jbang.core.common.Printer;
import org.apache.camel.dsl.jbang.core.common.RuntimeUtil;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.StringHelper;
import picocli.CommandLine;
import picocli.CommandLine.IParameterConsumer;
@@ -140,6 +141,10 @@ public abstract class CamelCommand implements
Callable<Integer> {
return out;
}
+ protected int terminalWidth() {
+ return TerminalWidthHelper.getTerminalWidth();
+ }
+
protected void printConfigurationValues(String header) {
if (spec != null) {
final Properties configProperties = new Properties();
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
index d622682c1c50..d83e833cfac6 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBeanDump.java
@@ -28,6 +28,7 @@ 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.dsl.jbang.core.common.PathUtils;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
import picocli.CommandLine;
@@ -175,23 +176,41 @@ public class CamelBeanDump extends ActionBaseCommand {
}
protected void singleTable(List<Row> rows) {
+ int tw = terminalWidth();
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(2);
+ int nameWidth = TerminalWidthHelper.flexWidth(tw, 100, borderOverhead,
20, 60);
+ int typeWidth = TerminalWidthHelper.flexWidth(tw, nameWidth,
borderOverhead, 20, 100);
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(60,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(nameWidth, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.name),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(100,
OverflowBehaviour.CLIP_LEFT)
+ new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(typeWidth,
OverflowBehaviour.CLIP_LEFT)
.with(r -> r.type))));
}
protected void propertiesTable(List<PropertyRow> rows) {
+ int tw = terminalWidth();
+ int colCount = dsl ? 4 : 3;
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(colCount);
+ int propWidth = TerminalWidthHelper.flexWidth(tw, 40 + 80 + (dsl ? 80
: 0), borderOverhead, 15, 40);
+ int propTypeWidth = TerminalWidthHelper.flexWidth(tw, propWidth + 80 +
(dsl ? 80 : 0), borderOverhead, 15, 40);
+ int valueWidth = TerminalWidthHelper.flexWidth(tw, propWidth +
propTypeWidth + (dsl ? 80 : 0), borderOverhead, 20, 80);
+ int configWidth = dsl
+ ? TerminalWidthHelper.flexWidth(tw, propWidth + propTypeWidth
+ valueWidth, borderOverhead, 20, 80)
+ : 80;
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
- new
Column().header("PROPERTY").dataAlign(HorizontalAlign.LEFT).maxWidth(40,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new Column().header("PROPERTY").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(propWidth, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.name),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(40,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new Column().header("TYPE").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(propTypeWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.type),
new
Column().header("CONFIGURATION").visible(dsl).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(configWidth, OverflowBehaviour.NEWLINE)
.with(r -> r.configValue),
- new
Column().header("VALUE").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
+ new
Column().header("VALUE").dataAlign(HorizontalAlign.LEFT).maxWidth(valueWidth,
OverflowBehaviour.NEWLINE)
.with(this::getValue))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
index 6d7c85a1a1e8..6bfa60a2375a 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelBrowseAction.java
@@ -30,6 +30,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PathUtils;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.URISupport;
import org.apache.camel.util.json.JsonArray;
@@ -255,6 +256,11 @@ public class CamelBrowseAction extends ActionBaseCommand {
}
protected void tableStatus(List<Row> rows) {
+ int tw = terminalWidth();
+ int fixedWidth = 10 + 40 + 10 + 8 + 15; // PID + NAME + AGE + SIZE +
SINCE (approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(6);
+ int endpointWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth,
borderOverhead, 20, wideUri ? 140 : 90);
+
printer().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)
@@ -265,10 +271,10 @@ public class CamelBrowseAction extends ActionBaseCommand {
new
Column().header("SINCE").headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.LEFT)
.with(this::getMessageAgo),
new
Column().header("ENDPOINT").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(endpointWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getEndpointUri),
new
Column().header("ENDPOINT").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(endpointWidth, OverflowBehaviour.NEWLINE)
.with(r -> r.uri))));
}
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 c887530e8ed7..5d9b64cd3c78 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
@@ -37,6 +37,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.catalog.CamelCatalog;
import org.apache.camel.catalog.DefaultCamelCatalog;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.LoggerHelper;
import org.apache.camel.tooling.model.ComponentModel;
import org.apache.camel.tooling.model.EipModel;
@@ -165,6 +166,13 @@ public class CamelHistoryAction extends ActionWatchCommand
{
first.exchangeId, status, elapsed, ago, first.pid,
first.name);
printer().println(s);
+ int tw = terminalWidth();
+ int fixedWidth = 6 + 20 + 10 + 12; // direction + ID + ELAPSED
+ EXCHANGE
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(6);
+ int flexTotal = tw - fixedWidth - borderOverhead;
+ int processorWidth = TerminalWidthHelper.flexWidth(tw,
fixedWidth + 60, borderOverhead, 20, 55);
+ int messageWidth = TerminalWidthHelper.flexWidth(tw,
fixedWidth + processorWidth, borderOverhead, 20, 60);
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS,
rows, Arrays.asList(
new Column().header("").dataAlign(HorizontalAlign.LEFT)
.minWidth(6).maxWidth(6)
@@ -173,7 +181,7 @@ public class CamelHistoryAction extends ActionWatchCommand {
.minWidth(10).maxWidth(20,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new
Column().header("PROCESSOR").dataAlign(HorizontalAlign.LEFT)
- .minWidth(40).maxWidth(55,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ .minWidth(20).maxWidth(processorWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getProcessor),
new
Column().header("ELAPSED").dataAlign(HorizontalAlign.RIGHT)
.maxWidth(10, OverflowBehaviour.ELLIPSIS_RIGHT)
@@ -182,7 +190,7 @@ public class CamelHistoryAction extends ActionWatchCommand {
.maxWidth(12, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getExchangeId),
new Column().header("").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(60, OverflowBehaviour.NEWLINE)
+ .maxWidth(messageWidth,
OverflowBehaviour.NEWLINE)
.with(this::getMessage))));
JsonObject cause = last.exception;
@@ -313,6 +321,11 @@ public class CamelHistoryAction extends ActionWatchCommand
{
answer.add(new AttributedString(""));
// build full table with all data so the table sizing are always the
same when scrolling
+ int tw = terminalWidth();
+ int itFixedWidth = 6 + 20 + 10 + 12; // direction + ID + ELAPSED +
EXCHANGE
+ int itBorderOverhead = TerminalWidthHelper.noBorderOverhead(6);
+ int itProcessorWidth = TerminalWidthHelper.flexWidth(tw, itFixedWidth,
itBorderOverhead, 20, 55);
+
String table = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new Column().header("").dataAlign(HorizontalAlign.LEFT)
.minWidth(6).maxWidth(6)
@@ -321,7 +334,7 @@ public class CamelHistoryAction extends ActionWatchCommand {
.minWidth(10).maxWidth(20,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new
Column().header("PROCESSOR").dataAlign(HorizontalAlign.LEFT)
- .minWidth(40).maxWidth(55,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ .minWidth(20).maxWidth(itProcessorWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getProcessor),
new Column().header("ELAPSED").dataAlign(HorizontalAlign.RIGHT)
.maxWidth(10, OverflowBehaviour.ELLIPSIS_RIGHT)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
index 90e441403b2c..eea76f25b01a 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelReceiveAction.java
@@ -49,6 +49,7 @@ import org.apache.camel.dsl.jbang.core.commands.Run;
import org.apache.camel.dsl.jbang.core.common.PathUtils;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.main.KameletMain;
import org.apache.camel.util.StopWatch;
import org.apache.camel.util.StringHelper;
@@ -455,6 +456,11 @@ public class CamelReceiveAction extends ActionBaseCommand {
rows.sort(this::sortStatusRow);
if (!rows.isEmpty()) {
+ int tw = terminalWidth();
+ int fixedWidth = 10 + 30 + 10 + 10 + 8 + 10; // PID + NAME + AGE +
STATUS + TOTAL + SINCE (approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(7);
+ int endpointWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth,
borderOverhead, 20, wideUri ? 140 : 90);
+
printer().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_RIGHT)
@@ -465,10 +471,10 @@ public class CamelReceiveAction extends ActionBaseCommand
{
new
Column().header("SINCE").headerAlign(HorizontalAlign.CENTER)
.with(this::getMessageAgo),
new
Column().header("ENDPOINT").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(endpointWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getEndpointUri),
new
Column().header("ENDPOINT").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(endpointWidth, OverflowBehaviour.NEWLINE)
.with(r -> r.uri))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
index 48039860faf5..dcc11d48e366 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderAction.java
@@ -29,6 +29,7 @@ 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.dsl.jbang.core.common.PathUtils;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -100,11 +101,16 @@ public class CamelStartupRecorderAction extends
ActionWatchCommand {
rows.sort(this::sortRow);
if (!rows.isEmpty()) {
+ int tw = terminalWidth();
+ int fixedWidth = 10 + 15; // DURATION + TYPE (approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(3);
+ int stepWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth,
borderOverhead, 20, 80);
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("DURATION").dataAlign(HorizontalAlign.RIGHT).with(this::getDuration),
new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).with(r -> r.type),
new Column().header("STEP
(END)").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(stepWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getStep))));
}
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
index fd3975e5e03f..6f89b164e758 100644
---
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
@@ -29,6 +29,7 @@ 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.dsl.jbang.core.common.PathUtils;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.json.JsonArray;
@@ -190,22 +191,35 @@ public class CamelThreadDump extends ActionWatchCommand {
}
protected void singleTable(List<Row> rows) {
+ int tw = terminalWidth();
+ int fixedWidth = 8 + 15 + 10 + 10; // ID + STATE + BLOCK + WAIT
(approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(6);
+ int nameWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth + 70,
borderOverhead, 20, 60);
+ int stackWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth +
nameWidth, borderOverhead, 20, 70);
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("ID").headerAlign(HorizontalAlign.CENTER).with(r ->
Long.toString(r.id)),
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(60,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(nameWidth, 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))));
+ .maxWidth(stackWidth,
OverflowBehaviour.ELLIPSIS_LEFT).with(this::getStackTrace))));
}
protected void tableAndStackTrace(List<Row> rows) {
+ int tw = terminalWidth();
+ int fixedWidth = 8 + 15 + 10 + 10; // ID + STATE + BLOCK + WAIT
(approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(5);
+ int nameWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth,
borderOverhead, 20, 60);
+
for (Row row : rows) {
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS,
List.of(row), Arrays.asList(
new
Column().header("ID").headerAlign(HorizontalAlign.CENTER).with(r ->
Long.toString(r.id)),
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(60,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(nameWidth,
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),
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerAction.java
index e81b23c164d2..443e8f2fbde7 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerAction.java
@@ -31,6 +31,7 @@ import
org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.LoggingLevelCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonObject;
import picocli.CommandLine;
@@ -124,13 +125,20 @@ public class LoggerAction extends ActionBaseCommand {
rows.sort(this::sortRow);
if (!rows.isEmpty()) {
+ int tw = terminalWidth();
+ int fixedWidth = 10 + 10 + 10; // PID + AGE + LEVEL (approx)
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(5);
+ int nameWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth + 60,
borderOverhead, 15, 40);
+ int loggerWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth +
nameWidth, borderOverhead, 20, 60);
+
printer().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_RIGHT)
+ .maxWidth(nameWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.name),
new
Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.ago),
- new
Column().header("LOGGER").dataAlign(HorizontalAlign.LEFT).with(r -> r.logger),
+ new
Column().header("LOGGER").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(loggerWidth,
OverflowBehaviour.ELLIPSIS_RIGHT).with(r -> r.logger),
new
Column().header("LEVEL").dataAlign(HorizontalAlign.RIGHT).with(r -> r.level))));
}
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 87d29ae8b0bf..78fc1970f657 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
@@ -29,6 +29,7 @@ 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.common.CamelCommandHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -105,6 +106,21 @@ public class MessageTableHelper {
JsonObject aggregate, JsonObject endpoint, JsonObject
endpointService,
JsonObject root, JsonObject cause) {
+ int tw = TerminalWidthHelper.getTerminalWidth();
+ int kindWidth = showExchangeProperties || showExchangeVariables ? 12 :
10;
+ // Compute flexible widths for the 4-column tables (kind + type + key
+ value)
+ int fixed4 = kindWidth + 25 + 25; // kind + type(min) + key(min)
+ int border4 = TerminalWidthHelper.noBorderOverhead(4);
+ int valueWidth = TerminalWidthHelper.flexWidth(tw, fixed4, border4,
20, 80);
+ int typeWidth = TerminalWidthHelper.flexWidth(tw, kindWidth + 25 +
valueWidth, border4, 20, 50);
+ int keyWidth = TerminalWidthHelper.flexWidth(tw, kindWidth + typeWidth
+ valueWidth, border4, 15, 40);
+ // Body/stacktrace spans full width (single column table)
+ int bodyWidth = TerminalWidthHelper.flexWidth(tw, 0,
TerminalWidthHelper.noBorderOverhead(1), 40, 160);
+ // Exception table: kind + type + value (3 columns)
+ int border3 = TerminalWidthHelper.noBorderOverhead(3);
+ int excValueWidth = TerminalWidthHelper.flexWidth(tw, kindWidth + 40,
border3, 20, 80);
+ int excTypeWidth = TerminalWidthHelper.flexWidth(tw, kindWidth +
excValueWidth, border3, 15, 40);
+
List<TableRow> rows = new ArrayList<>();
TableRow eRow;
String tab0 = null;
@@ -205,14 +221,14 @@ public class MessageTableHelper {
if (!rows.isEmpty()) {
tab2 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new Column().dataAlign(HorizontalAlign.LEFT)
- .minWidth(showExchangeProperties ||
showExchangeVariables ? 12 : 10)
+ .minWidth(kindWidth)
.with(TableRow::kindAsString),
new Column().dataAlign(HorizontalAlign.LEFT)
- .minWidth(25).maxWidth(50,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
+ .minWidth(25).maxWidth(typeWidth,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
new Column().dataAlign(HorizontalAlign.RIGHT)
- .minWidth(25).maxWidth(40,
OverflowBehaviour.NEWLINE).with(TableRow::keyAsString),
+ .minWidth(25).maxWidth(keyWidth,
OverflowBehaviour.NEWLINE).with(TableRow::keyAsString),
new Column().dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
+ .maxWidth(valueWidth,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
}
rows.clear();
@@ -255,14 +271,14 @@ public class MessageTableHelper {
// headers
tab4 = AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new Column().dataAlign(HorizontalAlign.LEFT)
- .minWidth(showExchangeProperties ||
showExchangeVariables ? 12 : 10)
+ .minWidth(kindWidth)
.with(TableRow::kindAsString),
new Column().dataAlign(HorizontalAlign.LEFT)
- .minWidth(25).maxWidth(50,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
+ .minWidth(25).maxWidth(typeWidth,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
new Column().dataAlign(HorizontalAlign.RIGHT)
- .minWidth(25).maxWidth(40,
OverflowBehaviour.NEWLINE).with(TableRow::keyAsString),
+ .minWidth(25).maxWidth(keyWidth,
OverflowBehaviour.NEWLINE).with(TableRow::keyAsString),
new Column().dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
+ .maxWidth(valueWidth,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsString)));
}
rows.clear();
@@ -279,7 +295,7 @@ public class MessageTableHelper {
// body value only (span)
if (bodyRow.value != null) {
tab6 = AsciiTable.getTable(AsciiTable.NO_BORDERS,
List.of(bodyRow), Collections.singletonList(
- new
Column().dataAlign(HorizontalAlign.LEFT).maxWidth(160,
OverflowBehaviour.NEWLINE)
+ new
Column().dataAlign(HorizontalAlign.LEFT).maxWidth(bodyWidth,
OverflowBehaviour.NEWLINE)
.with(b -> pretty ?
bodyRow.valueAsStringPretty() : bodyRow.valueAsString())));
}
}
@@ -290,12 +306,12 @@ public class MessageTableHelper {
eRow = new TableRow("Exception", cause.getString("type"), null,
cause.get("message"));
tab7 = AsciiTable.getTable(AsciiTable.NO_BORDERS, List.of(eRow),
Arrays.asList(
new Column().dataAlign(HorizontalAlign.LEFT)
- .minWidth(showExchangeProperties ||
showExchangeVariables ? 12 : 10)
+ .minWidth(kindWidth)
.with(TableRow::kindAsStringRed),
new Column().dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
+ .maxWidth(excTypeWidth,
OverflowBehaviour.CLIP_LEFT).with(TableRow::typeAsString),
new Column().dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsStringRed)));
+ .maxWidth(excValueWidth,
OverflowBehaviour.NEWLINE).with(TableRow::valueAsStringRed)));
}
// stacktrace only (span)
String tab8 = null;
@@ -305,7 +321,7 @@ public class MessageTableHelper {
value = Jsoner.unescape(value);
eRow = new TableRow("Stacktrace", null, null, value);
tab8 = AsciiTable.getTable(AsciiTable.NO_BORDERS,
List.of(eRow), Collections.singletonList(
- new
Column().dataAlign(HorizontalAlign.LEFT).maxWidth(160,
OverflowBehaviour.NEWLINE)
+ new
Column().dataAlign(HorizontalAlign.LEFT).maxWidth(bodyWidth,
OverflowBehaviour.NEWLINE)
.with(TableRow::valueAsStringRed)));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
index 7c5fa1fb64b4..b8970c07541d 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java
@@ -30,6 +30,7 @@ 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.dsl.jbang.core.common.PathUtils;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
@@ -197,10 +198,18 @@ public class RouteControllerAction extends
ActionWatchCommand {
}
protected void dumpTable(List<Row> rows, boolean supervised) {
+ int tw = terminalWidth();
+ int fixedWidth = 25 + 12 + (supervised ? 10 + 10 + 10 : 0); // ID +
STATE + ATTEMPT + ELAPSED + LAST-AGO
+ int colCount = supervised ? 7 : 3;
+ int borderOverhead = TerminalWidthHelper.noBorderOverhead(colCount);
+ int uriWidth = TerminalWidthHelper.flexWidth(tw, fixedWidth +
(supervised ? 80 : 0), borderOverhead, 20, 60);
+ int errorWidth = supervised
+ ? TerminalWidthHelper.flexWidth(tw, fixedWidth + uriWidth,
borderOverhead, 20, 80) : 80;
+
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.routeId),
- new
Column().header("URI").dataAlign(HorizontalAlign.LEFT).maxWidth(60,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new
Column().header("URI").dataAlign(HorizontalAlign.LEFT).maxWidth(uriWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.uri),
new
Column().header("STATE").headerAlign(HorizontalAlign.RIGHT).with(this::getSupervising),
new
Column().visible(supervised).header("ATTEMPT").headerAlign(HorizontalAlign.CENTER)
@@ -209,7 +218,7 @@ public class RouteControllerAction extends
ActionWatchCommand {
new
Column().visible(supervised).header("LAST-AGO").headerAlign(HorizontalAlign.CENTER).with(this::getLast),
new
Column().visible(supervised).header("ERROR-MESSAGE").headerAlign(HorizontalAlign.LEFT)
.dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.ELLIPSIS_RIGHT).with(r
-> r.error))));
+ .maxWidth(errorWidth,
OverflowBehaviour.ELLIPSIS_RIGHT).with(r -> r.error))));
if (supervised && trace) {
rows = rows.stream().filter(r -> r.error != null &&
!r.error.isEmpty()).collect(Collectors.toList());
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
index 288d7ad3defb..9d84eccac320 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogBaseCommand.java
@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
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.catalog.CamelCatalog;
import org.apache.camel.catalog.DefaultCamelCatalog;
import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
@@ -33,6 +34,7 @@ import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
import org.apache.camel.dsl.jbang.core.common.RuntimeTypeConverter;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
import org.apache.camel.dsl.jbang.core.model.CatalogBaseDTO;
import org.apache.camel.tooling.maven.MavenGav;
@@ -156,6 +158,15 @@ public abstract class CatalogBaseCommand extends
CamelCommand {
.map(CatalogBaseDTO::toMap)
.collect(Collectors.toList())));
} else {
+ // Compute description width: terminal minus fixed columns and
border overhead
+ int fixedWidth = nameWidth() + 12 + 8; // LEVEL ~12 chars,
SINCE ~8 chars
+ if (RuntimeType.quarkus == runtime) {
+ fixedWidth += 8; // NATIVE column
+ }
+ int descWidth = TerminalWidthHelper.flexWidth(
+ terminalWidth(), fixedWidth,
TerminalWidthHelper.noBorderOverhead(
+ RuntimeType.quarkus == runtime ? 5 : 4),
+ 20, 80);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS,
rows, Arrays.asList(
new
Column().header("NAME").visible(!displayGav).dataAlign(HorizontalAlign.LEFT).maxWidth(nameWidth())
.with(r -> r.name),
@@ -165,7 +176,9 @@ public abstract class CatalogBaseCommand extends
CamelCommand {
new
Column().header("NATIVE").dataAlign(HorizontalAlign.CENTER)
.visible(RuntimeType.quarkus ==
runtime).with(this::nativeSupported),
new
Column().header("SINCE").dataAlign(HorizontalAlign.RIGHT).with(r -> r.since),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(this::shortDescription))));
+ new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(descWidth,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ .with(this::shortDescription))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
index 2416a4ab6952..fd3b9fdad533 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogDoc.java
@@ -36,6 +36,7 @@ import org.apache.camel.dsl.jbang.core.common.CatalogLoader;
import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
import org.apache.camel.dsl.jbang.core.common.RuntimeTypeConverter;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.main.util.SuggestSimilarHelper;
import org.apache.camel.tooling.maven.MavenGav;
import org.apache.camel.tooling.model.BaseOptionModel;
@@ -275,17 +276,22 @@ public class CatalogDoc extends CamelCommand {
printer().printf("The %s kamelet supports (total: %s
match-filter: %s) options, which are listed below.%n%n",
km.name, total1, total2);
}
+ int[] kw = docColumnWidths5(35, 80, 25, 25, 40);
printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20)
- .maxWidth(35, OverflowBehaviour.NEWLINE)
+ new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(kw[0], OverflowBehaviour.NEWLINE)
.with(r -> r.name),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
+ new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(kw[1], OverflowBehaviour.NEWLINE)
.with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
+ new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(kw[2], OverflowBehaviour.NEWLINE)
.with(r -> r.defaultValue),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
+ new Column().header("TYPE").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(kw[3], OverflowBehaviour.NEWLINE)
.with(r -> r.type),
- new
Column().header("EXAMPLE").dataAlign(HorizontalAlign.LEFT).maxWidth(40,
OverflowBehaviour.NEWLINE)
+ new
Column().header("EXAMPLE").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(kw[4], OverflowBehaviour.NEWLINE)
.with(r -> r.example))));
printer().println("");
}
@@ -338,16 +344,19 @@ public class CatalogDoc extends CamelCommand {
} else {
printer().printf("%s options (total: %s match-filter:
%s):%n", g.getDescription(), total1, total2);
}
+ int[] mw = docColumnWidths(40, 80, 25, 25);
printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20)
- .maxWidth(40, OverflowBehaviour.NEWLINE)
+ new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(mw[0], OverflowBehaviour.NEWLINE)
.with(this::getName),
new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(mw[1], OverflowBehaviour.NEWLINE)
.with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
+ new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(mw[2], OverflowBehaviour.NEWLINE)
+ .with(r -> r.getShortDefaultValue(mw[2])),
+ new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(mw[3], OverflowBehaviour.NEWLINE)
.with(BaseOptionModel::getShortJavaType))));
printer().println("");
printer().println("");
@@ -406,15 +415,7 @@ public class CatalogDoc extends CamelCommand {
printer().println("with the following path and query parameters:");
printer().println("");
printer().printf("Path parameters (%s):%n",
cm.getEndpointPathOptions().size());
- printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
cm.getEndpointPathOptions(), Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20).maxWidth(35,
OverflowBehaviour.NEWLINE)
- .with(this::getName),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
- .with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(BaseOptionModel::getShortJavaType))));
+ printer().println(optionTable(cm.getEndpointPathOptions()));
printer().println("");
var filtered = filter(filter, cm.getEndpointParameterOptions());
var total1 = cm.getEndpointParameterOptions().size();
@@ -424,15 +425,7 @@ public class CatalogDoc extends CamelCommand {
} else {
printer().printf("Query parameters (total: %s match-filter:
%s):%n", total1, total2);
}
- printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20).maxWidth(35,
OverflowBehaviour.NEWLINE)
- .with(this::getName),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
- .with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(BaseOptionModel::getShortJavaType))));
+ printer().println(optionTable(filtered));
printer().println("");
if (headers && !cm.getEndpointHeaders().isEmpty()) {
@@ -444,16 +437,7 @@ public class CatalogDoc extends CamelCommand {
} else {
printer().printf("Message headers (total: %s match-filter:
%s):%n", total1, total2);
}
- printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20)
- .maxWidth(35, OverflowBehaviour.NEWLINE)
- .with(this::getName),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
- .with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(BaseOptionModel::getShortJavaType))));
+ printer().println(optionTable(filtered));
printer().println("");
}
@@ -503,15 +487,7 @@ public class CatalogDoc extends CamelCommand {
printer().printf("The %s dataformat supports (total: %s
match-filter: %s) options, which are listed below.%n%n",
dm.getName(), total1, total2);
}
- printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20).maxWidth(35,
OverflowBehaviour.NEWLINE)
- .with(this::getName),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
- .with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(BaseOptionModel::getShortJavaType))));
+ printer().println(optionTable(filtered));
printer().println("");
if (link != null) {
@@ -560,15 +536,7 @@ public class CatalogDoc extends CamelCommand {
printer().printf("The %s language supports (total: %s
match-filter: %s) options, which are listed below.%n%n",
lm.getName(), total1, total2);
}
- printer().println(AsciiTable.getTable(AsciiTable.FANCY_ASCII,
filtered, Arrays.asList(
- new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).minWidth(20).maxWidth(35,
OverflowBehaviour.NEWLINE)
- .with(this::getName),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(80,
OverflowBehaviour.NEWLINE)
- .with(this::getDescription),
- new
Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(r -> r.getShortDefaultValue(25)),
- new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.NEWLINE)
- .with(BaseOptionModel::getShortJavaType))));
+ printer().println(optionTable(filtered));
printer().println("");
if (link != null) {
@@ -614,6 +582,48 @@ public class CatalogDoc extends CamelCommand {
}
}
+ private int[] docColumnWidths(int nameMax, int descMax, int defaultMax,
int typeMax) {
+ int tw = terminalWidth();
+ int borders = TerminalWidthHelper.fancyBorderOverhead(4);
+ int totalPreferred = nameMax + descMax + defaultMax + typeMax;
+ return new int[] {
+ TerminalWidthHelper.scaleWidth(tw, borders, nameMax, 12,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, descMax, 15,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, defaultMax, 8,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, typeMax, 8,
totalPreferred)
+ };
+ }
+
+ private String optionTable(List<? extends BaseOptionModel> options) {
+ int[] w = docColumnWidths(35, 80, 25, 25);
+ return AsciiTable.getTable(AsciiTable.FANCY_ASCII, options,
Arrays.asList(
+ new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(w[0], OverflowBehaviour.NEWLINE)
+ .with(this::getName),
+ new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(w[1], OverflowBehaviour.NEWLINE)
+ .with(this::getDescription),
+ new Column().header("DEFAULT").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(w[2], OverflowBehaviour.NEWLINE)
+ .with(r -> r.getShortDefaultValue(w[2])),
+ new Column().header("TYPE").dataAlign(HorizontalAlign.LEFT)
+ .maxWidth(w[3], OverflowBehaviour.NEWLINE)
+ .with(BaseOptionModel::getShortJavaType)));
+ }
+
+ private int[] docColumnWidths5(int nameMax, int descMax, int defaultMax,
int typeMax, int exampleMax) {
+ int tw = terminalWidth();
+ int borders = TerminalWidthHelper.fancyBorderOverhead(5);
+ int totalPreferred = nameMax + descMax + defaultMax + typeMax +
exampleMax;
+ return new int[] {
+ TerminalWidthHelper.scaleWidth(tw, borders, nameMax, 12,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, descMax, 15,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, defaultMax, 8,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, typeMax, 8,
totalPreferred),
+ TerminalWidthHelper.scaleWidth(tw, borders, exampleMax, 8,
totalPreferred)
+ };
+ }
+
String getName(BaseOptionModel o) {
String l = o.getShortGroup();
if (l != null && !"common".equals(l)) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
index 304ba8d84f28..b6fd263d6b33 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/catalog/CatalogKamelet.java
@@ -30,6 +30,7 @@ import com.github.freva.asciitable.HorizontalAlign;
import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
import org.apache.camel.main.download.DependencyDownloaderClassLoader;
import org.apache.camel.main.download.MavenDependencyDownloader;
@@ -109,11 +110,18 @@ public class CatalogKamelet extends CamelCommand {
rows.sort(this::sortRow);
if (!rows.isEmpty()) {
+ int tw = terminalWidth();
+ // Fixed columns: NAME (~30), TYPE (10), LEVEL (12)
+ int fixedWidth = 30 + 10 + 12;
+ int descWidth = TerminalWidthHelper.flexWidth(
+ tw, fixedWidth, TerminalWidthHelper.noBorderOverhead(4),
+ 20, 80);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).with(r -> r.name),
new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).minWidth(10).with(r ->
r.type),
new
Column().header("LEVEL").dataAlign(HorizontalAlign.LEFT).minWidth(12).with(r ->
r.supportLevel),
- new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(this::getDescription))));
+ new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).maxWidth(descWidth)
+ .with(this::getDescription))));
}
return 0;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
index e23f41cf8a74..bcba428d72ea 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraBaseCommand.java
@@ -48,6 +48,7 @@ import org.apache.camel.catalog.DefaultCamelCatalog;
import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.model.InfraBaseDTO;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.FileUtil;
@@ -178,11 +179,20 @@ public abstract class InfraBaseCommand extends
CamelCommand {
.map(InfraBaseDTO::toMap)
.collect(Collectors.toList())));
} else {
+ int tw = terminalWidth();
+ // Fixed columns: PID (~8), ALIAS (width+2), SERVICE_DATA (~30),
DESCRIPTION (~30)
+ int fixedWidth = (width + 2) + 30 + 30;
+ if (showPidColumn()) {
+ fixedWidth += 8;
+ }
+ int implWidth = TerminalWidthHelper.flexWidth(
+ tw, fixedWidth,
TerminalWidthHelper.noBorderOverhead(showPidColumn() ? 5 : 4),
+ 20, 35);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("PID").visible(showPidColumn()).headerAlign(HorizontalAlign.CENTER).with(r
-> r.pid),
new Column().header("ALIAS").minWidth(width +
2).dataAlign(HorizontalAlign.LEFT)
.with(Row::alias),
- new Column().header("IMPLEMENTATION").maxWidth(35,
OverflowBehaviour.NEWLINE)
+ new Column().header("IMPLEMENTATION").maxWidth(implWidth,
OverflowBehaviour.NEWLINE)
.dataAlign(HorizontalAlign.LEFT).with(Row::aliasImplementation),
new
Column().header("DESCRIPTION").dataAlign(HorizontalAlign.LEFT).with(Row::description),
new
Column().header("SERVICE_DATA").dataAlign(HorizontalAlign.LEFT).with(Row::serviceData))));
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 e2955e86e36a..e27000a72ee5 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
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
@@ -191,6 +192,10 @@ public class CamelContextStatus extends
ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible column: error description (70)
+ // Fixed columns:
PID(8)+NAME(30)+CAMEL(8)+PLATFORM(12)+PROFILE(8)+READY(5)+STATUS(8)+RELOAD(6)+AGE(8)+ROUTE(5)+MSG/S(5)+TOTAL(5)+FAIL(4)+INFLIGHT(8)+LAST(4)+SINCE-LAST(10)
~= 134
+ int tw = terminalWidth();
+ int errW = TerminalWidthHelper.flexWidth(tw, 134,
TerminalWidthHelper.noBorderOverhead(17), 15, 70);
printer().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)
@@ -213,7 +218,7 @@ public class CamelContextStatus extends ProcessWatchCommand
{
new
Column().header("SINCE-LAST").with(this::getSinceLast),
new Column().header("") // empty header as we only
show info when there is an error
.headerAlign(HorizontalAlign.LEFT).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(70, OverflowBehaviour.NEWLINE)
+ .maxWidth(errW, OverflowBehaviour.NEWLINE)
.with(this::getDescription))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelProcessorStatus.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelProcessorStatus.java
index 3b9d8b877aa4..420cb02b4359 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelProcessorStatus.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelProcessorStatus.java
@@ -29,6 +29,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.tooling.model.Strings;
import org.apache.camel.util.StringHelper;
@@ -326,6 +327,12 @@ public class CamelProcessorStatus extends
ProcessWatchCommand {
}).collect(Collectors.toList())));
return;
}
+ // Flexible columns: ID (40), ID desc (60), PROCESSOR (45)
+ // Fixed columns:
PID(8)+NAME(30)+GROUP(20)+STATUS(8)+TOTAL(5)+FAIL(4)+INFLIGHT(8)+MEAN(4)+MIN(3)+MAX(3)+LAST(4)+DELTA(5)+SINCE-LAST(10)
~= 112
+ int tw = terminalWidth();
+ int idW = TerminalWidthHelper.flexWidth(tw, 112 + 45,
TerminalWidthHelper.noBorderOverhead(15), 15, 40);
+ int idDescW = TerminalWidthHelper.flexWidth(tw, 112 + 45,
TerminalWidthHelper.noBorderOverhead(15), 20, 60);
+ int procW = TerminalWidthHelper.flexWidth(tw, 112 + 40,
TerminalWidthHelper.noBorderOverhead(15), 20, 45);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(this::getPid),
new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30,
OverflowBehaviour.ELLIPSIS_RIGHT)
@@ -334,13 +341,13 @@ public class CamelProcessorStatus extends
ProcessWatchCommand {
.maxWidth(20, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getGroup),
new Column().header("ID").visible(!description &&
!note).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(idW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new Column().header("ID").visible(description ||
note).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(60, OverflowBehaviour.NEWLINE)
+ .maxWidth(idDescW, OverflowBehaviour.NEWLINE)
.with(this::getIdAndNoteDescription),
new
Column().header("PROCESSOR").dataAlign(HorizontalAlign.LEFT).minWidth(25)
- .maxWidth(45, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(procW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getProcessor),
new
Column().header("STATUS").dataAlign(HorizontalAlign.LEFT).headerAlign(HorizontalAlign.CENTER)
.with(this::getStatus),
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 0ace6069aedb..a4106f65f550 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
@@ -30,6 +30,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.tooling.model.Strings;
import org.apache.camel.util.StringHelper;
@@ -285,6 +286,12 @@ public class CamelRouteStatus extends ProcessWatchCommand {
}).collect(Collectors.toList())));
return;
}
+ // Flexible columns: FROM (45/140), ID with description (45)
+ // Fixed columns:
PID(8)+NAME(30)+GROUP(20)+ID(20)+REMOTE(6)+STATUS(8)+AGE(8)+COVER(5)+MSG/S(5)+TOTAL(5)+FAIL(4)+INFLIGHT(8)+MEAN(4)+MIN(3)+MAX(3)+LAST(4)+DELTA(5)+SINCE-LAST(10)
~= 156
+ int tw = terminalWidth();
+ int fromW = TerminalWidthHelper.flexWidth(tw, 156,
TerminalWidthHelper.noBorderOverhead(21), 20, 45);
+ int fromWideW = TerminalWidthHelper.flexWidth(tw, 156,
TerminalWidthHelper.noBorderOverhead(21), 20, 140);
+ int idDescW = TerminalWidthHelper.flexWidth(tw, 156,
TerminalWidthHelper.noBorderOverhead(21), 20, 45);
printer().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_RIGHT)
@@ -296,13 +303,13 @@ public class CamelRouteStatus extends ProcessWatchCommand
{
.maxWidth(20, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new Column().header("ID").visible(description ||
note).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(45, OverflowBehaviour.NEWLINE)
+ .maxWidth(idDescW, OverflowBehaviour.NEWLINE)
.with(this::getIdAndNoteDescription),
new
Column().header("FROM").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(45, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(fromW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getFrom),
new
Column().header("FROM").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(fromWideW, OverflowBehaviour.NEWLINE)
.with(r -> r.from),
new
Column().header("REMOTE").visible(remoteVisible).headerAlign(HorizontalAlign.CENTER)
.dataAlign(HorizontalAlign.CENTER)
@@ -324,6 +331,12 @@ public class CamelRouteStatus extends ProcessWatchCommand {
}
protected void printErrorTable(Row er, boolean remoteVisible) {
+ // Flexible columns: FROM (45), ID desc (45), MESSAGE (80)
+ // Fixed columns:
PID(8)+NAME(30)+ID(20)+REMOTE(6)+STATUS(8)+PHASE(8)+AGO(8) ~= 88
+ int tw2 = terminalWidth();
+ int errFromW = TerminalWidthHelper.flexWidth(tw2, 88,
TerminalWidthHelper.noBorderOverhead(11), 20, 45);
+ int errIdDescW = TerminalWidthHelper.flexWidth(tw2, 88,
TerminalWidthHelper.noBorderOverhead(11), 20, 45);
+ int msgW = TerminalWidthHelper.flexWidth(tw2, 88 + errFromW,
TerminalWidthHelper.noBorderOverhead(11), 20, 80);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS,
List.of(er), Arrays.asList(
new
Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
new
Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30,
OverflowBehaviour.ELLIPSIS_RIGHT)
@@ -332,10 +345,10 @@ public class CamelRouteStatus extends ProcessWatchCommand
{
.maxWidth(20, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new
Column().header("ID").visible(description).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(45, OverflowBehaviour.NEWLINE)
+ .maxWidth(errIdDescW, OverflowBehaviour.NEWLINE)
.with(this::getIdAndNoteDescription),
new
Column().header("FROM").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(45, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(errFromW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getFrom),
new
Column().header("FROM").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
.with(r -> r.from),
@@ -349,7 +362,7 @@ public class CamelRouteStatus extends ProcessWatchCommand {
new Column().header("AGO").headerAlign(HorizontalAlign.CENTER)
.with(this::getErrorAgo),
new Column().header("MESSAGE").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(msgW, OverflowBehaviour.NEWLINE)
.with(r -> r.lastErrorMessage))));
if (!er.stackTrace.isEmpty()) {
printer().println();
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 fbbd4fa714e4..63587c506663 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
@@ -24,6 +24,7 @@ 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.dsl.jbang.core.common.TerminalWidthHelper;
import picocli.CommandLine.Command;
@Command(name = "route", description = "Top performing routes",
@@ -36,6 +37,10 @@ public class CamelRouteTop extends CamelRouteStatus {
@Override
protected void printTable(List<Row> rows, boolean remoteVisible) {
+ // Flexible column: FROM (40)
+ // Fixed columns:
PID(8)+NAME(30)+GROUP(20)+ID(25)+REMOTE(6)+STATUS(8)+AGE(8)+LOAD(12)+TOTAL(5)+FAIL(4)+INFLIGHT(8)+MEAN(4)+MIN(3)+MAX(3)+SINCE-LAST(10)
~= 154
+ int tw = terminalWidth();
+ int fromW = TerminalWidthHelper.flexWidth(tw, 154,
TerminalWidthHelper.noBorderOverhead(16), 20, 40);
printer().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_RIGHT)
@@ -45,7 +50,7 @@ public class CamelRouteTop extends CamelRouteStatus {
.with(this::getGroup),
new
Column().header("ID").dataAlign(HorizontalAlign.LEFT).maxWidth(25,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
- new
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(40,
OverflowBehaviour.ELLIPSIS_RIGHT)
+ new
Column().header("FROM").dataAlign(HorizontalAlign.LEFT).maxWidth(fromW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getFrom),
new
Column().header("REMOTE").visible(remoteVisible).headerAlign(HorizontalAlign.CENTER)
.dataAlign(HorizontalAlign.CENTER)
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListConsumer.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListConsumer.java
index 5b5ec2a2b501..beebcb197fa5 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListConsumer.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListConsumer.java
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
@@ -186,6 +187,11 @@ public class ListConsumer extends ProcessWatchCommand {
}).collect(Collectors.toList())));
return;
}
+ // Flexible column: URI (90/140)
+ // Fixed columns:
PID(8)+NAME(30)+AGE(8)+ID(20)+STATUS(8)+TYPE(20)+INFLIGHT(8)+POLL(4)+PERIOD(6)+SINCE-LAST(10)
~= 122
+ int tw = terminalWidth();
+ int uriW = TerminalWidthHelper.flexWidth(tw, 122,
TerminalWidthHelper.noBorderOverhead(12), 20, 90);
+ int uriWideW = TerminalWidthHelper.flexWidth(tw, 122,
TerminalWidthHelper.noBorderOverhead(12), 20, 140);
printer().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_RIGHT)
@@ -201,10 +207,10 @@ public class ListConsumer extends ProcessWatchCommand {
new
Column().header("PERIOD").visible(scheduled).with(this::getPeriod),
new Column().header("SINCE-LAST").with(this::getSinceLast),
new
Column().header("URI").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(uriW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getUri),
new
Column().header("URI").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(uriWideW, OverflowBehaviour.NEWLINE)
.with(this::getUri))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListEndpoint.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListEndpoint.java
index bb85f9afa337..3ea7020087c8 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListEndpoint.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListEndpoint.java
@@ -28,6 +28,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
@@ -178,6 +179,11 @@ public class ListEndpoint extends ProcessWatchCommand {
}).collect(Collectors.toList())));
return;
}
+ // Flexible column: URI (90/140)
+ // Fixed columns:
PID(8)+NAME(30)+AGE(8)+DIR(3)+TOTAL(5)+STUB(4)+REMOTE(6) ~= 64
+ int tw = terminalWidth();
+ int uriW = TerminalWidthHelper.flexWidth(tw, 64,
TerminalWidthHelper.noBorderOverhead(9), 20, 90);
+ int uriWideW = TerminalWidthHelper.flexWidth(tw, 64,
TerminalWidthHelper.noBorderOverhead(9), 20, 140);
printer().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_RIGHT)
@@ -188,10 +194,10 @@ public class ListEndpoint extends ProcessWatchCommand {
new
Column().header("STUB").dataAlign(HorizontalAlign.CENTER).with(r -> r.stub ?
"x" : ""),
new
Column().header("REMOTE").dataAlign(HorizontalAlign.CENTER).with(r -> r.remote
? "x" : ""),
new
Column().header("URI").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(uriW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getUri),
new
Column().header("URI").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(uriWideW, OverflowBehaviour.NEWLINE)
.with(this::getUri))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListGroovy.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListGroovy.java
index fdc34ae24b4d..78eec51969a7 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListGroovy.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListGroovy.java
@@ -27,6 +27,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -109,6 +110,10 @@ public class ListGroovy extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible column: CLASSES (60)
+ // Fixed columns:
PID(8)+NAME(30)+PRELOAD(7)+COMPILE(7)+TIME(8)+SINCE(8) ~= 68
+ int tw = terminalWidth();
+ int classesW = TerminalWidthHelper.flexWidth(tw, 68,
TerminalWidthHelper.noBorderOverhead(7), 15, 60);
printer().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)
@@ -121,7 +126,7 @@ public class ListGroovy extends ProcessWatchCommand {
new
Column().header("TIME").headerAlign(HorizontalAlign.CENTER).with(this::getTime),
new
Column().header("SINCE").headerAlign(HorizontalAlign.CENTER).with(this::getLast),
new
Column().header("CLASSES").headerAlign(HorizontalAlign.LEFT).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(60,
OverflowBehaviour.ELLIPSIS_LEFT).with(this::getClasses))));
+ .maxWidth(classesW,
OverflowBehaviour.ELLIPSIS_LEFT).with(this::getClasses))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListHealth.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListHealth.java
index 508e04c1aff6..aaf70735aaa0 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListHealth.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListHealth.java
@@ -32,6 +32,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.health.HealthCheckHelper;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.TimeUtils;
@@ -205,14 +206,20 @@ public class ListHealth extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: NAME (40), ID (40), MESSAGE (80)
+ // Fixed columns:
PID(8)+AGE(8)+RL(4)+STATUS(6)+RATE(10)+SINCE(10) ~= 46
+ int tw = terminalWidth();
+ int nameW = TerminalWidthHelper.flexWidth(tw, 46 + 40 + 80,
TerminalWidthHelper.noBorderOverhead(9), 15, 40);
+ int idW = TerminalWidthHelper.flexWidth(tw, 46 + 40 + 80,
TerminalWidthHelper.noBorderOverhead(9), 15, 40);
+ int msgW = TerminalWidthHelper.flexWidth(tw, 46 + nameW + idW,
TerminalWidthHelper.noBorderOverhead(9), 20, 80);
printer().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_RIGHT)
+ .maxWidth(nameW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.name),
new
Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.ago),
new
Column().header("ID").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(idW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getId),
new
Column().header("RL").minWidth(4).maxWidth(4).with(this::getLR),
new
Column().header("STATUS").headerAlign(HorizontalAlign.CENTER)
@@ -225,7 +232,7 @@ public class ListHealth extends ProcessWatchCommand {
.dataAlign(HorizontalAlign.RIGHT)
.with(this::getSince),
new
Column().header("MESSAGE").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(msgW, OverflowBehaviour.NEWLINE)
.with(r -> r.message))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListInternalTask.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListInternalTask.java
index 8260ac6afd81..900aa50190da 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListInternalTask.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListInternalTask.java
@@ -28,6 +28,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -116,6 +117,10 @@ public class ListInternalTask extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible column: FAILURE (140)
+ // Fixed columns:
PID(8)+NAME(30)+TASK(10)+STATUS(8)+ATTEMPT(7)+DELAY(5)+ELAPSED(7)+FIRST(8)+LAST(8)+NEXT(8)
~= 99
+ int tw = terminalWidth();
+ int failW = TerminalWidthHelper.flexWidth(tw, 99,
TerminalWidthHelper.noBorderOverhead(11), 20, 140);
printer().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)
@@ -130,7 +135,7 @@ public class ListInternalTask extends ProcessWatchCommand {
new
Column().header("LAST").dataAlign(HorizontalAlign.LEFT).with(this::getLast),
new
Column().header("NEXT").dataAlign(HorizontalAlign.LEFT).with(this::getNext),
new
Column().header("FAILURE").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(failW, OverflowBehaviour.NEWLINE)
.with(r -> r.error))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListKafka.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListKafka.java
index 490a994c30fb..e4ee014b0d2e 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListKafka.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListKafka.java
@@ -32,6 +32,7 @@ import
org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PathUtils;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.StopWatch;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.TimeUtils;
@@ -199,6 +200,12 @@ public class ListKafka extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: ERROR (60), ENDPOINT (90/140)
+ // Fixed columns:
PID(8)+NAME(30)+ROUTE(8)+STATUS(8)+GROUP-ID(10)+TOPIC(10)+PARTITION(9)+OFFSET(6)+COMMITTED(10)
~= 99
+ int tw = terminalWidth();
+ int errW = TerminalWidthHelper.flexWidth(tw, 99 + 90,
TerminalWidthHelper.noBorderOverhead(12), 15, 60);
+ int epW = TerminalWidthHelper.flexWidth(tw, 99 + 60,
TerminalWidthHelper.noBorderOverhead(12), 20, 90);
+ int epWideW = TerminalWidthHelper.flexWidth(tw, 99 + 60,
TerminalWidthHelper.noBorderOverhead(12), 20, 140);
printer().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)
@@ -213,13 +220,13 @@ public class ListKafka extends ProcessWatchCommand {
new
Column().header("COMMITTED").visible(committed).dataAlign(HorizontalAlign.RIGHT)
.with(this::getCommitted),
new
Column().header("ERROR").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(60, OverflowBehaviour.NEWLINE)
+ .maxWidth(errW, OverflowBehaviour.NEWLINE)
.with(this::getLastError),
new
Column().header("ENDPOINT").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(epW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getUri),
new
Column().header("ENDPOINT").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(epWideW, OverflowBehaviour.NEWLINE)
.with(this::getUri))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListMetric.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListMetric.java
index f7c6f1269ade..422944c07c2b 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListMetric.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListMetric.java
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -221,6 +222,14 @@ public class ListMetric extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: METRIC (40), ID (40), TAGS (60)
+ // Fixed columns:
PID(8)+NAME(30)+TYPE(12)+VALUE(8)+MEAN(6)+MAX(6)+TOTAL(6) ~= 76
+ int tw = terminalWidth();
+ int metricW = TerminalWidthHelper.flexWidth(tw, 76 + 40 + 60,
TerminalWidthHelper.noBorderOverhead(10), 15, 40);
+ int metricIdW
+ = TerminalWidthHelper.flexWidth(tw, 76 + 40 + 60,
TerminalWidthHelper.noBorderOverhead(10), 15, 40);
+ int tagsW = TerminalWidthHelper.flexWidth(tw, 76 + metricW +
metricIdW,
+ TerminalWidthHelper.noBorderOverhead(10), 15, 60);
printer().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)
@@ -228,10 +237,10 @@ public class ListMetric extends ProcessWatchCommand {
.with(r -> r.name),
new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).with(r -> r.type),
new
Column().header("METRIC").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(metricW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.metricName),
new
Column().header("ID").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(metricIdW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.metricId),
new
Column().header("VALUE").headerAlign(HorizontalAlign.RIGHT).dataAlign(HorizontalAlign.RIGHT)
.with(r -> getNumber(r.count)),
@@ -242,7 +251,7 @@ public class ListMetric extends ProcessWatchCommand {
new
Column().header("TOTAL").headerAlign(HorizontalAlign.RIGHT).dataAlign(HorizontalAlign.RIGHT)
.with(r -> getNumber(r.total)),
new
Column().header("TAGS").visible(tags).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(60, OverflowBehaviour.NEWLINE)
+ .maxWidth(tagsW, OverflowBehaviour.NEWLINE)
.with(r -> r.tags))));
}
}
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 d1d68372ec82..2746cab92513 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
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.model.ListProcessDTO;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonObject;
@@ -140,10 +141,14 @@ public class ListProcess extends ProcessWatchCommand {
.map(ListProcessDTO::toMap)
.collect(Collectors.toList())));
} else {
+ // Fixed columns: PID(~8) + NAME(up to nameW) + READY(5) +
STATUS(8) + AGE(8) + TOTAL(6) + FAIL(5) + INFLIGHT(10)
+ int tw = terminalWidth();
+ int nameW = TerminalWidthHelper.flexWidth(tw, 56,
TerminalWidthHelper.noBorderOverhead(9), 15, 40);
+ int errW = TerminalWidthHelper.flexWidth(tw, nameW + 56,
TerminalWidthHelper.noBorderOverhead(9), 10, 70);
printer().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_RIGHT)
+ .maxWidth(nameW,
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)
@@ -154,7 +159,7 @@ public class ListProcess extends ProcessWatchCommand {
new
Column().header("INFLIGHT").with(this::getInflight),
new Column().header("") // empty header as we only
show info when there is an error
.headerAlign(HorizontalAlign.LEFT).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(70, OverflowBehaviour.NEWLINE)
+ .maxWidth(errW, OverflowBehaviour.NEWLINE)
.with(this::getDescription))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProducer.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProducer.java
index 98bb30161abe..bd433098b8fe 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProducer.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProducer.java
@@ -28,6 +28,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
@@ -152,6 +153,11 @@ public class ListProducer extends ProcessWatchCommand {
}).collect(Collectors.toList())));
return;
}
+ // Flexible column: URI (90/140)
+ // Fixed columns: PID(8)+NAME(30)+AGE(8)+ID(20)+STATUS(8)+TYPE(20) ~=
94
+ int tw = terminalWidth();
+ int uriW = TerminalWidthHelper.flexWidth(tw, 94,
TerminalWidthHelper.noBorderOverhead(8), 20, 90);
+ int uriWideW = TerminalWidthHelper.flexWidth(tw, 94,
TerminalWidthHelper.noBorderOverhead(8), 20, 140);
printer().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_RIGHT)
@@ -163,10 +169,10 @@ public class ListProducer extends ProcessWatchCommand {
new
Column().header("TYPE").dataAlign(HorizontalAlign.LEFT).maxWidth(20,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getType),
new
Column().header("URI").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(uriW, OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getUri),
new
Column().header("URI").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(uriWideW, OverflowBehaviour.NEWLINE)
.with(this::getUri))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
index c2130dd622a6..d22c4067f0fc 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListProperties.java
@@ -28,6 +28,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.SensitiveUtils;
import org.apache.camel.util.StringHelper;
import org.apache.camel.util.json.JsonArray;
@@ -148,25 +149,35 @@ public class ListProperties extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: LOCATION (80), KEY (50), VALUE (80),
FUNCTION (50), ORIGINAL VALUE (80)
+ // Fixed columns: PID(8)+NAME(30) ~= 38
+ int tw = terminalWidth();
+ int locW = TerminalWidthHelper.flexWidth(tw, 38 + 50 + 80,
TerminalWidthHelper.noBorderOverhead(7), 20, 80);
+ int keyW = TerminalWidthHelper.flexWidth(tw, 38 + 80 + 80,
TerminalWidthHelper.noBorderOverhead(7), 15, 50);
+ int valW = TerminalWidthHelper.flexWidth(tw, 38 + 80 + 50,
TerminalWidthHelper.noBorderOverhead(7), 20, 80);
+ int funcW = TerminalWidthHelper.flexWidth(tw, 38 + 80 + 50 +
80 + 80, TerminalWidthHelper.noBorderOverhead(7),
+ 15, 50);
+ int origW = TerminalWidthHelper.flexWidth(tw, 38 + 80 + 50 +
80 + 50, TerminalWidthHelper.noBorderOverhead(7),
+ 20, 80);
printer().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_RIGHT)
.with(r -> r.name),
new
Column().header("LOCATION").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(locW, OverflowBehaviour.NEWLINE)
.with(r -> r.loc),
new
Column().header("KEY").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(50, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(keyW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.key),
new
Column().header("VALUE").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(valW, OverflowBehaviour.NEWLINE)
.with(r -> "" + r.value),
new
Column().header("FUNCTION").visible(verbose).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(50, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(funcW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getFunction),
new Column().header("ORIGINAL
VALUE").visible(verbose).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(80, OverflowBehaviour.NEWLINE)
+ .maxWidth(origW, OverflowBehaviour.NEWLINE)
.with(r -> "" + r.originalValue))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java
index 5c277debad0b..1d22ef3fa39c 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListRest.java
@@ -30,6 +30,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -117,6 +118,10 @@ public class ListRest extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible column: DESCRIPTION (40)
+ // Fixed columns:
PID(8)+NAME(30)+URL(10)+METHOD(6)+FIRST(8)+CONTENT-TYPE(20) ~= 82
+ int tw = terminalWidth();
+ int descW = TerminalWidthHelper.flexWidth(tw, 82,
TerminalWidthHelper.noBorderOverhead(7), 15, 40);
printer().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)
@@ -125,7 +130,7 @@ public class ListRest extends ProcessWatchCommand {
new
Column().header("URL").dataAlign(HorizontalAlign.LEFT).with(r -> r.url),
new
Column().header("METHOD").dataAlign(HorizontalAlign.LEFT).with(r -> r.method),
new
Column().header("FIRST").visible(verbose).dataAlign(HorizontalAlign.LEFT).with(this::getKind),
- new
Column().header("DESCRIPTION").visible(verbose).maxWidth(40,
OverflowBehaviour.NEWLINE)
+ new
Column().header("DESCRIPTION").visible(verbose).maxWidth(descW,
OverflowBehaviour.NEWLINE)
.dataAlign(HorizontalAlign.LEFT).with(r ->
r.description),
new
Column().header("CONTENT-TYPE").dataAlign(HorizontalAlign.LEFT).with(this::getContent))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListService.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListService.java
index 4a70bed96302..a5c45a4d4f15 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListService.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListService.java
@@ -29,6 +29,7 @@ import com.github.freva.asciitable.OverflowBehaviour;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.PidNameAgeCompletionCandidates;
import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -129,6 +130,11 @@ public class ListService extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible column: ENDPOINT (90/140)
+ // Fixed columns:
PID(8)+NAME(30)+COMPONENT(10)+DIR(3)+ROUTE(8)+PROTOCOL(8)+SERVICE(10)+METADATA(10)+TOTAL(5)
~= 92
+ int tw = terminalWidth();
+ int epW = TerminalWidthHelper.flexWidth(tw, 92,
TerminalWidthHelper.noBorderOverhead(11), 20, 90);
+ int epWideW = TerminalWidthHelper.flexWidth(tw, 92,
TerminalWidthHelper.noBorderOverhead(11), 20, 140);
printer().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)
@@ -143,10 +149,10 @@ public class ListService extends ProcessWatchCommand {
.with(this::getMetadata),
new
Column().header("TOTAL").dataAlign(HorizontalAlign.RIGHT).with(r -> "" +
r.hits),
new
Column().header("ENDPOINT").visible(!wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(90, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(epW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(this::getUri),
new
Column().header("ENDPOINT").visible(wideUri).dataAlign(HorizontalAlign.LEFT)
- .maxWidth(140, OverflowBehaviour.NEWLINE)
+ .maxWidth(epWideW, OverflowBehaviour.NEWLINE)
.with(this::getUri))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVariable.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVariable.java
index 5efda04fe33b..b3ba18e420ae 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVariable.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVariable.java
@@ -28,6 +28,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
import org.apache.camel.util.json.Jsoner;
@@ -118,6 +119,12 @@ public class ListVariable extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: TYPE (40), KEY (50), VALUE (80)
+ // Fixed columns: PID(8)+NAME(30)+REPO(8) ~= 46
+ int tw = terminalWidth();
+ int typeW = TerminalWidthHelper.flexWidth(tw, 46 + 50 + 80,
TerminalWidthHelper.noBorderOverhead(6), 15, 40);
+ int keyW = TerminalWidthHelper.flexWidth(tw, 46 + 40 + 80,
TerminalWidthHelper.noBorderOverhead(6), 15, 50);
+ int valW = TerminalWidthHelper.flexWidth(tw, 46 + 40 + 50,
TerminalWidthHelper.noBorderOverhead(6), 20, 80);
printer().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)
@@ -125,11 +132,12 @@ public class ListVariable extends ProcessWatchCommand {
.with(r -> r.name),
new
Column().header("REPO").headerAlign(HorizontalAlign.CENTER).with(r -> r.id),
new
Column().header("TYPE").headerAlign(HorizontalAlign.CENTER)
- .maxWidth(40,
OverflowBehaviour.ELLIPSIS_LEFT).with(r -> r.type),
+ .maxWidth(typeW,
OverflowBehaviour.ELLIPSIS_LEFT).with(r -> r.type),
new
Column().header("KEY").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(50, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(keyW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.key),
- new
Column().header("VALUE").headerAlign(HorizontalAlign.RIGHT).maxWidth(80,
OverflowBehaviour.NEWLINE)
+ new
Column().header("VALUE").headerAlign(HorizontalAlign.RIGHT)
+ .maxWidth(valW, OverflowBehaviour.NEWLINE)
.with(this::getValue))));
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java
index 8acb4a6ba2b6..02f7285cd567 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/ListVault.java
@@ -28,6 +28,7 @@ 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.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonArray;
import org.apache.camel.util.json.JsonObject;
@@ -203,15 +204,20 @@ public class ListVault extends ProcessWatchCommand {
return jo;
}).collect(Collectors.toList())));
} else {
+ // Flexible columns: NAME (40), SECRET (40)
+ // Fixed columns:
PID(8)+VAULT(10)+REGION(10)+AGE(8)+UPDATE(8)+CHECK(8) ~= 52
+ int tw = terminalWidth();
+ int nameW = TerminalWidthHelper.flexWidth(tw, 52 + 40,
TerminalWidthHelper.noBorderOverhead(8), 15, 40);
+ int secretW = TerminalWidthHelper.flexWidth(tw, 52 + nameW,
TerminalWidthHelper.noBorderOverhead(8), 15, 40);
printer().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_RIGHT)
+ .maxWidth(nameW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.name),
new
Column().header("VAULT").dataAlign(HorizontalAlign.LEFT).with(r -> r.vault),
new
Column().header("REGION").dataAlign(HorizontalAlign.LEFT).with(r -> r.region),
new
Column().header("SECRET").dataAlign(HorizontalAlign.LEFT)
- .maxWidth(40, OverflowBehaviour.ELLIPSIS_RIGHT)
+ .maxWidth(secretW,
OverflowBehaviour.ELLIPSIS_RIGHT)
.with(r -> r.secret),
new
Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(this::getAgo),
new
Column().header("UPDATE").headerAlign(HorizontalAlign.LEFT).with(this::getReloadAgo),
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java
index ccbc6470c144..70fa469ea396 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java
@@ -38,6 +38,7 @@ import com.github.freva.asciitable.HorizontalAlign;
import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
import org.apache.camel.dsl.jbang.core.common.RuntimeType;
+import org.apache.camel.dsl.jbang.core.common.TerminalWidthHelper;
import org.apache.camel.dsl.jbang.core.common.VersionHelper;
import org.apache.camel.dsl.jbang.core.model.UpdateListDTO;
import org.apache.camel.main.download.MavenDependencyDownloader;
@@ -179,6 +180,12 @@ public class UpdateList extends CamelCommand {
.map(UpdateListDTO::toMap)
.collect(Collectors.toList())));
} else {
+ int tw = terminalWidth();
+ // Fixed columns: VERSION (10), RUNTIME (~18), RUNTIME VERSION
(~17)
+ int fixedWidth = 10 + 18 + 17;
+ int descWidth = TerminalWidthHelper.flexWidth(
+ tw, fixedWidth, TerminalWidthHelper.noBorderOverhead(4),
+ 20, 80);
printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows,
Arrays.asList(
new
Column().header("VERSION").minWidth(10).dataAlign(HorizontalAlign.LEFT)
.with(r -> r.version().toString()),
@@ -186,7 +193,7 @@ public class UpdateList extends CamelCommand {
.dataAlign(HorizontalAlign.LEFT).with(r ->
r.runtime()),
new Column().header("RUNTIME VERSION")
.dataAlign(HorizontalAlign.LEFT).with(r ->
r.runtimeVersion()),
- new Column().header("DESCRIPTION")
+ new Column().header("DESCRIPTION").maxWidth(descWidth)
.dataAlign(HorizontalAlign.LEFT).with(r ->
r.description()))));
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelper.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelper.java
new file mode 100644
index 000000000000..dd723f38390e
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelper.java
@@ -0,0 +1,114 @@
+/*
+ * 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.common;
+
+import org.jline.terminal.Terminal;
+import org.jline.terminal.TerminalBuilder;
+
+/**
+ * Helper for detecting the terminal width to adapt table and command output.
+ *
+ * <p>
+ * Uses JLine to query the actual terminal size. Falls back to a default width
when the terminal size cannot be
+ * determined (e.g., when output is piped or redirected).
+ */
+public final class TerminalWidthHelper {
+
+ private static final int DEFAULT_WIDTH = 120;
+ private static final int MIN_WIDTH = 40;
+
+ private TerminalWidthHelper() {
+ }
+
+ /**
+ * Returns the current terminal width in columns.
+ *
+ * <p>
+ * Attempts to detect the terminal width using JLine. Returns {@value
#DEFAULT_WIDTH} if detection fails or if the
+ * output is not connected to a terminal.
+ */
+ public static int getTerminalWidth() {
+ try (Terminal terminal = TerminalBuilder.builder()
+ .system(true)
+ .dumb(true)
+ .build()) {
+ int width = terminal.getWidth();
+ if (width > 0) {
+ return Math.max(width, MIN_WIDTH);
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ return DEFAULT_WIDTH;
+ }
+
+ /**
+ * Computes the available width for a flexible column (e.g., DESCRIPTION),
given the total terminal width, the sum
+ * of other fixed column widths, and the border overhead.
+ *
+ * @param terminalWidth total terminal width in columns
+ * @param fixedColumnsWidth sum of max widths of all other (non-flexible)
columns
+ * @param borderOverhead overhead from table borders and padding (use
{@link #noBorderOverhead(int)} or
+ * {@link #fancyBorderOverhead(int)})
+ * @param minFlexWidth minimum width for the flexible column
+ * @param maxFlexWidth maximum width for the flexible column (used
when terminal is wide)
+ * @return the computed width for the flexible column
+ */
+ public static int flexWidth(
+ int terminalWidth, int fixedColumnsWidth, int borderOverhead,
+ int minFlexWidth, int maxFlexWidth) {
+ int available = terminalWidth - fixedColumnsWidth - borderOverhead;
+ return Math.max(minFlexWidth, Math.min(maxFlexWidth, available));
+ }
+
+ /**
+ * Scales a column width proportionally based on available terminal width.
All columns with the given preferred
+ * widths are scaled proportionally to fit within the terminal.
+ *
+ * @param terminalWidth total terminal width in columns
+ * @param borderOverhead overhead from table borders and padding
+ * @param preferred the preferred (maximum) width for this column
+ * @param minWidth the minimum width for this column
+ * @param allPreferred the sum of all columns' preferred widths
+ * @return the scaled width for this column
+ */
+ public static int scaleWidth(
+ int terminalWidth, int borderOverhead,
+ int preferred, int minWidth, int allPreferred) {
+ int available = terminalWidth - borderOverhead;
+ if (available >= allPreferred) {
+ return preferred;
+ }
+ int scaled = available * preferred / allPreferred;
+ return Math.max(minWidth, Math.min(preferred, scaled));
+ }
+
+ /**
+ * Border overhead for NO_BORDERS tables: 2 spaces between each column
pair.
+ */
+ public static int noBorderOverhead(int columnCount) {
+ return (columnCount - 1) * 2;
+ }
+
+ /**
+ * Border overhead for FANCY_ASCII tables: | col1 | col2 | ... | colN |
+ */
+ public static int fancyBorderOverhead(int columnCount) {
+ // 1 left border + 1 right border + (columnCount * 2 padding) +
(columnCount - 1) separators
+ return 2 + columnCount * 2 + (columnCount - 1);
+ }
+}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelperTest.java
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelperTest.java
new file mode 100644
index 000000000000..af8e5da22c3e
--- /dev/null
+++
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/TerminalWidthHelperTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.common;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class TerminalWidthHelperTest {
+
+ // --- getTerminalWidth ---
+
+ @Test
+ void getTerminalWidthReturnsPositiveValue() {
+ int width = TerminalWidthHelper.getTerminalWidth();
+ assertTrue(width >= 40, "Terminal width should be at least 40, got: "
+ width);
+ }
+
+ // --- flexWidth ---
+
+ @Test
+ void flexWidthReturnsMaxOnWideTerminal() {
+ // 200 cols - 50 fixed - 10 borders = 140 available; capped at max 80
+ assertEquals(80, TerminalWidthHelper.flexWidth(200, 50, 10, 20, 80));
+ }
+
+ @Test
+ void flexWidthReturnsAvailableOnMediumTerminal() {
+ // 120 cols - 50 fixed - 10 borders = 60 available; between min 20 and
max 80
+ assertEquals(60, TerminalWidthHelper.flexWidth(120, 50, 10, 20, 80));
+ }
+
+ @Test
+ void flexWidthReturnsMinOnNarrowTerminal() {
+ // 60 cols - 50 fixed - 10 borders = 0 available; floored at min 20
+ assertEquals(20, TerminalWidthHelper.flexWidth(60, 50, 10, 20, 80));
+ }
+
+ @Test
+ void flexWidthReturnsMinWhenAvailableIsNegative() {
+ // 40 cols - 80 fixed - 10 borders = -50 available; floored at min 15
+ assertEquals(15, TerminalWidthHelper.flexWidth(40, 80, 10, 15, 80));
+ }
+
+ @Test
+ void flexWidthExactFit() {
+ // 100 cols - 50 fixed - 10 borders = 40 available; exactly at max 40
+ assertEquals(40, TerminalWidthHelper.flexWidth(100, 50, 10, 20, 40));
+ }
+
+ // --- scaleWidth ---
+
+ @Test
+ void scaleWidthReturnsPreferredOnWideTerminal() {
+ // 200 cols - 13 borders = 187 available >= 165 total preferred →
return preferred
+ assertEquals(80, TerminalWidthHelper.scaleWidth(200, 13, 80, 20, 165));
+ assertEquals(35, TerminalWidthHelper.scaleWidth(200, 13, 35, 12, 165));
+ assertEquals(25, TerminalWidthHelper.scaleWidth(200, 13, 25, 8, 165));
+ }
+
+ @Test
+ void scaleWidthScalesProportionallyOnNarrowTerminal() {
+ // 85 cols - 13 borders = 72 available < 165 total preferred
+ // 80 column should scale to 72*80/165 = 34
+ assertEquals(34, TerminalWidthHelper.scaleWidth(85, 13, 80, 15, 165));
+ // 35 column should scale to 72*35/165 = 15
+ assertEquals(15, TerminalWidthHelper.scaleWidth(85, 13, 35, 12, 165));
+ // 25 column should scale to 72*25/165 = 10
+ assertEquals(10, TerminalWidthHelper.scaleWidth(85, 13, 25, 8, 165));
+ }
+
+ @Test
+ void scaleWidthRespectsMinWidth() {
+ // 50 cols - 13 borders = 37 available < 165 total preferred
+ // 25 column would scale to 37*25/165 = 5, but min is 8
+ assertEquals(8, TerminalWidthHelper.scaleWidth(50, 13, 25, 8, 165));
+ }
+
+ @Test
+ void scaleWidthNeverExceedsPreferred() {
+ // Even if available > allPreferred, don't exceed preferred
+ assertEquals(35, TerminalWidthHelper.scaleWidth(500, 13, 35, 12, 165));
+ }
+
+ // --- noBorderOverhead ---
+
+ @Test
+ void noBorderOverheadSingleColumn() {
+ assertEquals(0, TerminalWidthHelper.noBorderOverhead(1));
+ }
+
+ @Test
+ void noBorderOverheadMultipleColumns() {
+ assertEquals(2, TerminalWidthHelper.noBorderOverhead(2));
+ assertEquals(6, TerminalWidthHelper.noBorderOverhead(4));
+ assertEquals(16, TerminalWidthHelper.noBorderOverhead(9));
+ }
+
+ // --- fancyBorderOverhead ---
+
+ @Test
+ void fancyBorderOverheadSingleColumn() {
+ // | col | = 2 borders + 2 padding + 0 separators = 4
+ assertEquals(4, TerminalWidthHelper.fancyBorderOverhead(1));
+ }
+
+ @Test
+ void fancyBorderOverheadFourColumns() {
+ // | c1 | c2 | c3 | c4 | = 2 borders + 8 padding + 3 separators = 13
+ assertEquals(13, TerminalWidthHelper.fancyBorderOverhead(4));
+ }
+
+ @Test
+ void fancyBorderOverheadFiveColumns() {
+ // | c1 | c2 | c3 | c4 | c5 | = 2 + 10 + 4 = 16
+ assertEquals(16, TerminalWidthHelper.fancyBorderOverhead(5));
+ }
+
+ // --- Integration: scaleWidth produces widths that fit terminal ---
+
+ @Test
+ void scaledColumnsWithBordersFitTerminal() {
+ // Simulate CatalogDoc 4-column table: NAME=35, DESC=80, DEFAULT=25,
TYPE=25
+ int terminalWidth = 85;
+ int borders = TerminalWidthHelper.fancyBorderOverhead(4); // 13
+ int totalPreferred = 35 + 80 + 25 + 25; // 165
+
+ int nameW = TerminalWidthHelper.scaleWidth(terminalWidth, borders, 35,
12, totalPreferred);
+ int descW = TerminalWidthHelper.scaleWidth(terminalWidth, borders, 80,
15, totalPreferred);
+ int defW = TerminalWidthHelper.scaleWidth(terminalWidth, borders, 25,
8, totalPreferred);
+ int typeW = TerminalWidthHelper.scaleWidth(terminalWidth, borders, 25,
8, totalPreferred);
+
+ int total = nameW + descW + defW + typeW + borders;
+ assertTrue(total <= terminalWidth,
+ "Total table width %d should fit terminal %d (cols:
%d+%d+%d+%d, borders: %d)"
+ .formatted(total, terminalWidth, nameW, descW, defW,
typeW, borders));
+ }
+
+ @Test
+ void scaledColumnsPreserveWidthOnWideTerminal() {
+ // On a wide terminal, all columns should retain their preferred widths
+ int terminalWidth = 200;
+ int borders = TerminalWidthHelper.fancyBorderOverhead(4);
+ int totalPreferred = 35 + 80 + 25 + 25;
+
+ assertEquals(35, TerminalWidthHelper.scaleWidth(terminalWidth,
borders, 35, 12, totalPreferred));
+ assertEquals(80, TerminalWidthHelper.scaleWidth(terminalWidth,
borders, 80, 15, totalPreferred));
+ assertEquals(25, TerminalWidthHelper.scaleWidth(terminalWidth,
borders, 25, 8, totalPreferred));
+ assertEquals(25, TerminalWidthHelper.scaleWidth(terminalWidth,
borders, 25, 8, totalPreferred));
+ }
+
+ @Test
+ void flexWidthForNoBordersProcessCommand() {
+ // Simulate ListProcess: 9 columns, fixed ~56 chars, NAME flex (max
40), error flex (max 70)
+ int tw = 80;
+ int borders = TerminalWidthHelper.noBorderOverhead(9); // 16
+ int nameW = TerminalWidthHelper.flexWidth(tw, 56, borders, 15, 40);
+ // 80 - 56 - 16 = 8, but min is 15
+ assertEquals(15, nameW);
+
+ tw = 120;
+ nameW = TerminalWidthHelper.flexWidth(tw, 56, borders, 15, 40);
+ // 120 - 56 - 16 = 48, capped at max 40
+ assertEquals(40, nameW);
+
+ tw = 100;
+ nameW = TerminalWidthHelper.flexWidth(tw, 56, borders, 15, 40);
+ // 100 - 56 - 16 = 28
+ assertEquals(28, nameW);
+ }
+}