Skip to content

Commit

Permalink
Merge pull request eXist-db#5576 from line-o/hotfix/transform-import
Browse files Browse the repository at this point in the history
[bugfix] registered import-uris have precedence
  • Loading branch information
dizzzz authored Jan 9, 2025
2 parents 7dd2fda + adbb94b commit d79adf3
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,16 @@ public class XsltURIResolverHelper {
@Nullable final URIResolver defaultResolver, @Nullable final String base, final boolean avoidSelf) {
final List<URIResolver> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,22 @@
import static org.junit.Assert.assertNotNull;

/**
* Test transform:transform with an imported stylesheet from various
* locations
*
* @author <a href="mailto:[email protected]">Adam Retter</a>
* @author <a href="mailto:[email protected]">Juri Leino</a>
*/
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 = "<x>bonjourno</x>";
private static final String expectedOutput = "<r xmlns:functx=\"http://www.functx.com\">hello</r>";
private static final String XSL_DB_LOCATION = "/db/system/repo/functx-1.0.1/functx/functx.xsl";
private static final String INPUT_XML = "<in>bonjourno</in>";
private static final String EXPECTED_OUTPUT = "<out>hello</out>";

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());
Expand All @@ -57,51 +61,71 @@ private static Path getConfigFile() {
}

private static String getQuery(final String importLocation) {
final String xslt = "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" +
final String xslt =
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" +
" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n" +
" xmlns:functx=\"http://www.functx.com\"\n" +
" exclude-result-prefixes=\"xs\"\n" +
" exclude-result-prefixes=\"functx xs\"\n" +
" version=\"2.0\">\n" +
" \n" +
" <xsl:import href=\"" + importLocation + "\"/>\n" +
" \n" +
" <xsl:template match=\"/\">\n" +
" <r>" +
" <out>\n" +
" <xsl:value-of select=\"functx:replace-first(., 'bonjourno', 'hello')\"/>\n" +
" </r>" +
" </out>\n" +
" </xsl:template>\n" +
" \n" +
"</xsl:stylesheet>";

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

0 comments on commit d79adf3

Please sign in to comment.