stylesheets are now searched in the classpath.
[utils] / support / src / org / wamblee / xml / XSLT.java
index ae603976b6de126e8a1ac22a3880fb76d1599f7c..7ffe63b3ff132d0a8cbaf49dca6610f837acd794 100644 (file)
@@ -18,8 +18,8 @@ package org.wamblee.xml;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
@@ -27,25 +27,60 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
 import org.w3c.dom.Document;
-import org.wamblee.io.InputResource;
+import org.wamblee.io.FileResource;
 
 /**
  * XSLT utilities.
  */
 public class XSLT {
 
+    private TransformerFactory _factory;
+
+    /**
+     * Constructs the URL resolver.
+     * 
+     * @param aResolver
+     *            URI resolver to use.
+     */
+    public XSLT(URIResolver aResolver) {
+        _factory = TransformerFactory.newInstance();
+        _factory.setURIResolver(aResolver);
+    }
+
     /**
      * Constructs the XSLT processor.
      * 
      */
     public XSLT() {
-        // Empty.
+        _factory = TransformerFactory.newInstance();
+    }
+
+    /**
+     * Resolves an XSLT based on URI. 
+     * @param aXslt XSLT to resolve, 
+     * @return Source for the XSLT
+     * @throws TransformerException In case the XSLT cannot be found. 
+     */
+    public Source resolve(String aXslt) throws TransformerException {
+        URIResolver resolver = _factory.getURIResolver();
+        if (resolver == null) {
+            if (new File(aXslt).canRead()) {
+                try {
+                    return new StreamSource(new FileResource(new File(aXslt))
+                            .getInputStream());
+                } catch (IOException e) {
+                    throw new TransformerException(e.getMessage(), e);
+                }
+            }
+        }
+        return resolver.resolve(aXslt, "");
     }
 
     /**
@@ -62,7 +97,7 @@ public class XSLT {
      * @throws TransformerException
      *             In case transformation fails.
      */
-    public Document transform(Document aDocument, InputResource aXslt)
+    public Document transform(Document aDocument, Source aXslt)
             throws IOException, TransformerException {
         Source source = new DOMSource(aDocument);
         DOMResult result = new DOMResult();
@@ -83,24 +118,28 @@ public class XSLT {
      * @throws TransformerException
      *             In case transformation fails.
      */
-    public Document transform(byte[] aDocument, InputResource aXslt)
+    public Document transform(byte[] aDocument, Source aXslt)
             throws IOException, TransformerException {
         Source source = new StreamSource(new ByteArrayInputStream(aDocument));
         DOMResult result = new DOMResult();
         transform(source, result, aXslt);
         return (Document) result.getNode();
     }
-    
+
     /**
-     * Transforms a document to a text output. This supports XSLT transformations
-     * that result in text documents. 
-     * @param aDocument Document to transform.
-     * @param aXslt XSL transformation. 
-     * @return Transformed document.  
+     * Transforms a document to a text output. This supports XSLT
+     * transformations that result in text documents.
+     * 
+     * @param aDocument
+     *            Document to transform.
+     * @param aXslt
+     *            XSL transformation.
+     * @return Transformed document.
      */
-    public String textTransform(byte[] aDocument, InputResource aXslt) throws IOException, TransformerException { 
+    public String textTransform(byte[] aDocument, Source aXslt)
+            throws IOException, TransformerException {
         Source source = new StreamSource(new ByteArrayInputStream(aDocument));
-        ByteArrayOutputStream os = new ByteArrayOutputStream(); 
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
         StreamResult result = new StreamResult(os);
         transform(source, result, aXslt);
         return new String(os.toByteArray());
@@ -120,22 +159,14 @@ public class XSLT {
      * @throws TransformerException
      *             In case transformation fails.
      */
-    public void transform(Source aSource, Result aResult, InputResource aXslt)
+    public void transform(Source aSource, Result aResult, Source aXslt)
             throws IOException, TransformerException {
-        InputStream xslt = null;
         try {
-            xslt = aXslt.getInputStream();
-            Source xsltSource = new StreamSource(xslt);
-            Transformer transformer = TransformerFactory.newInstance()
-                    .newTransformer(xsltSource);
+            Transformer transformer = _factory.newTransformer(aXslt);
             transformer.transform(aSource, aResult);
         } catch (TransformerConfigurationException e) {
             throw new RuntimeException(
                     "Configuration problem of XSLT transformation", e);
-        } finally {
-            if (xslt != null) {
-                xslt.close();
-            }
         }
     }
 }