This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-2.21.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-2.21.x by this push:
new c3eeb98 CAMEL-12532: Content Based Router in Java DSL may not resolve
property placeholders in when predicates. Thanks to Tom Donohue for sample test
c3eeb98 is described below
commit c3eeb98b2d6f684b8dda631b60a56576faae34e3
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed May 23 20:50:37 2018 +0200
CAMEL-12532: Content Based Router in Java DSL may not resolve property
placeholders in when predicates. Thanks to Tom Donohue for sample test
---
.../org/apache/camel/builder/BuilderSupport.java | 10 +-
.../org/apache/camel/builder/xml/XPathBuilder.java | 4 +-
.../org/apache/camel/model/ChoiceDefinition.java | 12 +++
.../spring/boot/XPathPropertyPlaceholderTest.java | 114 +++++++++++++++++++++
4 files changed, 137 insertions(+), 3 deletions(-)
diff --git
a/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
b/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
index ea81d2c..8753641 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -231,7 +231,7 @@ public abstract class BuilderSupport {
* @return the builder
*/
public XPathBuilder xpath(String value) {
- return XPathBuilder.xpath(value);
+ return xpath(value, null);
}
/**
@@ -241,7 +241,13 @@ public abstract class BuilderSupport {
* @param resultType the result type that the XPath expression will return.
* @return the builder
*/
- public static XPathBuilder xpath(String value, Class<?> resultType) {
+ public XPathBuilder xpath(String value, Class<?> resultType) {
+ // the value may contain property placeholders as it may be used
directly from Java DSL
+ try {
+ value = getContext().resolvePropertyPlaceholders(value);
+ } catch (Exception e) {
+ throw ObjectHelper.wrapRuntimeCamelException(e);
+ }
return XPathBuilder.xpath(value, resultType);
}
diff --git
a/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
b/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
index 4b61f8f..c2e5d2b 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/xml/XPathBuilder.java
@@ -148,7 +148,9 @@ public class XPathBuilder extends ServiceSupport implements
CamelContextAware, E
*/
public static XPathBuilder xpath(String text, Class<?> resultType) {
XPathBuilder builder = new XPathBuilder(text);
- builder.setResultType(resultType);
+ if (resultType != null) {
+ builder.setResultType(resultType);
+ }
return builder;
}
diff --git
a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
index d37058a..1d79309 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ChoiceDefinition.java
@@ -28,6 +28,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import org.apache.camel.Predicate;
import org.apache.camel.Processor;
import org.apache.camel.builder.ExpressionClause;
+import org.apache.camel.model.language.ExpressionDefinition;
import org.apache.camel.processor.ChoiceProcessor;
import org.apache.camel.processor.FilterProcessor;
import org.apache.camel.spi.AsPredicate;
@@ -133,6 +134,17 @@ public class ChoiceDefinition extends
ProcessorDefinition<ChoiceDefinition> {
public Processor createProcessor(RouteContext routeContext) throws
Exception {
List<FilterProcessor> filters = new ArrayList<FilterProcessor>();
for (WhenDefinition whenClause : whenClauses) {
+ // also resolve properties and constant fields on embedded
expressions in the when clauses
+ ExpressionNode exp = whenClause;
+ ExpressionDefinition expressionDefinition = exp.getExpression();
+ if (expressionDefinition != null) {
+ // resolve properties before we create the processor
+
ProcessorDefinitionHelper.resolvePropertyPlaceholders(routeContext.getCamelContext(),
expressionDefinition);
+
+ // resolve constant fields (eg Exchange.FILE_NAME)
+
ProcessorDefinitionHelper.resolveKnownConstantFields(expressionDefinition);
+ }
+
FilterProcessor filter = (FilterProcessor)
createProcessor(routeContext, whenClause);
filters.add(filter);
}
diff --git
a/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/XPathPropertyPlaceholderTest.java
b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/XPathPropertyPlaceholderTest.java
new file mode 100644
index 0000000..533ebbe
--- /dev/null
+++
b/components/camel-spring-boot/src/test/java/org/apache/camel/spring/boot/XPathPropertyPlaceholderTest.java
@@ -0,0 +1,114 @@
+/**
+ * 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.spring.boot;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@DirtiesContext
+@RunWith(SpringRunner.class)
+@EnableAutoConfiguration
+@SpringBootTest(
+ classes = XPathPropertyPlaceholderTest.TestConfig.class,
+ properties = {"foo = //greeting/text = 'Hello, world!'", "bar =
//greeting/text = 'Bye, world!'"}
+)
+public class XPathPropertyPlaceholderTest {
+
+ @Autowired
+ private CamelContext context;
+
+ @Autowired
+ private ProducerTemplate template;
+
+ @EndpointInject(uri = "mock:output-filter")
+ private MockEndpoint mockOutputFilter;
+
+ @EndpointInject(uri = "mock:output-choice")
+ private MockEndpoint mockOutputChoice;
+
+ @EndpointInject(uri = "mock:output-choice2")
+ private MockEndpoint mockOutputChoice2;
+
+ @Test
+ public void testFilter() throws Exception {
+ mockOutputFilter.expectedMessageCount(1);
+
+ template.sendBody("direct:filter", "<greeting><text>Hello,
world!</text></greeting>");
+
+ mockOutputFilter.assertIsSatisfied();
+ }
+
+ @Test
+ public void testChoice() throws Exception {
+ mockOutputChoice.expectedMessageCount(1);
+
+ template.sendBody("direct:choice", "<greeting><text>Bye,
world!</text></greeting>");
+
+ mockOutputChoice.assertIsSatisfied();
+ }
+
+ @Test
+ public void testChoice2() throws Exception {
+ mockOutputChoice2.expectedMessageCount(1);
+
+ template.sendBody("direct:choice2", "<greeting><text>Bye,
world!</text></greeting>");
+
+ mockOutputChoice2.assertIsSatisfied();
+ }
+
+ @Configuration
+ public static class TestConfig {
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:filter")
+ .filter().xpath("{{foo}}")
+ .log("Passed filter!")
+ .to("mock:output-filter");
+
+ from("direct:choice")
+ .choice()
+ .when(xpath("{{bar}}"))
+ .log("Passed choice!")
+ .to("mock:output-choice");
+
+ from("direct:choice2")
+ .choice()
+ .when().xpath("{{bar}}")
+ .log("Passed choice2!")
+ .to("mock:output-choice2");
+ }
+ };
+ }
+ }
+
+}
+
--
To stop receiving notification emails like this one, please contact
[email protected].