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 432ab1b6a71 CAMEL-21732: camel-core: Poll EIP fix dynamic endpoint
uris does not work.
432ab1b6a71 is described below
commit 432ab1b6a7148bdb106c67a011380d4cdb15d138
Author: Claus Ibsen <[email protected]>
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"));
+ }
+ };
+ }
+
+}