This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch once in repository https://gitbox.apache.org/repos/asf/camel.git
commit a8329f1927724b55021a3f7e60a2c18edab1d6ca Author: Claus Ibsen <[email protected]> AuthorDate: Thu Dec 18 10:34:56 2025 +0100 CAMEL-22431: camel-once - A component for development to trigger only once --- components/camel-once/pom.xml | 5 ++ .../component/once/OnceComponentConfigurer.java | 3 + .../org/apache/camel/component/once/once.json | 3 +- .../camel-once/src/main/docs/once-component.adoc | 41 ++++++++++++++ .../apache/camel/component/once/OnceComponent.java | 13 ++++- .../apache/camel/component/once/OnceConsumer.java | 66 ++++++++++++++++------ .../component/once/OnceBodyAndHeaderFileTest.java | 2 +- .../component/once/OnceBodyAndHeaderTest.java | 5 +- .../once/OnceBodyAndVariableFileTest.java | 2 +- .../component/once/OnceBodyAndVariableTest.java | 2 +- ...yAndHeaderTest.java => OnceGroovyFileTest.java} | 9 ++- ...HeaderTest.java => OnceSimpleDisabledTest.java} | 10 ++-- ...yAndHeaderTest.java => OnceSimpleFileTest.java} | 9 ++- ...eBodyAndHeaderTest.java => OnceSimpleTest.java} | 8 +-- .../camel-once/src/test/resources/calc.groovy | 17 ++++++ .../camel-once/src/test/resources/letter.txt | 1 + 16 files changed, 153 insertions(+), 43 deletions(-) diff --git a/components/camel-once/pom.xml b/components/camel-once/pom.xml index 0a5449df1e9f..33b4bd67568b 100644 --- a/components/camel-once/pom.xml +++ b/components/camel-once/pom.xml @@ -45,5 +45,10 @@ <artifactId>camel-test-junit5</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-groovy</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceComponentConfigurer.java b/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceComponentConfigurer.java index 9ac516e44da7..50efcb4bbcbf 100644 --- a/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceComponentConfigurer.java +++ b/components/camel-once/src/generated/java/org/apache/camel/component/once/OnceComponentConfigurer.java @@ -28,6 +28,7 @@ public class OnceComponentConfigurer extends PropertyConfigurerSupport implement case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "delay": target.setDelay(property(camelContext, long.class, value)); return true; + case "languages": target.setLanguages(property(camelContext, boolean.class, value)); return true; default: return false; } } @@ -40,6 +41,7 @@ public class OnceComponentConfigurer extends PropertyConfigurerSupport implement case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "delay": return long.class; + case "languages": return boolean.class; default: return null; } } @@ -53,6 +55,7 @@ public class OnceComponentConfigurer extends PropertyConfigurerSupport implement case "bridgeerrorhandler": case "bridgeErrorHandler": return target.isBridgeErrorHandler(); case "delay": return target.getDelay(); + case "languages": return target.isLanguages(); default: return null; } } diff --git a/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json b/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json index 3dbbeeaae5fa..881706bc8d62 100644 --- a/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json +++ b/components/camel-once/src/generated/resources/META-INF/org/apache/camel/component/once/once.json @@ -26,7 +26,8 @@ "componentProperties": { "bridgeErrorHandler": { "index": 0, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...] "autowiredEnabled": { "index": 1, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...] - "delay": { "index": 2, "kind": "property", "displayName": "Delay", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "The number of milliseconds to wait before triggering. The default value is 1000." } + "delay": { "index": 2, "kind": "property", "displayName": "Delay", "group": "advanced", "label": "advanced", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, "description": "The number of milliseconds to wait before triggering. The default value is 1000." }, + "languages": { "index": 3, "kind": "property", "displayName": "Languages", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether Camel languages are supported such as simple,groovy." } }, "properties": { "name": { "index": 0, "kind": "path", "displayName": "Name", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The logical name" }, diff --git a/components/camel-once/src/main/docs/once-component.adoc b/components/camel-once/src/main/docs/once-component.adoc index 7ef15a74ad86..0d78e2662f70 100644 --- a/components/camel-once/src/main/docs/once-component.adoc +++ b/components/camel-once/src/main/docs/once-component.adoc @@ -75,6 +75,47 @@ from("once:tick?body=world&header.foo=abc&header.bar=123") You can do the same for variables with `variable.<key>`. +=== Using custom languages + +You can use the Camel languages such as simple, or groovy when specifying body, headers, and variables. + +The once component will set the data in the following order: + +- variables +- headers +- body + +This makes it possible to use groovy or simple language for setting the message body, based +on data from the variables and headers. + +For example: + +[source,java] +---- +from("once:tick?body=language:groovy:file:src/test/resources/calc.groovy&variable.amount=123") + .to("mock:result"); +---- + +You must use `language:groovy:` as prefix when using languages. And you can combine this with loading from file. +The `calc.groovy` file is as follows: + +[source,groovy] +---- +variable.amount * 3 +---- + +As you can see this just tells groovy to multiply the amount variable with 3. + +=== Automatic type conversion + +The body, header, and variables will automatically be converted to the best suitable type for boolean and integers: + +- boolean +- int +- long + +And for any other its `String` or the output from executing a language. + === Firing as soon as possible By default, the component is fired after 1 seconds when Camel has been fully started. diff --git a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java index f050fec0eebf..8b2849f07c3e 100644 --- a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java +++ b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceComponent.java @@ -30,7 +30,8 @@ public class OnceComponent extends DefaultComponent { @Metadata(label = "advanced", defaultValue = "1000") private long delay = 1000; - // TOOD: option to support groovy/simple language etc + @Metadata(label = "advanced", defaultValue = "true") + private boolean languages = true; @Override protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception { @@ -55,4 +56,14 @@ public class OnceComponent extends DefaultComponent { this.delay = delay; } + public boolean isLanguages() { + return languages; + } + + /** + * Whether Camel languages are supported such as simple,groovy. + */ + public void setLanguages(boolean languages) { + this.languages = languages; + } } diff --git a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceConsumer.java b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceConsumer.java index be57bce140f9..5ac3e8c5e1b8 100644 --- a/components/camel-once/src/main/java/org/apache/camel/component/once/OnceConsumer.java +++ b/components/camel-once/src/main/java/org/apache/camel/component/once/OnceConsumer.java @@ -22,8 +22,10 @@ import java.util.TimerTask; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.NoSuchLanguageException; import org.apache.camel.Processor; import org.apache.camel.StartupListener; +import org.apache.camel.spi.Language; import org.apache.camel.support.DefaultConsumer; import org.apache.camel.support.ResourceHelper; import org.apache.camel.util.StringHelper; @@ -85,24 +87,25 @@ public class OnceConsumer extends DefaultConsumer implements StartupListener { public void run() { Exchange exchange = createExchange(false); try { - Object body = resolveData(endpoint.getBody()); - exchange.getMessage().setBody(body); - if (endpoint.getHeaders() != null) { - for (var e : endpoint.getHeaders().entrySet()) { - Object v = resolveData(e.getValue()); + // variables,headers,and body last + if (endpoint.getVariables() != null) { + for (var e : endpoint.getVariables().entrySet()) { + Object v = resolveData(exchange, e.getValue()); if (v != null) { - exchange.getMessage().setHeader(e.getKey(), v); + exchange.setVariable(e.getKey(), v); } } } - if (endpoint.getVariables() != null) { - for (var e : endpoint.getVariables().entrySet()) { - Object v = resolveData(e.getValue()); + if (endpoint.getHeaders() != null) { + for (var e : endpoint.getHeaders().entrySet()) { + Object v = resolveData(exchange, e.getValue()); if (v != null) { - exchange.setVariable(e.getKey(), v); + exchange.getMessage().setHeader(e.getKey(), v); } } } + Object body = resolveData(exchange, endpoint.getBody()); + exchange.getMessage().setBody(body); getProcessor().process(exchange); } catch (Exception e) { exchange.setException(e); @@ -119,20 +122,51 @@ public class OnceConsumer extends DefaultConsumer implements StartupListener { } } - private Object resolveData(Object data) throws Exception { + private Object resolveData(Exchange exchange, Object data) throws Exception { String answer = data instanceof String ? data.toString() : null; + + // if languages is supported then you can prefix with simple:xxx or groovy:xxx to let Camel know + Language lan = null; + if (answer != null && endpoint.getComponent().isLanguages() && answer.startsWith("language:")) { + String text = answer.substring(9); + String prefix = StringHelper.before(text, ":"); + if (prefix != null) { + try { + lan = camelContext.resolveLanguage(prefix); + answer = StringHelper.after(text, ":"); + } catch (NoSuchLanguageException e) { + // ignore it's not a language + } + } + } + if (ResourceHelper.hasScheme(answer)) { try (InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, answer)) { answer = camelContext.getTypeConverter().mandatoryConvertTo(String.class, is); } } - if (answer != null) { - answer = camelContext.resolvePropertyPlaceholders(answer); + + if (answer != null && lan != null) { + return lan.createExpression(answer).evaluate(exchange, Object.class); } + + // data may be boolean, integer, or literal + if ("true".equalsIgnoreCase(answer)) { + return true; + } else if ("false".equalsIgnoreCase(answer)) { + return false; + } else { + Object val = camelContext.getTypeConverter().tryConvertTo(Integer.class, exchange, data); + if (val != null) { + return val; + } + val = camelContext.getTypeConverter().tryConvertTo(Long.class, exchange, data); + if (val != null) { + return val; + } + } + return answer; } - private static boolean isSimpleLanguage(String pattern) { - return StringHelper.hasStartToken(pattern, "simple"); - } } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderFileTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderFileTest.java index 6490ef1ea6f8..c666487a0f1c 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderFileTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderFileTest.java @@ -28,7 +28,7 @@ public class OnceBodyAndHeaderFileTest extends CamelTestSupport { public void testOnce() throws Exception { getMockEndpoint("mock:result").expectedBodiesReceived("1,jack", "2,moe"); getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "456"); + getMockEndpoint("mock:result").expectedHeaderReceived("bar", 456); MockEndpoint.assertIsSatisfied(context); } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java index a3c8683715df..a2f02681dc9d 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java @@ -28,7 +28,8 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { public void testOnce() throws Exception { getMockEndpoint("mock:result").expectedBodiesReceived("world"); getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "123"); + getMockEndpoint("mock:result").expectedHeaderReceived("bar", 123); + getMockEndpoint("mock:result").expectedHeaderReceived("priority", true); MockEndpoint.assertIsSatisfied(context); } @@ -38,7 +39,7 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123").to("mock:result"); + from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123&header.priority=true").to("mock:result"); } }; } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableFileTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableFileTest.java index 7c1354a3e3b8..7f244cf122fd 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableFileTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableFileTest.java @@ -28,7 +28,7 @@ public class OnceBodyAndVariableFileTest extends CamelTestSupport { public void testOnce() throws Exception { getMockEndpoint("mock:result").expectedBodiesReceived("1,jack", "2,moe"); getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedVariableReceived("bar", "456"); + getMockEndpoint("mock:result").expectedVariableReceived("bar", 456); MockEndpoint.assertIsSatisfied(context); } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableTest.java index 366d5e2b40fe..18eb26f7ff78 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndVariableTest.java @@ -28,7 +28,7 @@ public class OnceBodyAndVariableTest extends CamelTestSupport { public void testOnce() throws Exception { getMockEndpoint("mock:result").expectedBodiesReceived("world"); getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedVariableReceived("bar", "123"); + getMockEndpoint("mock:result").expectedVariableReceived("bar", 123); MockEndpoint.assertIsSatisfied(context); } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceGroovyFileTest.java similarity index 78% copy from components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java copy to components/camel-once/src/test/java/org/apache/camel/component/once/OnceGroovyFileTest.java index a3c8683715df..5af24e45eaf7 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceGroovyFileTest.java @@ -22,13 +22,11 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class OnceBodyAndHeaderTest extends CamelTestSupport { +public class OnceGroovyFileTest extends CamelTestSupport { @Test public void testOnce() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("world"); - getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "123"); + getMockEndpoint("mock:result").expectedBodiesReceived(369); MockEndpoint.assertIsSatisfied(context); } @@ -38,7 +36,8 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123").to("mock:result"); + from("once:tick?delay=-1&body=language:groovy:file:src/test/resources/calc.groovy&variable.amount=123") + .to("mock:result"); } }; } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleDisabledTest.java similarity index 78% copy from components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java copy to components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleDisabledTest.java index a3c8683715df..4a41355d0527 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleDisabledTest.java @@ -22,13 +22,11 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class OnceBodyAndHeaderTest extends CamelTestSupport { +public class OnceSimpleDisabledTest extends CamelTestSupport { @Test public void testOnce() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("world"); - getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "123"); + getMockEndpoint("mock:result").expectedBodiesReceived("language:simple:${camelId}"); MockEndpoint.assertIsSatisfied(context); } @@ -38,7 +36,9 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123").to("mock:result"); + context.getComponent("once", OnceComponent.class).setLanguages(false); + + from("once:tick?delay=-1&body=language:simple:${camelId}").to("mock:result"); } }; } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleFileTest.java similarity index 78% copy from components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java copy to components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleFileTest.java index a3c8683715df..6765d899f450 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleFileTest.java @@ -22,13 +22,12 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class OnceBodyAndHeaderTest extends CamelTestSupport { +public class OnceSimpleFileTest extends CamelTestSupport { @Test public void testOnce() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("world"); - getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "123"); + getMockEndpoint("mock:result") + .expectedBodiesReceived("Hello this is " + context.getName() + " from " + context.getRoutes().get(0).getId()); MockEndpoint.assertIsSatisfied(context); } @@ -38,7 +37,7 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123").to("mock:result"); + from("once:tick?delay=-1&body=language:simple:file:src/test/resources/letter.txt").to("mock:result"); } }; } diff --git a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleTest.java similarity index 78% copy from components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java copy to components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleTest.java index a3c8683715df..d0748db259e2 100644 --- a/components/camel-once/src/test/java/org/apache/camel/component/once/OnceBodyAndHeaderTest.java +++ b/components/camel-once/src/test/java/org/apache/camel/component/once/OnceSimpleTest.java @@ -22,13 +22,11 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Test; -public class OnceBodyAndHeaderTest extends CamelTestSupport { +public class OnceSimpleTest extends CamelTestSupport { @Test public void testOnce() throws Exception { - getMockEndpoint("mock:result").expectedBodiesReceived("world"); - getMockEndpoint("mock:result").expectedHeaderReceived("foo", "abc"); - getMockEndpoint("mock:result").expectedHeaderReceived("bar", "123"); + getMockEndpoint("mock:result").expectedBodiesReceived(context.getName()); MockEndpoint.assertIsSatisfied(context); } @@ -38,7 +36,7 @@ public class OnceBodyAndHeaderTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - from("once:tick?delay=-1&body=world&header.foo=abc&header.bar=123").to("mock:result"); + from("once:tick?delay=-1&body=language:simple:${camelId}").to("mock:result"); } }; } diff --git a/components/camel-once/src/test/resources/calc.groovy b/components/camel-once/src/test/resources/calc.groovy new file mode 100644 index 000000000000..3490ed55237a --- /dev/null +++ b/components/camel-once/src/test/resources/calc.groovy @@ -0,0 +1,17 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +variable.amount * 3 \ No newline at end of file diff --git a/components/camel-once/src/test/resources/letter.txt b/components/camel-once/src/test/resources/letter.txt new file mode 100644 index 000000000000..daf706dfdacf --- /dev/null +++ b/components/camel-once/src/test/resources/letter.txt @@ -0,0 +1 @@ +Hello this is ${camelId} from ${routeId} \ No newline at end of file
