This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 0b75a5e CAMEL-15742: camel-xpath and camel-saxon - Fixed so any previous configurations does not affect the next. Thanks to Dennis for reporting and sample code to reproduce the issue. 0b75a5e is described below commit 0b75a5e14b8a7246db372ba5cfd15ca29684ba7c Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Oct 23 09:09:18 2020 +0200 CAMEL-15742: camel-xpath and camel-saxon - Fixed so any previous configurations does not affect the next. Thanks to Dennis for reporting and sample code to reproduce the issue. --- .../camel/language/xquery/XQueryLanguage.java | 32 +++----- .../apache/camel/language/xpath/XPathLanguage.java | 94 ++++++++++------------ .../java/org/apache/camel/language/XPathTest.java | 1 + .../camel/processor/XPathResultTypeTest.java | 58 +++++++++++++ .../org/apache/camel/support/LanguageSupport.java | 2 +- 5 files changed, 112 insertions(+), 75 deletions(-) diff --git a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java index e278823..783e5cb 100644 --- a/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java +++ b/components/camel-saxon/src/main/java/org/apache/camel/language/xquery/XQueryLanguage.java @@ -49,20 +49,12 @@ public class XQueryLanguage extends LanguageSupport implements PropertyConfigure @Override public Predicate createPredicate(String expression) { - expression = loadResource(expression); - - XQueryBuilder builder = XQueryBuilder.xquery(expression); - configureBuilder(builder); - return builder; + return (Predicate) createExpression(expression, null); } @Override public Expression createExpression(String expression) { - expression = loadResource(expression); - - XQueryBuilder builder = XQueryBuilder.xquery(expression); - configureBuilder(builder); - return builder; + return createExpression(expression, null); } @Override @@ -74,23 +66,19 @@ public class XQueryLanguage extends LanguageSupport implements PropertyConfigure public Expression createExpression(String expression, Object[] properties) { expression = loadResource(expression); - Class<?> clazz = property(Class.class, properties, 0, null); - if (clazz != null) { - setResultType(clazz); - } - setHeaderName(property(String.class, properties, 1, headerName)); - XQueryBuilder builder = XQueryBuilder.xquery(expression); - configureBuilder(builder); + configureBuilder(builder, properties); return builder; } - protected void configureBuilder(XQueryBuilder builder) { - if (resultType != null) { - builder.setResultType(resultType); + protected void configureBuilder(XQueryBuilder builder, Object[] properties) { + Class<?> clazz = property(Class.class, properties, 0, resultType); + if (clazz != null) { + builder.setResultType(clazz); } - if (headerName != null) { - builder.setHeaderName(headerName); + String str = property(String.class, properties, 1, headerName); + if (str != null) { + builder.setHeaderName(str); } } diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java index 17548cf..bac6af9 100644 --- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java +++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathLanguage.java @@ -48,7 +48,7 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer expression = loadResource(expression); XPathBuilder builder = XPathBuilder.xpath(expression); - configureBuilder(builder); + configureBuilder(builder, null); return builder; } @@ -57,7 +57,7 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer expression = loadResource(expression); XPathBuilder builder = XPathBuilder.xpath(expression); - configureBuilder(builder); + configureBuilder(builder, null); return builder; } @@ -70,28 +70,8 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer public Expression createExpression(String expression, Object[] properties) { expression = loadResource(expression); - Class<?> clazz = property(Class.class, properties, 0, null); - if (clazz != null) { - setDocumentType(clazz); - } - QName qname = property(QName.class, properties, 1, null); - if (qname != null) { - setResultQName(qname); - } - clazz = property(Class.class, properties, 2, null); - if (clazz != null) { - setResultType(clazz); - } - setUseSaxon(property(Boolean.class, properties, 3, useSaxon)); - setXpathFactory(property(XPathFactory.class, properties, 4, xpathFactory)); - setObjectModelUri(property(String.class, properties, 5, objectModelUri)); - setThreadSafety(property(Boolean.class, properties, 6, threadSafety)); - setPreCompile(property(Boolean.class, properties, 7, preCompile)); - setLogNamespaces(property(Boolean.class, properties, 8, logNamespaces)); - setHeaderName(property(String.class, properties, 9, headerName)); - XPathBuilder builder = XPathBuilder.xpath(expression); - configureBuilder(builder); + configureBuilder(builder, properties); return builder; } @@ -167,10 +147,6 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer this.headerName = headerName; } - private boolean isUseSaxon() { - return useSaxon != null && useSaxon; - } - public Boolean getPreCompile() { return preCompile; } @@ -183,38 +159,52 @@ public class XPathLanguage extends LanguageSupport implements PropertyConfigurer return preCompile != null && preCompile; } - protected void configureBuilder(XPathBuilder builder) { - if (preCompile != null) { - builder.setPreCompile(preCompile); + protected void configureBuilder(XPathBuilder builder, Object[] properties) { + Class<?> clazz = property(Class.class, properties, 0, documentType); + if (clazz != null) { + builder.setDocumentType(clazz); } - if (threadSafety != null) { - builder.setThreadSafety(threadSafety); + QName qname = property(QName.class, properties, 1, resultQName); + if (qname != null) { + builder.setResultQName(qname); } - if (resultQName != null) { - builder.setResultQName(resultQName); + clazz = property(Class.class, properties, 2, resultType); + if (clazz != null) { + builder.setResultType(clazz); } - if (resultType != null) { - builder.setResultType(resultType); + Boolean bool = property(Boolean.class, properties, 3, useSaxon); + if (bool != null) { + builder.setUseSaxon(bool); + if (bool) { + builder.enableSaxon(); + } } - if (logNamespaces != null) { - builder.setLogNamespaces(logNamespaces); + if (!builder.isUseSaxon()) { + // xpath factory can only be set if not saxon is enabled as saxon has its own factory and object model + XPathFactory fac = property(XPathFactory.class, properties, 4, xpathFactory); + if (fac != null) { + builder.setXPathFactory(fac); + } + String str = property(String.class, properties, 5, objectModelUri); + if (str != null) { + builder.setObjectModelUri(str); + } } - if (headerName != null) { - builder.setHeaderName(headerName); + bool = property(Boolean.class, properties, 6, threadSafety); + if (bool != null) { + builder.setThreadSafety(bool); } - if (documentType != null) { - builder.setDocumentType(documentType); + bool = property(Boolean.class, properties, 7, preCompile); + if (bool != null) { + builder.setPreCompile(bool); } - - if (isUseSaxon()) { - builder.enableSaxon(); - } else { - if (xpathFactory != null) { - builder.setXPathFactory(xpathFactory); - } - if (objectModelUri != null) { - builder.setObjectModelUri(objectModelUri); - } + bool = property(Boolean.class, properties, 8, logNamespaces); + if (bool != null) { + builder.setLogNamespaces(bool); + } + String str = property(String.class, properties, 9, headerName); + if (str != null) { + builder.setHeaderName(str); } } diff --git a/core/camel-core/src/test/java/org/apache/camel/language/XPathTest.java b/core/camel-core/src/test/java/org/apache/camel/language/XPathTest.java index e07322d..7423aa0 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/XPathTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/XPathTest.java @@ -56,6 +56,7 @@ public class XPathTest extends LanguageTestSupport { @Override protected Language assertResolveLanguage(String languageName) { XPathLanguage answer = new XPathLanguage(); + answer.setCamelContext(context); answer.setResultQName(XPathConstants.STRING); assertEquals(XPathConstants.STRING, answer.getResultQName()); return answer; diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/XPathResultTypeTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/XPathResultTypeTest.java new file mode 100644 index 0000000..3895dc4 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/processor/XPathResultTypeTest.java @@ -0,0 +1,58 @@ +/* + * 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; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Test; + +public class XPathResultTypeTest extends ContextTestSupport { + + @Test + public void xpathLongAndObject() throws Exception { + String xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" + + "<Books count=\"2\">\n" + + " <Book Id=\"1\" ISBN=\"1\"><Titel>First</Titel></Book>\n" + + " <Book Id=\"2\" ISBN=\"2\"><Titel>SECOND</Titel></Book>\n" + + "</Books>"; + + getMockEndpoint("mock:result").expectedMessageCount(1); + getMockEndpoint("mock:result").message(0).exchangeProperty("BOOK_COUNT").isEqualTo(2); + getMockEndpoint("mock:split").expectedMessageCount(2); + getMockEndpoint("mock:split").message(0).body(String.class).contains("First"); + getMockEndpoint("mock:split").message(1).body(String.class).contains("SECOND"); + + template.sendBody("direct:start", xml); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from("direct:start") + .setProperty("BOOK_COUNT", xpath( "//Books/@count", Long.class)) + .split(xpath("//Books/Book")) + .to("mock:split") + .end() + .to("mock:result"); + } + }; + } + +} diff --git a/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java index 5d785c8..93dc783 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/LanguageSupport.java @@ -119,7 +119,7 @@ public abstract class LanguageSupport implements Language, IsSingleton, CamelCon * @return the value converted to the expected type */ protected <T> T property(Class<T> type, Object[] properties, int index, Object defaultValue) { - Object value = properties[index]; + Object value = properties != null ? properties[index] : null; if (value == null) { value = defaultValue; }