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

davsclaus pushed a commit to branch pr/CAMEL-24698-eval-placeholders
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 4c631efe002be6259468260aaaa31d1220cc045a
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Sep 13 15:09:08 2026 +0200

    CAMEL-24698: camel-jbang - camel_eval_expression resolves property 
placeholders
    
    Squash of the 1 commits on fix/CAMEL-24698-eval-placeholders (the 
run-by-run history is on bench/after-run).
    
    camel-console - eval-language resolves property placeholders before 
evaluating, as the route loaders do
    
    Co-Authored-By: Claude Fable 5.1 <[email protected]>
    Claude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj
---
 .../camel/impl/console/EvalLanguageDevConsole.java | 13 +++++++++++
 .../impl/console/EvalLanguageDevConsoleTest.java   | 27 ++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
index 0814e6e4eeaf..3effec949507 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/EvalLanguageDevConsole.java
@@ -85,6 +85,7 @@ public class EvalLanguageDevConsole extends 
AbstractDevConsole {
 
             String out;
             boolean predicate = optionBoolean(options, PREDICATE, false);
+            template = resolvePlaceholders(template);
             if (predicate) {
                 Predicate pre = 
getCamelContext().resolveLanguage(language).createPredicate(template);
                 out = pre.matches(dummy) ? "true" : "false";
@@ -99,6 +100,17 @@ public class EvalLanguageDevConsole extends 
AbstractDevConsole {
         return sb.toString();
     }
 
+    /**
+     * Resolves property placeholders in the template first, as the route 
loaders do before a language parses the text,
+     * so that {{myPeriod}} or ${body} > {{myThreshold}} evaluate as they 
would in a route (CAMEL-24698).
+     */
+    private String resolvePlaceholders(String template) {
+        if (template != null && template.contains("{{")) {
+            return getCamelContext().resolvePropertyPlaceholders(template);
+        }
+        return template;
+    }
+
     @Override
     protected Map<String, Object> doCallJson(Map<String, Object> options) {
         String language = optionString(options, LANGUAGE);
@@ -127,6 +139,7 @@ public class EvalLanguageDevConsole extends 
AbstractDevConsole {
             String out = null;
             try {
                 boolean predicate = optionBoolean(options, PREDICATE, false);
+                template = resolvePlaceholders(template);
                 if (predicate) {
                     Predicate pre = 
getCamelContext().resolveLanguage(language).createPredicate(template);
                     out = pre.matches(dummy) ? "true" : "false";
diff --git 
a/core/camel-console/src/test/java/org/apache/camel/impl/console/EvalLanguageDevConsoleTest.java
 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/EvalLanguageDevConsoleTest.java
index 59e16c302000..9e2c4e881aff 100644
--- 
a/core/camel-console/src/test/java/org/apache/camel/impl/console/EvalLanguageDevConsoleTest.java
+++ 
b/core/camel-console/src/test/java/org/apache/camel/impl/console/EvalLanguageDevConsoleTest.java
@@ -73,6 +73,33 @@ public class EvalLanguageDevConsoleTest extends 
AbstractDevConsoleTest {
         Assertions.assertEquals("bar", out.getString("result"));
     }
 
+    @Test
+    public void testEvalResolvesPropertyPlaceholders() {
+        DevConsole con = assertConsoleExists("eval-language", "camel");
+        context.getPropertiesComponent().addInitialProperty("myThreshold", 
"30");
+
+        JsonObject out = callJson(con, Map.of(
+                "language", "simple",
+                "template", "{{myThreshold}}",
+                "body", ""));
+        Assertions.assertEquals("success", out.getString("status"));
+        Assertions.assertEquals("30", out.getString("result"));
+
+        out = callJson(con, Map.of(
+                "language", "simple",
+                "template", "${body} >= {{myThreshold}}",
+                "predicate", "true",
+                "body", "42"));
+        Assertions.assertEquals("success", out.getString("status"));
+        Assertions.assertEquals("true", out.getString("result"));
+
+        out = callJson(con, Map.of(
+                "language", "simple",
+                "template", "{{unknownKey}}",
+                "body", ""));
+        Assertions.assertEquals("failed", out.getString("status"));
+    }
+
     @Test
     public void testEvalPredicate() {
         DevConsole con = assertConsoleExists("eval-language", "camel");

Reply via email to