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()) {

Reply via email to