Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[bugfix] registered import-uris have precedence #5576

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading