From adbb94b3e955ed17a1d5053a6d87126bc2d1f14a Mon Sep 17 00:00:00 2001 From: Juri Leino Date: Tue, 10 Dec 2024 14:55:33 +0100 Subject: [PATCH] [bugfix] registered import-uris have precedence When importing stylesheets the URIs are resolved in order - registered import-uris in package repo - XMLDB-locations (relative, absolute and with or without scheme) - any other location is treated as an exteranal source The test class and its cases were renamed to reflect their purpose. Some inline comments were added to help describing the intent. --- .../org/exist/xslt/XsltURIResolverHelper.java | 10 +-- ...st.java => ImportLocalStylesheetTest.java} | 66 +++++++++++++------ 2 files changed, 51 insertions(+), 25 deletions(-) rename exist-core/src/test/java/org/exist/xquery/functions/transform/{TransformFromPkgTest.java => ImportLocalStylesheetTest.java} (56%) diff --git a/exist-core/src/main/java/org/exist/xslt/XsltURIResolverHelper.java b/exist-core/src/main/java/org/exist/xslt/XsltURIResolverHelper.java index 8b7b8089784..0e342f4d68e 100644 --- a/exist-core/src/main/java/org/exist/xslt/XsltURIResolverHelper.java +++ b/exist-core/src/main/java/org/exist/xslt/XsltURIResolverHelper.java @@ -52,14 +52,16 @@ public class XsltURIResolverHelper { @Nullable final URIResolver defaultResolver, @Nullable final String base, final boolean avoidSelf) { final List resolvers = new ArrayList<>(); + // EXpath Pkg resolver + // This resolver needs to be the first one to prevent + // HTTP requests for registered package names (e.g. http://www.functx.com/functx.xsl) + brokerPool.getExpathRepo().map(repo -> resolvers.add(new PkgXsltModuleURIResolver(repo))); + if (base != null) { // database resolver - resolvers.add(new EXistURISchemeURIResolver(new EXistURIResolver(brokerPool, base))); + resolvers.add(new EXistURIResolver(brokerPool, base)); } - // EXpath Pkg resolver - brokerPool.getExpathRepo().map(repo -> resolvers.add(new PkgXsltModuleURIResolver(repo))); - // default resolver if (defaultResolver != null) { if (avoidSelf) { diff --git a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java b/exist-core/src/test/java/org/exist/xquery/functions/transform/ImportLocalStylesheetTest.java similarity index 56% rename from exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java rename to exist-core/src/test/java/org/exist/xquery/functions/transform/ImportLocalStylesheetTest.java index dcdc57e4e61..f593f0cc0d2 100644 --- a/exist-core/src/test/java/org/exist/xquery/functions/transform/TransformFromPkgTest.java +++ b/exist-core/src/test/java/org/exist/xquery/functions/transform/ImportLocalStylesheetTest.java @@ -35,18 +35,22 @@ import static org.junit.Assert.assertNotNull; /** + * Test transform:transform with an imported stylesheet from various + * locations + * * @author Adam Retter + * @author Juri Leino */ -public class TransformFromPkgTest { +public class ImportLocalStylesheetTest { - private static final String moduleLocation = "/db/system/repo/functx-1.0.1/functx/functx.xsl"; - private static final String inputXml = "bonjourno"; - private static final String expectedOutput = "hello"; + private static final String XSL_DB_LOCATION = "/db/system/repo/functx-1.0.1/functx/functx.xsl"; + private static final String INPUT_XML = "bonjourno"; + private static final String EXPECTED_OUTPUT = "hello"; private static Path getConfigFile() { - final ClassLoader loader = TransformFromPkgTest.class.getClassLoader(); + final ClassLoader loader = ImportLocalStylesheetTest.class.getClassLoader(); final char separator = System.getProperty("file.separator").charAt(0); - final String packagePath = TransformFromPkgTest.class.getPackage().getName().replace('.', separator); + final String packagePath = ImportLocalStylesheetTest.class.getPackage().getName().replace('.', separator); try { return Paths.get(loader.getResource(packagePath + separator + "conf.xml").toURI()); @@ -57,51 +61,71 @@ private static Path getConfigFile() { } private static String getQuery(final String importLocation) { - final String xslt = "\n" + - " \n" + " \n" + - " \n" + " \n" + - " " + + " \n" + " \n" + - " " + + " \n" + " \n" + - " \n" + ""; - return "transform:transform(" + inputXml + ", " + xslt + ", ())"; + return "transform:transform(" + INPUT_XML + ", " + xslt + ", ())"; } private static void assertTransformationResult(ResourceSet result) throws XMLDBException { assertNotNull(result); assertEquals(1, result.getSize()); - assertEquals(expectedOutput, result.getResource(0).getContent()); + assertEquals(EXPECTED_OUTPUT, result.getResource(0).getContent()); } @ClassRule public static ExistXmldbEmbeddedServer existXmldbEmbeddedServer = new ExistXmldbEmbeddedServer(true, false, true, getConfigFile()); @Test - public void testImportNoScheme() throws XMLDBException { - final String xquery = getQuery(moduleLocation); + public void fromRegisteredImportUri() throws XMLDBException { + final String xquery = getQuery("http://www.functx.com/functx.xsl"); + final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); + assertTransformationResult(result); + } + + @Test + public void fromDbLocationWithoutScheme() throws XMLDBException { + final String xquery = getQuery(XSL_DB_LOCATION); + final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); + assertTransformationResult(result); + } + + @Test + public void fromDbLocationWithXmldbScheme() throws XMLDBException { + final String xquery = getQuery("xmldb:" + XSL_DB_LOCATION); + final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); + assertTransformationResult(result); + } + + @Test + public void fromDbLocationWithXmldbSchemeDoubleSlash() throws XMLDBException { + final String xquery = getQuery("xmldb://" + XSL_DB_LOCATION); final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); assertTransformationResult(result); } @Test - public void testImportXmldbScheme() throws XMLDBException { - final String xquery = getQuery("xmldb:" + moduleLocation); + @Ignore + public void fromXmldbExistScheme() throws XMLDBException { + final String xquery = getQuery("xmldb:exist:" + XSL_DB_LOCATION); final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); assertTransformationResult(result); } @Test - public void testImportXmldbSchemeDoubleSlash() throws XMLDBException { - final String xquery = getQuery("xmldb://" + moduleLocation); + public void fromXmldbExistSchemeDoubleSlash() throws XMLDBException { + final String xquery = getQuery("xmldb:exist://" + XSL_DB_LOCATION); final ResourceSet result = existXmldbEmbeddedServer.executeQuery(xquery); assertTransformationResult(result); }