This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 3653911d71cd camel-jbang - TUI move web indicator to top right and fix
warnings
3653911d71cd is described below
commit 3653911d71cdaa03db5bd158657b7d0f8a1dd113
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Aug 4 23:24:49 2026 +0200
camel-jbang - TUI move web indicator to top right and fix warnings
Move web :port indicator from inline header to top right corner.
Register deprecated as a non-validation keyword in the YAML DSL
validator to suppress networknt warnings. Handle browser disconnect
NPE in web TUI sessions gracefully.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Signed-off-by: Claus Ibsen <[email protected]>
---
.../dsl/jbang/core/commands/tui/CamelMonitor.java | 26 ++++++++++++++++------
.../dsl/jbang/core/commands/tui/TuiWebServer.java | 3 +++
.../camel/dsl/yaml/validator/YamlValidator.java | 21 ++++++++++++++++-
3 files changed, 42 insertions(+), 8 deletions(-)
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index d1083307bdb6..dd78dbc2c718 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -1512,11 +1512,6 @@ public class CamelMonitor extends CamelCommand {
titleSpans.add(Span.raw(" "));
titleSpans.add(Span.styled(activeInfra + " infra(s)",
Theme.notice()));
}
- if (web && webBackend == null) {
- titleSpans.add(Span.raw(" "));
- titleSpans.add(Span.styled("web :" + webPort,
- Theme.notice().underlined().hyperlink("http://127.0.0.1:"
+ webPort + "/")));
- }
if (ctx.selectedPid != null) {
titleSpans.add(Span.raw(" "));
InfraInfo selInfra = findSelectedInfra();
@@ -1531,6 +1526,13 @@ public class CamelMonitor extends CamelCommand {
monitorNotification = null;
}
}
+ // Right-aligned header spans (web server indicator)
+ List<Span> headerRight = new ArrayList<>();
+ if (web && webBackend == null) {
+ headerRight.add(Span.styled("web :" + webPort + " ",
+ Theme.notice().underlined().hyperlink("http://127.0.0.1:"
+ webPort + "/")));
+ }
+
String activeNotification = monitorNotification;
boolean activeNotificationError = monitorNotificationError;
Line titleLine = Line.from(titleSpans);
@@ -1541,9 +1543,10 @@ public class CamelMonitor extends CamelCommand {
lastWaveNotification = activeNotification;
}
int titleWidth = titleSpans.stream().mapToInt(s ->
s.width()).sum();
+ int rightWidth = headerRight.stream().mapToInt(Span::width).sum();
int waveWidth = activeNotification.length() + 2;
- int leftWidth = Math.min(titleWidth + 2, area.width() - waveWidth);
- if (leftWidth > 0 && waveWidth > 0 && leftWidth + waveWidth <=
area.width()) {
+ int leftWidth = Math.min(titleWidth + 2, area.width() - waveWidth
- rightWidth);
+ if (leftWidth > 0 && waveWidth > 0 && leftWidth + waveWidth +
rightWidth <= area.width()) {
Rect leftArea = new Rect(area.x(), area.y(), leftWidth, 1);
Rect waveArea = new Rect(area.x() + leftWidth, area.y(),
waveWidth, 1);
frame.renderWidget(
@@ -1571,6 +1574,15 @@ public class CamelMonitor extends CamelCommand {
Paragraph.builder().text(Text.from(titleLine)).build(),
area);
}
+ if (!headerRight.isEmpty()) {
+ int rightWidth = headerRight.stream().mapToInt(Span::width).sum();
+ if (rightWidth < area.width()) {
+ Rect rightArea = new Rect(area.x() + area.width() -
rightWidth, area.y(), rightWidth, 1);
+ frame.renderWidget(
+
Paragraph.builder().text(Text.from(Line.from(headerRight))).build(),
+ rightArea);
+ }
+ }
}
private void renderTooSmall(Frame frame, Rect area) {
diff --git
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiWebServer.java
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiWebServer.java
index 55283961475f..f58878b31dbf 100644
---
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiWebServer.java
+++
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/TuiWebServer.java
@@ -197,6 +197,9 @@ class TuiWebServer {
monitor.theme = theme;
monitor.webBackend = backend;
monitor.call();
+ } catch (NullPointerException e) {
+ // Browser disconnected mid-render — Aesh websocket handler's
context is null
+ LOG.log(Level.DEBUG, "Web TUI session disconnected", e);
} catch (Exception e) {
LOG.log(Level.WARNING, "Web TUI session ended with an error", e);
}
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
index 60c0659aab0b..4f49743cc366 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/YamlValidator.java
@@ -32,6 +32,9 @@ import com.networknt.schema.SchemaLocation;
import com.networknt.schema.SchemaRegistry;
import com.networknt.schema.SchemaRegistryConfig;
import com.networknt.schema.SpecificationVersion;
+import com.networknt.schema.dialect.Dialect;
+import com.networknt.schema.dialect.Dialects;
+import com.networknt.schema.keyword.NonValidationKeyword;
/**
* YAML DSL validator that tooling can use to validate Camel source files if
they can be parsed and are valid according
@@ -97,7 +100,13 @@ public class YamlValidator {
var version =
getSpecificationVersion(model).orElse(SpecificationVersion.DRAFT_4);
var config =
SchemaRegistryConfig.builder().locale(Locale.ENGLISH).build();
- var schemaRegistry = SchemaRegistry.withDefaultDialect(version,
+ // Register "deprecated" as a known non-validation keyword to suppress
warnings
+ Dialect base = getBaseDialect(version);
+ Dialect dialect = Dialect.builder(base)
+ .keyword(new NonValidationKeyword("deprecated"))
+ .build();
+
+ var schemaRegistry = SchemaRegistry.withDefaultDialect(dialect,
builder -> builder.schemaRegistryConfig(config));
// Use a proper URI for the schema location to ensure $ref resolution
works
@@ -105,6 +114,16 @@ public class YamlValidator {
schema = schemaRegistry.getSchema(schemaLocation, model);
}
+ private static Dialect getBaseDialect(SpecificationVersion version) {
+ return switch (version) {
+ case DRAFT_4 -> Dialects.getDraft4();
+ case DRAFT_6 -> Dialects.getDraft6();
+ case DRAFT_7 -> Dialects.getDraft7();
+ case DRAFT_2019_09 -> Dialects.getDraft201909();
+ case DRAFT_2020_12 -> Dialects.getDraft202012();
+ };
+ }
+
private static Optional<SpecificationVersion>
getSpecificationVersion(JsonNode schemaNode) {
var schemaField = schemaNode.get("$schema");
if (schemaField != null && schemaField.isTextual()) {