This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch tn in repository https://gitbox.apache.org/repos/asf/camel.git
commit 5fe68714c17907f9d3b9ff3f0767dd121176c35f Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jan 26 10:42:56 2026 +0100 CAMEL-22904: camel-core - Simple language ternary parser should not fail for log expressions --- .../camel/language/simple/SimpleExpressionParser.java | 15 +++++++++++---- .../camel/language/simple/types/SimpleTokenType.java | 14 ++++++++++++++ .../apache/camel/language/simple/SimpleOperatorTest.java | 2 -- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java index 2179907af405..c46c556c86f0 100644 --- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java +++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/SimpleExpressionParser.java @@ -238,6 +238,7 @@ public class SimpleExpressionParser extends BaseSimpleParser { // counter to keep track of number of functions in the tokens AtomicInteger functions = new AtomicInteger(); + AtomicInteger ternary = new AtomicInteger(); LiteralNode imageToken = null; for (SimpleToken token : tokens) { @@ -247,7 +248,7 @@ public class SimpleExpressionParser extends BaseSimpleParser { } // create a node from the token - SimpleNode node = createNode(token, functions); + SimpleNode node = createNode(token, functions, ternary); if (node != null) { // a new token was created so the current image token need to be added first if (imageToken != null) { @@ -274,14 +275,14 @@ public class SimpleExpressionParser extends BaseSimpleParser { } } - private SimpleNode createNode(SimpleToken token, AtomicInteger functions) { + private SimpleNode createNode(SimpleToken token, AtomicInteger functions, AtomicInteger ternary) { // expression only support functions, unary operators, ternary operators, and other operators if (token.getType().isFunctionStart()) { // starting a new function functions.incrementAndGet(); return new SimpleFunctionStart(token, cacheExpression, skipFileFunctions); } else if (functions.get() > 0 && token.getType().isFunctionEnd()) { - // there must be a start function already, to let this be a end function + // there must be a start function already, to let this be an end function functions.decrementAndGet(); return new SimpleFunctionEnd(token); } else if (token.getType().isUnary()) { @@ -289,7 +290,13 @@ public class SimpleExpressionParser extends BaseSimpleParser { if (!nodes.isEmpty() && nodes.get(nodes.size() - 1) instanceof SimpleFunctionEnd) { return new UnaryExpression(token); } - } else if (token.getType().isTernary()) { + } else if (token.getType().isTernaryStart()) { + // starting a new ternary + ternary.incrementAndGet(); + return new TernaryExpression(token); + } else if (ternary.get() > 0 && token.getType().isTernaryEnd()) { + // there must be a start ternary already, to let this be an end ternary + ternary.decrementAndGet(); return new TernaryExpression(token); } else if (token.getType().isOther()) { return new OtherExpression(token); diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java index ba41ee1a7508..6a773d8816f6 100644 --- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java +++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/types/SimpleTokenType.java @@ -180,6 +180,20 @@ public final class SimpleTokenType { return type == TokenType.ternaryOperator; } + /** + * Whether the type is ternary start operator (?) + */ + public boolean isTernaryStart() { + return type == TokenType.ternaryOperator && "?".equals(value); + } + + /** + * Whether the type is ternary start operator (:) + */ + public boolean isTernaryEnd() { + return type == TokenType.ternaryOperator && ":".equals(value); + } + @Override public String toString() { return value; diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java index f8717a09078c..2fe58b9b5b8c 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleOperatorTest.java @@ -20,7 +20,6 @@ import org.apache.camel.Exchange; import org.apache.camel.LanguageTestSupport; import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException; import org.apache.camel.spi.Registry; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -889,7 +888,6 @@ public class SimpleOperatorTest extends LanguageTestSupport { } @Test - @Disabled("TODO: CAMEL-22904") public void testTernaryLog() { exchange.getIn().setBody("Hello World"); assertExpression(">>> Message received from WebSocket Client : ${body}",
