ClasspathUriResolver is now also an LSInputResolver so it can be used for both XSLT...
authorErik Brakkee <erik@brakkee.org>
Tue, 22 Feb 2011 20:50:32 +0000 (20:50 +0000)
committerErik Brakkee <erik@brakkee.org>
Tue, 22 Feb 2011 20:50:32 +0000 (20:50 +0000)
support/general/src/main/java/org/wamblee/xml/ClasspathUriResolver.java
support/general/src/main/java/org/wamblee/xml/DomUtils.java
support/general/src/test/java/org/wamblee/xml/ClasspathUriResolverTest.java

index 61212dc16ac30c1669dba632eed7b5c5827bf592..6ee7389e4014256d03c67acaa1a7d260e4971f7a 100644 (file)
  */
 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;
+        }
+       
+       
+    }
+
 }
index 44a9f8ee8268a4cb946d7bc6adb7478e21a84f34..a0a118c1062cd82e8fd0aac29bb84fb01a371fb3 100644 (file)
@@ -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.
      * 
index d0bf723f11a6490fc29964c2891a89708510508a..7abe5d2ad8951b86bd092278fce95caed68434c8 100644 (file)
@@ -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);
+    }
 }