stylesheets are now searched in the classpath.
[utils] / support / src / org / wamblee / xml / XSLT.java
index e7c5fc7643c76c046e06c69c401f67a435df5618..7ffe63b3ff132d0a8cbaf49dca6610f837acd794 100644 (file)
@@ -17,8 +17,9 @@
 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;
@@ -26,24 +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, "");
     }
 
     /**
@@ -60,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();
@@ -81,7 +118,7 @@ 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();
@@ -89,6 +126,25 @@ public class XSLT {
         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.
+     */
+    public String textTransform(byte[] aDocument, Source aXslt)
+            throws IOException, TransformerException {
+        Source source = new StreamSource(new ByteArrayInputStream(aDocument));
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        StreamResult result = new StreamResult(os);
+        transform(source, result, aXslt);
+        return new String(os.toByteArray());
+    }
+
     /**
      * Transforms a document using XSLT.
      * 
@@ -103,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();
-            }
         }
     }
 }