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 2023/12/30 15:15:12 UTC
(camel) 15/25: CAMEL-19749: Add variables as concept to Camel
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch var
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 69577edc2cf49e95bf94477813125acf2bc02319
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 29 20:47:25 2023 +0100
CAMEL-19749: Add variables as concept to Camel
---
.../apache/camel/language/simple/SimpleTest.java | 35 ++++++++++++++++++
.../camel/support/builder/ExpressionBuilder.java | 43 ++++++++++++++++++++--
2 files changed, 74 insertions(+), 4 deletions(-)
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 d0f672df846..7550edc2ca4 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
@@ -45,6 +45,8 @@ import org.apache.camel.spi.Language;
import org.apache.camel.spi.PropertiesComponent;
import org.apache.camel.spi.Registry;
import org.apache.camel.spi.UuidGenerator;
+import org.apache.camel.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
import org.apache.camel.util.InetAddressUtil;
import org.apache.camel.util.StringHelper;
import org.junit.jupiter.api.Test;
@@ -951,6 +953,39 @@ public class SimpleTest extends LanguageTestSupport {
assertExpression("${variables}", variables);
}
+ @Test
+ public void testGlobalVariable() throws Exception {
+ // exchange has 1 variable already set
+ Map<String, Object> variables = exchange.getVariables();
+ assertEquals(1, variables.size());
+
+ VariableRepository global = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class)
+ .getVariableRepository("global");
+ global.setVariable("foo", "123");
+ global.setVariable("bar", "456");
+ global.setVariable("cheese", "gorgonzola");
+
+ // exchange scoped
+ assertExpression("${variable.cheese}", "gauda");
+ assertExpression("${variable.foo}", null);
+ assertExpression("${variable.bar}", null);
+
+ // global scoped
+ assertExpression("${variable.global:cheese}", "gorgonzola");
+ assertExpression("${variable.global:foo}", "123");
+ assertExpression("${variable.global:bar}", "456");
+
+ // exchange scoped
+ assertExpression("${variableAs('cheese', 'String')}", "gauda");
+ assertExpression("${variableAs('foo', 'int')}", null);
+ assertExpression("${variableAA('bar', 'int')}", null);
+
+ // global scoped
+ assertExpression("${variableAs('global:cheese', 'String')}", "gorgonzola");
+ assertExpression("${variableAs('global:foo', 'int')}", 123);
+ assertExpression("${variableAs('global:bar', 'int')}", 456);
+ }
+
@Test
public void testVariableKeyWithSpace() throws Exception {
exchange.getVariables().putAll(exchange.getMessage().getHeaders());
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 2d105ed02f8..2939d2c1362 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
@@ -44,6 +44,8 @@ import org.apache.camel.spi.Language;
import org.apache.camel.spi.PropertiesComponent;
import org.apache.camel.spi.Registry;
import org.apache.camel.spi.UnitOfWork;
+import org.apache.camel.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
import org.apache.camel.support.ConstantExpressionAdapter;
import org.apache.camel.support.ExchangeHelper;
import org.apache.camel.support.ExpressionAdapter;
@@ -196,15 +198,29 @@ public class ExpressionBuilder {
*/
public static Expression variableExpression(final Expression variableName) {
return new ExpressionAdapter() {
+ private VariableRepositoryFactory factory;
+
@Override
public Object evaluate(Exchange exchange) {
- String name = variableName.evaluate(exchange, String.class);
- return exchange.getVariable(name);
+ String key = variableName.evaluate(exchange, String.class);
+ String id = StringHelper.before(key, ":");
+ if (id != null) {
+ VariableRepository repo = factory.getVariableRepository(id);
+ if (repo != null) {
+ key = StringHelper.after(key, ":");
+ return repo.getVariable(key);
+ } else {
+ throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+ }
+ } else {
+ return exchange.getVariable(key);
+ }
}
@Override
public void init(CamelContext context) {
variableName.init(context);
+ factory = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
}
@Override
@@ -246,6 +262,8 @@ public class ExpressionBuilder {
public static Expression variableExpression(final Expression variableName, final Expression typeName) {
return new ExpressionAdapter() {
private ClassResolver classResolver;
+ private VariableRepositoryFactory factory;
+ private TypeConverter converter;
@Override
public Object evaluate(Exchange exchange) {
@@ -256,8 +274,23 @@ public class ExpressionBuilder {
} catch (ClassNotFoundException e) {
throw CamelExecutionException.wrapCamelExecutionException(exchange, e);
}
- String text = variableName.evaluate(exchange, String.class);
- return exchange.getVariable(text, type);
+ String key = variableName.evaluate(exchange, String.class);
+ String id = StringHelper.before(key, ":");
+ if (id != null) {
+ VariableRepository repo = factory.getVariableRepository(id);
+ if (repo != null) {
+ key = StringHelper.after(key, ":");
+ Object value = repo.getVariable(key);
+ if (value != null) {
+ value = converter.convertTo(type, value);
+ }
+ return value;
+ } else {
+ throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+ }
+ } else {
+ return exchange.getVariable(key, type);
+ }
}
@Override
@@ -265,6 +298,8 @@ public class ExpressionBuilder {
variableName.init(context);
typeName.init(context);
classResolver = context.getClassResolver();
+ factory = context.getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
+ converter = context.getTypeConverter();
}
@Override