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 ff2e76ace63b CAMEL-22904: camel-core - Simple language ternary parser
should not fail for log expressions (#21059)
ff2e76ace63b is described below
commit ff2e76ace63b6714e0a40d513047cc84afcb7773
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jan 26 12:20:38 2026 +0100
CAMEL-22904: camel-core - Simple language ternary parser should not fail
for log expressions (#21059)
---
.../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}",