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