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 abbf92e60c8 CAMEL-18070: Add propertiesExist function to simple language. abbf92e60c8 is described below commit abbf92e60c8b690b5cfe607657c4361a459edf8d Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon May 23 17:18:38 2022 +0200 CAMEL-18070: Add propertiesExist function to simple language. --- .../modules/languages/pages/simple-language.adoc | 3 +++ .../simple/ast/SimpleFunctionExpression.java | 15 ++++++++++++ .../apache/camel/language/simple/SimpleTest.java | 17 ++++++++++++++ .../camel/support/builder/ExpressionBuilder.java | 27 ++++++++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc index 7ac6a90d07a..5626af3421b 100644 --- a/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc +++ b/core/camel-core-languages/src/main/docs/modules/languages/pages/simple-language.adoc @@ -172,6 +172,9 @@ to a bean class (such as calling a static method) then you can prefix with type, not exists or has no value, then an optional default value can be specified. +|`propertiesExist:key` |String |Checks whether a property placeholder with the given key exists or not. +The result can be negated by prefixing the key with `!`. + |routeId |String |Returns the id of the current route the Exchange is being routed. 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 21993f5b577..a737c323d9a 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 @@ -244,6 +244,21 @@ public class SimpleFunctionExpression extends LiteralExpression { return bean.createExpression(null, properties); } + // properties-exist: prefix + remainder = ifStartsWithReturnRemainder("propertiesExist:", function); + if (remainder != null) { + String[] parts = remainder.split(":", 2); + if (parts.length > 2) { + throw new SimpleParserException("Valid syntax: ${propertiesExist:key was: " + function, token.getIndex()); + } + String key = parts[0]; + boolean negate = key != null && key.startsWith("!"); + if (negate) { + key = key.substring(1); + } + return ExpressionBuilder.propertiesComponentExist(key, negate); + } + // properties: prefix remainder = ifStartsWithReturnRemainder("properties:", function); if (remainder != null) { diff --git a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java index 2fdc1574dd5..d0243353312 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/simple/SimpleTest.java @@ -41,6 +41,7 @@ import org.apache.camel.language.bean.RuntimeBeanExpressionException; import org.apache.camel.language.simple.myconverter.MyCustomDate; import org.apache.camel.language.simple.types.SimpleIllegalSyntaxException; import org.apache.camel.spi.Language; +import org.apache.camel.spi.PropertiesComponent; import org.apache.camel.spi.Registry; import org.apache.camel.util.InetAddressUtil; import org.junit.jupiter.api.Test; @@ -1987,6 +1988,22 @@ public class SimpleTest extends LanguageTestSupport { assertExpression("${body.replace(\"((\", \"--\").replace(\"((((\", \"----\")}", "Hello -- World ---- Again"); } + @Test + public void testPropertiesExist() throws Exception { + PropertiesComponent pc = context.getPropertiesComponent(); + + assertExpression("${propertiesExist:myKey}", "false"); + assertExpression("${propertiesExist:!myKey}", "true"); + assertPredicate("${propertiesExist:myKey}", false); + assertPredicate("${propertiesExist:!myKey}", true); + + pc.addInitialProperty("myKey", "abc"); + assertExpression("${propertiesExist:myKey}", "true"); + assertExpression("${propertiesExist:!myKey}", "false"); + assertPredicate("${propertiesExist:myKey}", true); + assertPredicate("${propertiesExist:!myKey}", false); + } + @Override protected String getLanguageName() { return "simple"; diff --git a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java index f30596795af..aecb1721a31 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java @@ -24,6 +24,7 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; import java.util.regex.Pattern; @@ -1803,6 +1804,32 @@ public class ExpressionBuilder { }; } + public static Expression propertiesComponentExist(final String key, final boolean negate) { + return new ExpressionAdapter() { + private PropertiesComponent pc; + + @Override + public Object evaluate(Exchange exchange) { + Optional<String> result = pc.resolveProperty(key); + boolean answer = result.isPresent(); + if (negate) { + answer = !answer; + } + return answer; + } + + @Override + public void init(CamelContext context) { + pc = context.getPropertiesComponent(); + } + + @Override + public String toString() { + return "propertiesExist(" + key + ")"; + } + }; + } + /** * Returns an {@link TokenPairExpressionIterator} expression */