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