From cd7f3f356765ac23d696bf5834a17af972f8d58b Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 6 Mar 2024 10:53:17 +0100 Subject: [PATCH 1/2] CAMEL-20523: camel-xpath - The resultQName converter is wrong causing CSB not to work with xpath in language endpoint --- .../language/XPathLanguageEndpointTest.java | 61 +++++++++++++++++++ .../camel/converter/jaxp/XmlConverter.java | 12 ++++ 2 files changed, 73 insertions(+) create mode 100644 core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java diff --git a/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java new file mode 100644 index 0000000000000..ba1582240a140 --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.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.language; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.xml.namespace.QName; +import javax.xml.xpath.XPathConstants; + +public class XPathLanguageEndpointTest extends ContextTestSupport { + + @Test + public void testXPath() throws Exception { + getMockEndpoint("mock:result").expectedBodiesReceived("Hello World"); + + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + + // test converter also works with shorthand names + QName qn = context.getTypeConverter().convertTo(QName.class, "NODESET"); + Assertions.assertEquals(XPathConstants.NODESET, qn); + qn = context.getTypeConverter().convertTo(QName.class, "nodeset"); + Assertions.assertEquals(XPathConstants.NODESET, qn); + qn = context.getTypeConverter().convertTo(QName.class, "BOOLEAN"); + Assertions.assertEquals(XPathConstants.BOOLEAN, qn); + qn = context.getTypeConverter().convertTo(QName.class, "boolean"); + Assertions.assertEquals(XPathConstants.BOOLEAN, qn); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .setHeader(Exchange.LANGUAGE_SCRIPT, constant("/foo/text()")) + .to("language:xpath") + .to("mock:result"); + } + }; + } +} diff --git a/core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java b/core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java index b37dd8b523e62..7fa79cffe933f 100644 --- a/core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java +++ b/core/camel-xml-jaxp/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java @@ -57,6 +57,7 @@ import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; +import javax.xml.xpath.XPathConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -146,6 +147,17 @@ public void toResult(Source source, Result result, Properties outputProperties) */ @Converter(order = 1) public QName toQName(String str) { + if ("NUMBER".equalsIgnoreCase(str)) { + return XPathConstants.NUMBER; + } else if ("STRING".equalsIgnoreCase(str)) { + return XPathConstants.STRING; + } else if ("BOOLEAN".equalsIgnoreCase(str)) { + return XPathConstants.BOOLEAN; + } else if ("NODESET".equalsIgnoreCase(str)) { + return XPathConstants.NODESET; + } else if ("NODE".equalsIgnoreCase(str)) { + return XPathConstants.NODE; + } return QName.valueOf(str); } From 9b06fae85540d65456b77f619358ce8d98671b0c Mon Sep 17 00:00:00 2001 From: Claus Ibsen Date: Wed, 6 Mar 2024 13:04:35 +0100 Subject: [PATCH 2/2] CAMEL-20523: camel-xpath - The resultQName converter is wrong causing CSB not to work with xpath in language endpoint --- .../apache/camel/language/XPathLanguageEndpointTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java index ba1582240a140..1cf9dd5f237a3 100644 --- a/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/language/XPathLanguageEndpointTest.java @@ -16,15 +16,15 @@ */ package org.apache.camel.language; +import javax.xml.namespace.QName; +import javax.xml.xpath.XPathConstants; + import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import javax.xml.namespace.QName; -import javax.xml.xpath.XPathConstants; - public class XPathLanguageEndpointTest extends ContextTestSupport { @Test