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 <claus.ib...@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