You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/08/15 07:53:01 UTC
(camel) 07/10: CAMEL-21081: Add iif function to simple language
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch iif
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7e3d12f77071d7130760ba24a2cf86dedd2a08af
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Aug 15 07:35:51 2024 +0200
CAMEL-21081: Add iif function to simple language
---
.../language/csimple/joor/OriginalSimpleTest.java | 27 ++++++++++++++
.../camel/language/csimple/CSimpleHelper.java | 38 +++++++++++++-------
.../simple/ast/SimpleFunctionExpression.java | 41 +++++++++++++++++++++-
3 files changed, 93 insertions(+), 13 deletions(-)
diff --git a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
index 168709b2385..3546fd1b2f8 100644
--- a/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
+++ b/components/camel-csimple-joor/src/test/java/org/apache/camel/language/csimple/joor/OriginalSimpleTest.java
@@ -2108,6 +2108,33 @@ public class OriginalSimpleTest extends LanguageTestSupport {
assertExpression("${iif(false, ${variableAs('cheese', 'String')}, ${headerAs('counter', 'Integer')})}", "3");
}
+ @Test
+ public void testJoinBody() {
+ List<Object> data = new ArrayList<>();
+ data.add("A");
+ data.add("B");
+ data.add("C");
+ exchange.getIn().setBody(data);
+
+ assertExpression("${join()}", "A,B,C");
+ assertExpression("${join(;)}", "A;B;C");
+ assertExpression("${join(' ')}", "A B C");
+ assertExpression("${join(',','id=')}", "id=A,id=B,id=C");
+ assertExpression("${join(&,id=)}", "id=A&id=B&id=C");
+ }
+
+ @Test
+ @Disabled("TODO: Fix me")
+ public void testJoinHeader() {
+ List<Object> data = new ArrayList<>();
+ data.add("A");
+ data.add("B");
+ data.add("C");
+ exchange.getIn().setHeader("id", data);
+
+ assertExpression("${join('&','id=',${header.id})}", "id=A&id=B&id=C");
+ }
+
@Override
protected String getLanguageName() {
return "csimple";
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
index 941e90fc6b9..7f3d11e6203 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/csimple/CSimpleHelper.java
@@ -24,8 +24,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -71,6 +69,14 @@ public final class CSimpleHelper {
private CSimpleHelper() {
}
+ public static <T> T convertTo(Exchange exchange, Class<T> type, Object value) {
+ return exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
+ }
+
+ public static <T> T tryConvertTo(Exchange exchange, Class<T> type, Object value) {
+ return exchange.getContext().getTypeConverter().tryConvertTo(type, exchange, value);
+ }
+
public static <T> T messageAs(Exchange exchange, Class<T> type) {
return exchange.getMessage(type);
}
@@ -695,17 +701,25 @@ public final class CSimpleHelper {
return num;
}
- public static Object iif(Exchange exchange, Predicate pred, Supplier val1, Supplier val2) {
- boolean match = pred.test(exchange);
- if (match) {
- return val1.get();
- } else {
- return val2.get();
+ public static Object join(Exchange exchange, Object value, String separator, String prefix) {
+ Iterator<?> it = convertTo(exchange, Iterator.class, value);
+ StringBuilder sb = new StringBuilder();
+ while (it.hasNext()) {
+ Object o = it.next();
+ if (o != null) {
+ String s = tryConvertTo(exchange, String.class, o);
+ if (s != null) {
+ if (!sb.isEmpty()) {
+ sb.append(separator);
+ }
+ if (prefix != null) {
+ sb.append(prefix);
+ }
+ sb.append(s);
+ }
+ }
}
- }
-
- public static <T> T convert(Exchange exchange, Class<T> type, Object value) {
- return exchange.getContext().getTypeConverter().convertTo(type, exchange, value);
+ return sb.toString();
}
}
diff --git a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index e22f79a1ed5..0e82ddd4ce2 100644
--- a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++ b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -1799,6 +1799,45 @@ public class SimpleFunctionExpression extends LiteralExpression {
return "messageHistory(exchange, true)";
}
+ // join
+ remainder = ifStartsWithReturnRemainder("join(", function);
+ if (remainder != null) {
+ String values = StringHelper.before(remainder, ")");
+ String separator = "\",\"";
+ String prefix = null;
+ String exp = "body";
+ if (ObjectHelper.isNotEmpty(values)) {
+ String[] tokens = StringQuoteHelper.splitSafeQuote(values, ',', false, true);
+ if (tokens.length > 3) {
+ throw new SimpleParserException(
+ "Valid syntax: ${join(separator,prefix,expression)} was: " + function, token.getIndex());
+ }
+ // single quotes should be double quotes
+ for (int i = 0; i < tokens.length; i++) {
+ String s = tokens[i];
+ if (StringHelper.isSingleQuoted(s)) {
+ s = StringHelper.removeLeadingAndEndingQuotes(s);
+ s = StringQuoteHelper.doubleQuote(s);
+ tokens[i] = s;
+ } else if (i < 2 && !StringHelper.isDoubleQuoted(s)) {
+ s = StringQuoteHelper.doubleQuote(s);
+ tokens[i] = s;
+ }
+ }
+ if (tokens.length == 3) {
+ separator = tokens[0];
+ prefix = tokens[1];
+ exp = tokens[2];
+ } else if (tokens.length == 2) {
+ separator = tokens[0];
+ prefix = tokens[1];
+ } else {
+ separator = tokens[0];
+ }
+ }
+ return "var val = " + exp + ";\n return join(exchange, val, " + separator + ", " + prefix + ");";
+ }
+
// empty function
remainder = ifStartsWithReturnRemainder("empty(", function);
if (remainder != null) {
@@ -1835,7 +1874,7 @@ public class SimpleFunctionExpression extends LiteralExpression {
}
return "Object o = " + tokens[0]
- + ";\n boolean b = convert(exchange, boolean.class, o);\n return b ? "
+ + ";\n boolean b = convertTo(exchange, boolean.class, o);\n return b ? "
+ tokens[1] + " : " + tokens[2];
}