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;
         }

Reply via email to