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 15f261555f5e CAMEL-26929: camel-jbang - cmd logger refuses an unknown 
level, and cmd browse --endpoint=seda:foo matches (#29927)
15f261555f5e is described below

commit 15f261555f5ee251c563e51b7ca47c5f0e48fba7
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Nov 14 19:26:40 2026 +0100

    CAMEL-26929: camel-jbang - cmd logger refuses an unknown level, and cmd 
browse --endpoint=seda:foo matches (#29927)
    
    camel cmd logger --logging-level=BOGUS set the logger to ERROR with exit 
code 0: an
    unknown level is a usage error now. camel cmd browse --endpoint=seda:foo, 
the example
    of its help, matched nothing, as the browse console compared the filter with
    seda://foo: it matches with EndpointHelper.matchEndpoint too.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
 .../org/apache/camel/impl/console/BrowseDevConsole.java  | 15 +++++++++++----
 .../apache/camel/impl/console/BrowseDevConsoleTest.java  | 16 ++++++++++++++++
 .../dsl/jbang/core/commands/action/LoggerAction.java     |  8 ++++++++
 .../dsl/jbang/core/commands/action/LoggerActionTest.java | 15 +++++++++++++++
 4 files changed, 50 insertions(+), 4 deletions(-)

diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/BrowseDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/BrowseDevConsole.java
index f6ff67937a37..b2bb9313bcd2 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/BrowseDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/BrowseDevConsole.java
@@ -28,6 +28,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.spi.BrowsableEndpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
@@ -119,8 +120,7 @@ public class BrowseDevConsole extends AbstractDevConsole {
         Collection<Endpoint> endpoints = new 
TreeSet<>(Comparator.comparing(Endpoint::getEndpointUri));
         endpoints.addAll(getCamelContext().getEndpoints());
         for (Endpoint endpoint : endpoints) {
-            if (endpoint instanceof BrowsableEndpoint be
-                    && (filter == null || 
PatternHelper.matchPattern(endpoint.getEndpointUri(), filter))) {
+            if (endpoint instanceof BrowsableEndpoint be && (filter == null || 
matches(endpoint, filter))) {
 
                 if (dump) {
                     List<Exchange> list = freshSize ? 
be.getExchanges(Integer.MAX_VALUE, null) : be.getExchanges(max, null);
@@ -172,8 +172,7 @@ public class BrowseDevConsole extends AbstractDevConsole {
         Collection<Endpoint> endpoints = new 
TreeSet<>(Comparator.comparing(Endpoint::getEndpointUri));
         endpoints.addAll(getCamelContext().getEndpoints());
         for (Endpoint endpoint : endpoints) {
-            if (endpoint instanceof BrowsableEndpoint be
-                    && (filter == null || 
PatternHelper.matchPattern(endpoint.getEndpointUri(), filter))) {
+            if (endpoint instanceof BrowsableEndpoint be && (filter == null || 
matches(endpoint, filter))) {
                 if (dump) {
                     List<Exchange> list = freshSize ? 
be.getExchanges(Integer.MAX_VALUE, null) : be.getExchanges(max, null);
                     int queueSize = list != null ? list.size() : 0;
@@ -225,4 +224,12 @@ public class BrowseDevConsole extends AbstractDevConsole {
         return JsonRecordSupport.toJsonObject(response);
     }
 
+    /**
+     * Whether the endpoint matches the filter: the endpoint URI with or 
without the // of the scheme (camel cmd browse
+     * --endpoint=seda:foo, the example of its help, matched none, as the URI 
is seda://foo), or a pattern.
+     */
+    private boolean matches(Endpoint endpoint, String filter) {
+        return PatternHelper.matchPattern(endpoint.getEndpointUri(), filter)
+                || EndpointHelper.matchEndpoint(getCamelContext(), 
endpoint.getEndpointUri(), filter);
+    }
 }
diff --git 
a/core/camel-console/src/test/java/org/apache/camel/impl/console/BrowseDevConsoleTest.java
 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/BrowseDevConsoleTest.java
index ff127b2e9199..407435549f1d 100644
--- 
a/core/camel-console/src/test/java/org/apache/camel/impl/console/BrowseDevConsoleTest.java
+++ 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/BrowseDevConsoleTest.java
@@ -61,6 +61,22 @@ public class BrowseDevConsoleTest extends ContextTestSupport 
{
         Assertions.assertTrue(out.contains("seda://queue1"));
     }
 
+    @Test
+    public void testBrowseConsoleFilterWithoutTheSlashesOfTheScheme() throws 
Exception {
+        // camel cmd browse --endpoint=seda:queue1, as its help shows, matched 
none: the URI is seda://queue1
+        template.sendBody("direct:start", "Message 1");
+
+        DevConsole console = 
PluginHelper.getDevConsoleResolver(context).resolveDevConsole("browse");
+        JsonObject out = (JsonObject) console.call(DevConsole.MediaType.JSON, 
Map.of(BrowseDevConsole.FILTER, "seda:queue1"));
+
+        JsonArray browse = out.getCollection("browse");
+        Assertions.assertEquals(1, browse.size(), out.toJson());
+        Assertions.assertEquals("seda://queue1", ((JsonObject) 
browse.get(0)).getString("endpointUri"));
+        // a pattern still matches
+        out = (JsonObject) console.call(DevConsole.MediaType.JSON, 
Map.of(BrowseDevConsole.FILTER, "seda*"));
+        Assertions.assertEquals(2, out.getCollection("browse").size(), 
out.toJson());
+    }
+
     @Test
     public void testBrowseConsoleJson() throws Exception {
         // Send some messages to the seda queue
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 3fb3b1cc5635..388140fa8185 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
@@ -30,6 +30,7 @@ import org.aesh.command.option.Argument;
 import org.aesh.command.option.Mixin;
 import org.aesh.command.option.Option;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.CliException;
 import org.apache.camel.dsl.jbang.core.common.CopyableRow;
 import org.apache.camel.dsl.jbang.core.common.JsonOutput;
 import org.apache.camel.dsl.jbang.core.common.LoggingLevelCompletionCandidates;
@@ -57,6 +58,9 @@ public class LoggerAction extends ActionBaseCommand {
             completer = PidNameAgeCompletionCandidates.class)
     String sort;
 
+    // the levels of the logging, as the completion offers them, and OFF
+    private static final List<String> LEVELS = List.of("ERROR", "WARN", 
"INFO", "DEBUG", "TRACE", "OFF");
+
     @Option(name = "logging-level", description = "To change logging level 
(${COMPLETION-CANDIDATES})",
             completer = LoggingLevelCompletionCandidates.class)
     String loggingLevel;
@@ -82,6 +86,10 @@ public class LoggerAction extends ActionBaseCommand {
         if (name == null) {
             name = "*";
         }
+        // an unknown level was set as ERROR, with exit code 0 (CAMEL-26929)
+        if (LEVELS.stream().noneMatch(l -> l.equalsIgnoreCase(loggingLevel))) {
+            throw CliException.usage("Unknown logging level: " + loggingLevel 
+ " (" + String.join(", ", LEVELS) + ")");
+        }
         return callChangeLoggingLevel();
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
index 56828e745327..cdb70db8e91c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
@@ -25,6 +25,8 @@ import java.util.stream.Stream;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.CliException;
+import org.apache.camel.dsl.jbang.core.common.CliExitCode;
 import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.util.json.JsonObject;
 import org.junit.jupiter.api.AfterEach;
@@ -35,6 +37,7 @@ import org.mockito.MockedStatic;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
@@ -105,6 +108,18 @@ class LoggerActionTest extends CamelCommandBaseTestSupport 
{
         }
     }
 
+    @Test
+    void anUnknownLoggingLevelIsAUsageError() {
+        // it was set as ERROR, with exit code 0 (CAMEL-26929)
+        LoggerAction command = new LoggerAction(new 
CamelJBangMain().withPrinter(printer));
+        command.loggingLevel = "BOGUS";
+
+        CliException e = assertThrows(CliException.class, command::doCall);
+
+        assertEquals(CliExitCode.USAGE, e.getExitCode());
+        assertEquals("Unknown logging level: BOGUS (ERROR, WARN, INFO, DEBUG, 
TRACE, OFF)", e.getMessage());
+    }
+
     @Test
     void testEmptyOutputWhenNoLoggers() throws Exception {
         JsonObject context = new JsonObject();

Reply via email to