This is an automated email from the ASF dual-hosted git repository. zhfeng pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push: new 63433e39f1 Fix #5139 to expand xslt-saxon test coverage (#5173) 63433e39f1 is described below commit 63433e39f1cec0b19fe3b311639acc16f8b70a93 Author: Zheng Feng <zh.f...@gmail.com> AuthorDate: Thu Aug 17 10:04:03 2023 +0800 Fix #5139 to expand xslt-saxon test coverage (#5173) --- extensions/xslt-saxon/deployment/pom.xml | 2 +- extensions/xslt-saxon/runtime/pom.xml | 2 +- .../xml/native/classpath/pom.xml | 4 + .../quarkus/component/xml/it/XsltResource.java | 70 ++++++++-------- .../quarkus/component/xml/it/XsltRouteBuilder.java | 9 +++ .../resources/xslt/saxon-extension-function.xsl | 30 ++++--- .../camel/quarkus/component/xml/it/XsltTest.java | 69 +++++++++++++--- integration-tests-support/xslt-support/pom.xml | 7 ++ .../test/support/xslt/MyExtensionFunction1.java | 89 +++++++++++++++++++++ .../test/support/xslt/MyExtensionFunction2.java | 92 ++++++++++++++++++++++ integration-tests/xml-grouped/pom.xml | 17 ++++ 11 files changed, 334 insertions(+), 57 deletions(-) diff --git a/extensions/xslt-saxon/deployment/pom.xml b/extensions/xslt-saxon/deployment/pom.xml index bdd784e498..e1b718e3cd 100644 --- a/extensions/xslt-saxon/deployment/pom.xml +++ b/extensions/xslt-saxon/deployment/pom.xml @@ -32,7 +32,7 @@ <dependencies> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-core-deployment</artifactId> + <artifactId>camel-quarkus-xslt-deployment</artifactId> </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> diff --git a/extensions/xslt-saxon/runtime/pom.xml b/extensions/xslt-saxon/runtime/pom.xml index a708e601be..cd3638cb56 100644 --- a/extensions/xslt-saxon/runtime/pom.xml +++ b/extensions/xslt-saxon/runtime/pom.xml @@ -38,7 +38,7 @@ <dependencies> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-core</artifactId> + <artifactId>camel-quarkus-xslt</artifactId> </dependency> <dependency> <groupId>org.apache.camel</groupId> diff --git a/integration-test-groups/xml/native/classpath/pom.xml b/integration-test-groups/xml/native/classpath/pom.xml index 32a604f90d..657f69f624 100644 --- a/integration-test-groups/xml/native/classpath/pom.xml +++ b/integration-test-groups/xml/native/classpath/pom.xml @@ -35,6 +35,10 @@ <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-xslt</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-xslt-saxon</artifactId> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-xpath</artifactId> diff --git a/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltResource.java b/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltResource.java index a8187af8f4..db0473e193 100644 --- a/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltResource.java +++ b/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltResource.java @@ -22,17 +22,16 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; import jakarta.ws.rs.core.MediaType; -import org.apache.camel.CamelContext; +import net.sf.saxon.trans.XPathException; import org.apache.camel.ConsumerTemplate; import org.apache.camel.Exchange; import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.mock.MockEndpoint; import org.jboss.logging.Logger; @Path("/xml") @@ -47,34 +46,45 @@ public class XsltResource { @Inject ConsumerTemplate consumerTemplate; - @Inject - CamelContext camelContext; + @Path("/stax") + @POST + @Produces(MediaType.TEXT_PLAIN) + public String stax(String body) { + return producerTemplate.requestBody("xslt-saxon:xslt/classpath-transform.xsl?allowStAX=true", body, String.class); + } - @Path("/xslt") + @Path("/{component}") @POST @Produces(MediaType.TEXT_PLAIN) - public String classpath(@QueryParam("output") @DefaultValue("string") String output, String body) { + public String classpath(@PathParam("component") String component, + @QueryParam("output") @DefaultValue("string") String output, String body) { if (output.equals("file")) { - return producerTemplate.requestBodyAndHeader("xslt:xslt/classpath-transform.xsl?output=file", + return producerTemplate.requestBodyAndHeader(component + ":xslt/classpath-transform.xsl?output=file", body, Exchange.XSLT_FILE_NAME, "target/xsltme.xml", String.class); } - return producerTemplate.requestBody("xslt:xslt/classpath-transform.xsl?output=" + output, body, String.class); + return producerTemplate.requestBody(component + ":xslt/classpath-transform.xsl?output=" + output, body, String.class); } - @Path("/xslt_include") + @Path("/{component}/include") @POST @Produces(MediaType.TEXT_PLAIN) - public String xsltInclude(String body) { - return producerTemplate.requestBody("xslt:xslt/include.xsl", body, String.class); + public String xsltInclude(@PathParam("component") String component, String body) { + return producerTemplate.requestBody(component + ":xslt/include.xsl", body, String.class); } - @Path("/xslt_terminate") + @Path("/{component}/terminate") @POST @Produces(MediaType.TEXT_PLAIN) - public String xsltTerminate(String body) { - Exchange out = producerTemplate.request("xslt:xslt/terminate.xsl", exchange -> exchange.getIn().setBody(body)); - Exception warning = out.getProperty(Exchange.XSLT_WARNING, Exception.class); - return warning.getMessage(); + public String xsltTerminate(@PathParam("component") String component, String body) throws Exception { + Exchange out = producerTemplate.request(component + ":xslt/terminate.xsl", exchange -> exchange.getIn().setBody(body)); + if (component.equals("xslt")) { + Exception warning = out.getProperty(Exchange.XSLT_WARNING, Exception.class); + return warning.getMessage(); + } else if (component.equals("xslt-saxon")) { + Exception error = out.getProperty(Exchange.XSLT_FATAL_ERROR, Exception.class); + return ((XPathException) error).getErrorObject().head().getStringValue(); + } + return ""; } @Path("/xslt-extension-function") @@ -84,28 +94,22 @@ public class XsltResource { return producerTemplate.requestBody("xslt:xslt/extension-function.xsl", body, String.class); } - @Path("/xslt-custom-uri-resolver") + @Path("/xslt-saxon-extension-function") @POST @Produces(MediaType.TEXT_PLAIN) - public String customURIResolver(String body) { - return producerTemplate.requestBody("xslt:xslt/include_not_existing_resource.xsl?uriResolver=#customURIResolver", body, + public String saxonExtensionFunction(String body) { + return producerTemplate.requestBody( + "xslt-saxon:xslt/saxon-extension-function.xsl?saxonExtensionFunctions=#function1,#function2", body, String.class); } - @Path("/aggregate") - @GET + @Path("/{component}/custom-uri-resolver") + @POST @Produces(MediaType.TEXT_PLAIN) - public String aggregate() throws Exception { - MockEndpoint mock = camelContext.getEndpoint("mock:transformed", MockEndpoint.class); - mock.expectedMessageCount(1); - - producerTemplate.sendBody("direct:aggregate", "<item>A</item>"); - producerTemplate.sendBody("direct:aggregate", "<item>B</item>"); - producerTemplate.sendBody("direct:aggregate", "<item>C</item>"); - - mock.assertIsSatisfied(); - return mock.getExchanges().get(0).getIn().getBody(String.class); - + public String customURIResolver(@PathParam("component") String component, String body) { + return producerTemplate.requestBody( + component + ":xslt/include_not_existing_resource.xsl?uriResolver=#customURIResolver", body, + String.class); } @Path("/html-transform") diff --git a/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltRouteBuilder.java b/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltRouteBuilder.java index 6ac82e302f..eb2533f907 100644 --- a/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltRouteBuilder.java +++ b/integration-test-groups/xml/native/classpath/src/main/java/org/apache/camel/quarkus/component/xml/it/XsltRouteBuilder.java @@ -18,7 +18,10 @@ package org.apache.camel.quarkus.component.xml.it; import org.w3c.dom.Document; +import org.apache.camel.BindToRegistry; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.quarkus.test.support.xslt.MyExtensionFunction1; +import org.apache.camel.quarkus.test.support.xslt.MyExtensionFunction2; import org.apache.camel.support.builder.Namespaces; import org.apache.xpath.XPathAPI; @@ -55,4 +58,10 @@ public class XsltRouteBuilder extends RouteBuilder { .to("seda:xtokenize-result"); } + + @BindToRegistry + private MyExtensionFunction1 function1 = new MyExtensionFunction1(); + + @BindToRegistry + private MyExtensionFunction2 function2 = new MyExtensionFunction2(); } diff --git a/integration-tests-support/xslt-support/pom.xml b/integration-test-groups/xml/native/classpath/src/main/resources/xslt/saxon-extension-function.xsl similarity index 57% copy from integration-tests-support/xslt-support/pom.xml copy to integration-test-groups/xml/native/classpath/src/main/resources/xslt/saxon-extension-function.xsl index 5d6766047e..1793b2b62b 100644 --- a/integration-tests-support/xslt-support/pom.xml +++ b/integration-test-groups/xml/native/classpath/src/main/resources/xslt/saxon-extension-function.xsl @@ -17,15 +17,23 @@ limitations under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-integration-tests-support</artifactId> - <version>3.0.0-SNAPSHOT</version> - <relativePath>../pom.xml</relativePath> - </parent> - <modelVersion>4.0.0</modelVersion> +<xsl:stylesheet version="2.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:func="http://mytest/" + exclude-result-prefixes="func"> - <artifactId>camel-quarkus-integration-tests-support-xslt</artifactId> - <name>Camel Quarkus :: Integration Tests :: Support :: XSLT</name> -</project> + <xsl:output method="xml" encoding="UTF-8" indent="no" /> + + <xsl:template match="/"> + <Test1> + <xsl:value-of select="func:myExtensionFunction1(1, 2)"/> + </Test1> + <Test2> + <xsl:value-of select="func:myExtensionFunction2('abc', 'cde')"/> + </Test2> + <Test3> + <xsl:value-of select="func:myExtensionFunction2('xyz')"/> + </Test3> + </xsl:template> + +</xsl:stylesheet> diff --git a/integration-test-groups/xml/native/classpath/src/test/java/org/apache/camel/quarkus/component/xml/it/XsltTest.java b/integration-test-groups/xml/native/classpath/src/test/java/org/apache/camel/quarkus/component/xml/it/XsltTest.java index a8852cb855..231c90c779 100644 --- a/integration-test-groups/xml/native/classpath/src/test/java/org/apache/camel/quarkus/component/xml/it/XsltTest.java +++ b/integration-test-groups/xml/native/classpath/src/test/java/org/apache/camel/quarkus/component/xml/it/XsltTest.java @@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.xml.it; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Stream; import io.quarkus.test.junit.DisabledOnIntegrationTest; import io.quarkus.test.junit.QuarkusTest; @@ -28,6 +29,8 @@ import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import static org.hamcrest.Matchers.is; @@ -36,12 +39,24 @@ import static org.hamcrest.Matchers.is; public class XsltTest { private static final String BODY = "<mail><subject>Hey</subject><body>Hello world!</body></mail>"; + private static Stream<Arguments> matrix() { + return Stream.of( + Arguments.of("xslt", "string"), + Arguments.of("xslt", "bytes"), + Arguments.of("xslt", "dom"), + Arguments.of("xslt", "file"), + Arguments.of("xslt-saxon", "string"), + Arguments.of("xslt-saxon", "bytes"), + Arguments.of("xslt-saxon", "dom"), + Arguments.of("xslt-saxon", "file")); + } + @ParameterizedTest - @ValueSource(strings = { "string", "bytes", "dom", "file" }) - public void xslt(String output) throws Exception { + @MethodSource("matrix") + public void xslt(String component, String output) throws Exception { final String actual = RestAssured.given() .body(BODY) - .post("/xml/xslt?output=" + output) + .post("/xml/" + component + "?output=" + output) .then() .statusCode(200) .extract().body().asString().trim().replaceAll(">\\s+<", "><"); @@ -64,6 +79,20 @@ public class XsltTest { } } + @Test + public void saxonStAX() { + final String actual = RestAssured.given() + .body(BODY) + .post("/xml/stax") + .then() + .statusCode(200) + .extract().body().asString().trim().replaceAll(">\\s+<", "><"); + + Assertions.assertEquals( + "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><classpath-xsl subject=\"Hey\"><cheese><mail><subject>Hey</subject><body>Hello world!</body></mail></cheese></classpath-xsl>", + actual); + } + @Test public void xsltExtensionFunction() { final String actual = RestAssured.given() @@ -79,10 +108,26 @@ public class XsltTest { } @Test - public void xsltCustomURIResolver() { + @DisabledOnIntegrationTest("xslt-saxon extension function does not be supported in native mode") + public void saxonExtensionFunction() { final String actual = RestAssured.given() .body(BODY) - .post("/xml/xslt-custom-uri-resolver") + .post("/xml/xslt-saxon-extension-function") + .then() + .statusCode(200) + .extract().body().asString().trim().replaceAll(">\\s+<", "><"); + + Assertions.assertEquals( + "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test1>3</Test1><Test2>abccde</Test2><Test3>xyz</Test3>", + actual); + } + + @ParameterizedTest + @ValueSource(strings = { "xslt", "xslt-saxon" }) + public void xsltCustomURIResolver(String component) { + final String actual = RestAssured.given() + .body(BODY) + .post("/xml/" + component + "/custom-uri-resolver") .then() .statusCode(200) .extract().body().asString().trim().replaceAll(">\\s+<", "><"); @@ -92,12 +137,13 @@ public class XsltTest { actual); } - @Test + @ParameterizedTest + @ValueSource(strings = { "xslt", "xslt-saxon" }) @DisabledOnIntegrationTest("Generating xslt templates dynamically does not be supported in native mode") - public void xsltInclude() { + public void xsltInclude(String component) { final String actual = RestAssured.given() .body(BODY) - .post("/xml/xslt_include") + .post("/xml/" + component + "/include") .then() .statusCode(200) .extract().body().asString().trim().replaceAll(">\\s+<", "><"); @@ -107,12 +153,13 @@ public class XsltTest { actual); } - @Test + @ParameterizedTest + @ValueSource(strings = { "xslt", "xslt-saxon" }) @DisabledOnIntegrationTest("forwarding xslt error and warn messages does not be supported in native mode") - public void xsltTerminate() { + public void xsltTerminate(String component) { RestAssured.given() .body("<staff><programmer><name>Daisy Duck</name><dob></dob></programmer></staff>") - .post("/xml/xslt_terminate") + .post("/xml/" + component + "/terminate") .then() .statusCode(200) .body(is("Error: DOB is an empty string!")); diff --git a/integration-tests-support/xslt-support/pom.xml b/integration-tests-support/xslt-support/pom.xml index 5d6766047e..ad072e704f 100644 --- a/integration-tests-support/xslt-support/pom.xml +++ b/integration-tests-support/xslt-support/pom.xml @@ -28,4 +28,11 @@ <artifactId>camel-quarkus-integration-tests-support-xslt</artifactId> <name>Camel Quarkus :: Integration Tests :: Support :: XSLT</name> + + <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-xslt-saxon</artifactId> + </dependency> + </dependencies> </project> diff --git a/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction1.java b/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction1.java new file mode 100644 index 0000000000..6deccb68ca --- /dev/null +++ b/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction1.java @@ -0,0 +1,89 @@ +/* + * 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.quarkus.test.support.xslt; + +import net.sf.saxon.expr.XPathContext; +import net.sf.saxon.lib.ExtensionFunctionCall; +import net.sf.saxon.lib.ExtensionFunctionDefinition; +import net.sf.saxon.om.Item; +import net.sf.saxon.om.Sequence; +import net.sf.saxon.om.SequenceTool; +import net.sf.saxon.om.StructuredQName; +import net.sf.saxon.trans.XPathException; +import net.sf.saxon.tree.iter.SingletonIterator; +import net.sf.saxon.value.Int64Value; +import net.sf.saxon.value.SequenceType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MyExtensionFunction1 extends ExtensionFunctionDefinition { + + private static final long serialVersionUID = 1L; + + private static final Logger LOG = LoggerFactory.getLogger(MyExtensionFunction1.class); + + @Override + public StructuredQName getFunctionQName() { + return new StructuredQName("", "http://mytest/", "myExtensionFunction1"); + } + + @Override + public int getMinimumNumberOfArguments() { + return 2; + } + + @Override + public int getMaximumNumberOfArguments() { + return 2; + } + + @Override + public SequenceType[] getArgumentTypes() { + return new SequenceType[] { SequenceType.SINGLE_INTEGER, SequenceType.SINGLE_INTEGER }; + } + + @Override + public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { + int resultCardinality = 1; + return SequenceType.makeSequenceType(SequenceType.SINGLE_INTEGER.getPrimaryType(), resultCardinality); + } + + @Override + public ExtensionFunctionCall makeCallExpression() { + return new ExtensionFunctionCall() { + private static final long serialVersionUID = 1L; + + @Override + public Sequence call(XPathContext xPathContext, Sequence[] arguments) throws XPathException { + // 1st argument (mandatory, index 0) + Int64Value arg1 = (Int64Value) arguments[0].iterate().next(); + int arg1Int = arg1.getDecimalValue().toBigInteger().intValue(); + + // 2nd argument (mandatory, index 1) + Int64Value arg2 = (Int64Value) arguments[1].iterate().next(); + int arg2Int = arg2.getDecimalValue().toBigInteger().intValue(); + + // Functionality goes here + int resultInt = arg1Int + arg2Int; + + Item result = new Int64Value(resultInt); + return SequenceTool.toLazySequence(SingletonIterator.makeIterator(result)); + } + }; + } + +} diff --git a/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction2.java b/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction2.java new file mode 100644 index 0000000000..fd89d0e54b --- /dev/null +++ b/integration-tests-support/xslt-support/src/main/java/org/apache/camel/quarkus/test/support/xslt/MyExtensionFunction2.java @@ -0,0 +1,92 @@ +/* + * 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.quarkus.test.support.xslt; + +import net.sf.saxon.expr.XPathContext; +import net.sf.saxon.lib.ExtensionFunctionCall; +import net.sf.saxon.lib.ExtensionFunctionDefinition; +import net.sf.saxon.om.Item; +import net.sf.saxon.om.Sequence; +import net.sf.saxon.om.SequenceTool; +import net.sf.saxon.om.StructuredQName; +import net.sf.saxon.trans.XPathException; +import net.sf.saxon.tree.iter.SingletonIterator; +import net.sf.saxon.value.SequenceType; +import net.sf.saxon.value.StringValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MyExtensionFunction2 extends ExtensionFunctionDefinition { + + private static final long serialVersionUID = 1L; + + private static final Logger LOG = LoggerFactory.getLogger(MyExtensionFunction2.class); + + @Override + public StructuredQName getFunctionQName() { + return new StructuredQName("", "http://mytest/", "myExtensionFunction2"); + } + + @Override + public int getMinimumNumberOfArguments() { + return 1; + } + + @Override + public int getMaximumNumberOfArguments() { + return 2; + } + + @Override + public SequenceType[] getArgumentTypes() { + return new SequenceType[] { SequenceType.SINGLE_STRING, SequenceType.OPTIONAL_STRING }; + } + + @Override + public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { + int resultCardinality = 1; + return SequenceType.makeSequenceType(SequenceType.SINGLE_STRING.getPrimaryType(), resultCardinality); + } + + @Override + public ExtensionFunctionCall makeCallExpression() { + return new ExtensionFunctionCall() { + private static final long serialVersionUID = 1L; + + @Override + public Sequence call(XPathContext xPathContext, Sequence[] arguments) throws XPathException { + // 1st argument (mandatory, index 0) + StringValue arg1 = (StringValue) arguments[0].iterate().next(); + String arg1Str = arg1.getStringValue(); + + // 2nd argument (optional, index 1) + String arg2Str = ""; + if (arguments.length > 1) { + StringValue arg2 = (StringValue) arguments[1].iterate().next(); + arg2Str = arg2.getStringValue(); + } + + // Functionality goes here + String resultStr = arg1Str + arg2Str; + + Item result = new StringValue(resultStr); + return SequenceTool.toLazySequence(SingletonIterator.makeIterator(result)); + } + }; + } + +} diff --git a/integration-tests/xml-grouped/pom.xml b/integration-tests/xml-grouped/pom.xml index df6aa428bc..d98ef3bf0f 100644 --- a/integration-tests/xml-grouped/pom.xml +++ b/integration-tests/xml-grouped/pom.xml @@ -72,6 +72,10 @@ <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-xslt</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-xslt-saxon</artifactId> + </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> @@ -241,6 +245,19 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-xslt-saxon-deployment</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> </dependencies> </profile> </profiles>