X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fsrc%2Forg%2Fwamblee%2Fxml%2FXSLT.java;h=7ffe63b3ff132d0a8cbaf49dca6610f837acd794;hb=17c55ed4fa1f62885fe813ecaa99d053e1111f48;hp=e7c5fc7643c76c046e06c69c401f67a435df5618;hpb=5b6b49fbe01397461e67238481c84a62c8ed4bef;p=utils diff --git a/support/src/org/wamblee/xml/XSLT.java b/support/src/org/wamblee/xml/XSLT.java index e7c5fc76..7ffe63b3 100644 --- a/support/src/org/wamblee/xml/XSLT.java +++ b/support/src/org/wamblee/xml/XSLT.java @@ -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(); - } } } }