From df850821cf26ca07ef2474d4d2cabb61e9104291 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Tue, 22 Feb 2011 20:50:32 +0000 Subject: [PATCH] ClasspathUriResolver is now also an LSInputResolver so it can be used for both XSLT and XML, XSD. --- .../org/wamblee/xml/ClasspathUriResolver.java | 26 +++++++++- .../main/java/org/wamblee/xml/DomUtils.java | 39 ++++++++++---- .../wamblee/xml/ClasspathUriResolverTest.java | 52 ++++++++++++++++--- 3 files changed, 98 insertions(+), 19 deletions(-) diff --git a/support/general/src/main/java/org/wamblee/xml/ClasspathUriResolver.java b/support/general/src/main/java/org/wamblee/xml/ClasspathUriResolver.java index 61212dc1..6ee7389e 100644 --- a/support/general/src/main/java/org/wamblee/xml/ClasspathUriResolver.java +++ b/support/general/src/main/java/org/wamblee/xml/ClasspathUriResolver.java @@ -15,10 +15,14 @@ */ package org.wamblee.xml; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSResourceResolver; import org.wamblee.io.ClassPathResource; import org.wamblee.io.InputResource; import java.io.IOException; +import java.io.InputStream; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; @@ -28,7 +32,7 @@ import javax.xml.transform.stream.StreamSource; /** * URI resolver that resolves stylesheets through the classpath. */ -public class ClasspathUriResolver implements URIResolver { +public class ClasspathUriResolver implements URIResolver, LSResourceResolver { /** * Constructs the resolver. * @@ -55,4 +59,24 @@ public class ClasspathUriResolver implements URIResolver { e); } } + + @Override + public LSInput resolveResource(String aType, String aNamespaceURI, + String aPublicId, String aSystemId, String aBaseURI) { + try { + InputStream xslt = new ClassPathResource(aSystemId) + .getInputStream(); + DOMImplementationLS impl = DomUtils.getDomImplementationLS(); + LSInput input = impl.createLSInput(); + input.setPublicId(aPublicId); + input.setSystemId(aSystemId); + input.setByteStream(xslt); + return input; + } catch (IOException e) { + return null; + } + + + } + } diff --git a/support/general/src/main/java/org/wamblee/xml/DomUtils.java b/support/general/src/main/java/org/wamblee/xml/DomUtils.java index 44a9f8ee..a0a118c1 100644 --- a/support/general/src/main/java/org/wamblee/xml/DomUtils.java +++ b/support/general/src/main/java/org/wamblee/xml/DomUtils.java @@ -97,23 +97,13 @@ public final class DomUtils { */ public static Document read(InputStream aIs) throws XMLException { try { - DOMImplementationRegistry registry = DOMImplementationRegistry - .newInstance(); - - DOMImplementationLS impl = (DOMImplementationLS) registry - .getDOMImplementation("LS"); + DOMImplementationLS impl = getDomImplementationLS(); LSParser builder = impl.createLSParser( DOMImplementationLS.MODE_SYNCHRONOUS, null); LSInput input = impl.createLSInput(); input.setByteStream(aIs); return builder.parse(input); - } catch (IllegalAccessException e) { - throw new XMLException(e.getMessage(), e); - } catch (InstantiationException e) { - throw new XMLException(e.getMessage(), e); - } catch (ClassNotFoundException e) { - throw new XMLException(e.getMessage(), e); } catch (LSException e) { throw new XMLException(e.getMessage(), e); } finally { @@ -125,6 +115,33 @@ public final class DomUtils { } } + /** + * Gets a dom level 3 implementation. + * @return Dom implementation. + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + */ + public static DOMImplementationLS getDomImplementationLS() { + final String message = "Could not get Dom level 3 implementation"; + try { + DOMImplementationRegistry registry = DOMImplementationRegistry + .newInstance(); + + DOMImplementationLS impl = (DOMImplementationLS) registry + .getDOMImplementation("LS"); + return impl; + } catch (ClassCastException e) { + throw new RuntimeException(message, e); + } catch (ClassNotFoundException e) { + throw new RuntimeException(message, e); + } catch (InstantiationException e) { + throw new RuntimeException(message, e); + } catch (IllegalAccessException e) { + throw new RuntimeException(message, e); + } + } + /** * Reads and validates a document against a schema. * diff --git a/support/general/src/test/java/org/wamblee/xml/ClasspathUriResolverTest.java b/support/general/src/test/java/org/wamblee/xml/ClasspathUriResolverTest.java index d0bf723f..7abe5d2a 100644 --- a/support/general/src/test/java/org/wamblee/xml/ClasspathUriResolverTest.java +++ b/support/general/src/test/java/org/wamblee/xml/ClasspathUriResolverTest.java @@ -17,6 +17,8 @@ package org.wamblee.xml; import junit.framework.TestCase; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSResourceResolver; import org.wamblee.io.ClassPathResource; import org.wamblee.io.FileSystemUtils; @@ -33,7 +35,9 @@ import javax.xml.transform.stream.StreamSource; * @author Erik Brakkee */ public class ClasspathUriResolverTest extends TestCase { - private URIResolver resolver; + private static final String EXISTING_RESOURCE = "org/wamblee/xml/reportToHtml.xsl"; + private static final String NON_EXISTING_RESOURCE = "org/wamblee/xml/reportToHtml-nonexisting.xsl"; + private ClasspathUriResolver resolver; /* * (non-Javadoc) @@ -51,17 +55,17 @@ public class ClasspathUriResolverTest extends TestCase { * @throws TransformerException * @throws IOException */ - public void testResolveExistingFile() throws TransformerException, - IOException { + public void testResolveExistingFileURIResolver() + throws TransformerException, IOException { Source source = resolver - .resolve("org/wamblee/xml/reportToHtml.xsl", ""); + .resolve(EXISTING_RESOURCE, ""); assertTrue(source instanceof StreamSource); String resolved = FileSystemUtils.read(((StreamSource) source) .getInputStream()); ClassPathResource resource = new ClassPathResource( - "org/wamblee/xml/reportToHtml.xsl"); + EXISTING_RESOURCE); String expected = FileSystemUtils.read(resource.getInputStream()); assertEquals(expected, resolved); } @@ -71,14 +75,48 @@ public class ClasspathUriResolverTest extends TestCase { * thrown. * */ - public void testResolveNonExistingFile() { + public void testResolveNonExistingFileURIResolver() { try { resolver - .resolve("org/wamblee/xml/reportToHtml-nonexisting.xsl", ""); + .resolve(NON_EXISTING_RESOURCE, ""); } catch (TransformerException e) { return; // ok } fail(); } + + /** + * Resolves an existing file. Verifies the file is resolved correctly. + * + * @throws TransformerException + * @throws IOException + */ + public void testResolveExistingFileLSResourceResolver() + throws TransformerException, IOException { + LSInput source = resolver.resolveResource(null, null, "kees", + EXISTING_RESOURCE, null); + assertNotNull(source); + + assertEquals("kees", source.getPublicId()); + assertEquals(EXISTING_RESOURCE, source.getSystemId()); + + String resolved = FileSystemUtils.read(source.getByteStream()); + + ClassPathResource resource = new ClassPathResource( + EXISTING_RESOURCE); + String expected = FileSystemUtils.read(resource.getInputStream()); + assertEquals(expected, resolved); + } + + /** + * Resolves a non-existing file. Verifies that a TransformerException is + * thrown. + * + */ + public void testResolveNonExistingFileLSResourceResolver() { + LSInput input = resolver.resolveResource(null, null, "kees", + NON_EXISTING_RESOURCE, null); + assertNull(input); + } } -- 2.31.1