This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.10.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.10.x by this push: new a4235e0234c CAMEL-21732: camel-core: Poll EIP fix dynamic endpoint uris does not work. a4235e0234c is described below commit a4235e0234c6218233d02ab24d61755a17a3fa4a Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Feb 7 15:36:49 2025 +0100 CAMEL-21732: camel-core: Poll EIP fix dynamic endpoint uris does not work. --- .../java/org/apache/camel/reifier/PollReifier.java | 46 ++++++++-------- .../org/apache/camel/reifier/ToDynamicReifier.java | 10 ++-- .../enricher/PollDynamicFileNameTest.java | 51 ++++++++++++++++++ .../builder/endpoint/PollDynamicFileNameTest.java | 61 ++++++++++++++++++++++ 4 files changed, 143 insertions(+), 25 deletions(-) diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/PollReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/PollReifier.java index 39e7b8531fe..4517b6df0eb 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/PollReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/PollReifier.java @@ -16,16 +16,16 @@ */ package org.apache.camel.reifier; -import org.apache.camel.Endpoint; import org.apache.camel.Expression; -import org.apache.camel.LineNumberAware; import org.apache.camel.Processor; import org.apache.camel.Route; import org.apache.camel.model.PollDefinition; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.processor.PollProcessor; -import org.apache.camel.support.CamelContextHelper; +import org.apache.camel.spi.Language; +import org.apache.camel.support.EndpointHelper; import org.apache.camel.support.LanguageSupport; +import org.apache.camel.util.StringHelper; public class PollReifier extends ProcessorReifier<PollDefinition> { @@ -35,34 +35,36 @@ public class PollReifier extends ProcessorReifier<PollDefinition> { @Override public Processor createProcessor() throws Exception { - Endpoint endpoint = resolveEndpoint(); - String uri = endpoint.getEndpointUri(); - boolean simple = LanguageSupport.hasSimpleFunction(uri); - Expression exp; - if (simple) { - exp = camelContext.resolveLanguage("simple").createExpression(uri); + String uri; + if (definition.getEndpointConsumerBuilder() != null) { + uri = definition.getEndpointConsumerBuilder().getRawUri(); } else { - exp = camelContext.resolveLanguage("constant").createExpression(uri); + uri = StringHelper.notEmpty(definition.getUri(), "uri", this); } + Expression exp = createExpression(uri); long timeout = parseDuration(definition.getTimeout(), 20000); PollProcessor answer = new PollProcessor(exp, uri, timeout); answer.setVariableReceive(parseString(definition.getVariableReceive())); return answer; } - public Endpoint resolveEndpoint() { - Endpoint answer; - if (definition.getEndpoint() == null) { - if (definition.getEndpointConsumerBuilder() == null) { - answer = CamelContextHelper.resolveEndpoint(camelContext, definition.getEndpointUri(), null); - } else { - answer = definition.getEndpointConsumerBuilder().resolve(camelContext); - } - } else { - answer = definition.getEndpoint(); + protected Expression createExpression(String uri) { + // make sure to parse property placeholders + uri = EndpointHelper.resolveEndpointUriPropertyPlaceholders(camelContext, uri); + + // we use simple/constant language by default, but you can configure a different language + String language = null; + if (uri.startsWith("language:")) { + String value = StringHelper.after(uri, "language:"); + language = StringHelper.before(value, ":"); + uri = StringHelper.after(value, ":"); } - LineNumberAware.trySetLineNumberAware(answer, definition); - return answer; + if (language == null) { + // only use simple language if needed + language = LanguageSupport.hasSimpleFunction(uri) ? "simple" : "constant"; + } + Language lan = camelContext.resolveLanguage(language); + return lan.createExpression(uri); } } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ToDynamicReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ToDynamicReifier.java index 240d5e18e20..aef8cc16fdb 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ToDynamicReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ToDynamicReifier.java @@ -27,6 +27,7 @@ import org.apache.camel.model.ToDynamicDefinition; import org.apache.camel.processor.SendDynamicProcessor; import org.apache.camel.spi.Language; import org.apache.camel.support.EndpointHelper; +import org.apache.camel.support.LanguageSupport; import org.apache.camel.util.StringHelper; public class ToDynamicReifier<T extends ToDynamicDefinition> extends ProcessorReifier<T> { @@ -78,14 +79,17 @@ public class ToDynamicReifier<T extends ToDynamicDefinition> extends ProcessorRe // make sure to parse property placeholders uri = EndpointHelper.resolveEndpointUriPropertyPlaceholders(camelContext, uri); - // we use simple language by default, but you can configure a different language - String language = "simple"; + // we use simple/constant language by default, but you can configure a different language + String language = null; if (uri.startsWith("language:")) { String value = StringHelper.after(uri, "language:"); language = StringHelper.before(value, ":"); uri = StringHelper.after(value, ":"); } - + if (language == null) { + // only use simple language if needed + language = LanguageSupport.hasSimpleFunction(uri) ? "simple" : "constant"; + } Language lan = camelContext.resolveLanguage(language); return lan.createExpression(uri); } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/PollDynamicFileNameTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/PollDynamicFileNameTest.java new file mode 100644 index 00000000000..7eaf817514b --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/PollDynamicFileNameTest.java @@ -0,0 +1,51 @@ +/* + * 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. + */ +package org.apache.camel.processor.enricher; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class PollDynamicFileNameTest extends ContextTestSupport { + + @Test + public void testPollEnrichFile() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + getMockEndpoint("mock:result").message(0).body().isEqualTo("Hello World"); + getMockEndpoint("mock:result").message(1).body().isNull(); + + template.sendBodyAndHeader(fileUri(), "Hello World", Exchange.FILE_NAME, "myfile.txt"); + + template.sendBodyAndHeader("direct:start", "Foo", "target", "myfile.txt"); + template.sendBodyAndHeader("direct:start", "Bar", "target", "unknown.txt"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("direct:start") + .poll(fileUri() + "?noop=true&fileName=${header.target}", 500) + .to("mock:result"); + } + }; + } +} diff --git a/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/PollDynamicFileNameTest.java b/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/PollDynamicFileNameTest.java new file mode 100644 index 00000000000..73dfc7b837e --- /dev/null +++ b/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/PollDynamicFileNameTest.java @@ -0,0 +1,61 @@ +/* + * 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. + */ +package org.apache.camel.builder.endpoint; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.jupiter.api.Test; + +import static org.apache.camel.test.junit5.TestSupport.deleteDirectory; + +public class PollDynamicFileNameTest extends BaseEndpointDslTest { + + private static final String TEST_DATA_DIR = BaseEndpointDslTest.generateUniquePath(PollDynamicFileNameTest.class); + + @Override + public void doPreSetup() { + deleteDirectory(TEST_DATA_DIR); + } + + @Test + public void testPollEnrichFile() throws Exception { + getMockEndpoint("mock:result").expectedMessageCount(2); + getMockEndpoint("mock:result").message(0).body().isEqualTo("Hello World"); + getMockEndpoint("mock:result").message(1).body().isNull(); + + template.sendBodyAndHeader("file://" + TEST_DATA_DIR, "Hello World", Exchange.FILE_NAME, "myfile.txt"); + + template.sendBodyAndHeader("direct:start", "Foo", "target", "myfile.txt"); + template.sendBodyAndHeader("direct:start", "Bar", "target", "unknown.txt"); + + MockEndpoint.assertIsSatisfied(context); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new EndpointRouteBuilder() { + @Override + public void configure() { + from(direct("start")) + .poll(file(TEST_DATA_DIR).noop(true).fileName("${header.target}"), 1000) + .to(mock("result")); + } + }; + } + +}