package org.wamblee.crawler;
import java.io.ByteArrayOutputStream;
-import java.io.File;
import java.io.IOException;
import javax.xml.transform.OutputKeys;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.tidy.Tidy;
-import org.wamblee.io.FileResource;
+import org.wamblee.xml.ClasspathUriResolver;
import org.wamblee.xml.DOMUtility;
import org.wamblee.xml.XSLT;
aMethod = executeWithRedirects(aClient, aMethod);
byte[] xhtmlData = getXhtml(aMethod);
- Document transformed = new XSLT().transform(xhtmlData,
- new FileResource(new File(_xslt)));
+ XSLT xsltProcessor = new XSLT(new ClasspathUriResolver());
+ Document transformed = xsltProcessor.transform(xhtmlData,
+ xsltProcessor.resolve(_xslt));
ByteArrayOutputStream os = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
*/
package org.wamblee.crawler.kiss.notification;
-import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.dom4j.Element;
-import org.wamblee.io.FileResource;
-import org.wamblee.io.InputResource;
+import org.wamblee.xml.ClasspathUriResolver;
import org.wamblee.xml.XSLT;
/**
mail.setSentDate(new Date());
mail.setSubject(_subject);
- String htmlText = transformReport(aReport, new FileResource(
- new File(_htmlXslt)));
- String plainText = transformReport(aReport, new FileResource(
- new File(_textXslt)));
+ String htmlText = transformReport(aReport, _htmlXslt);
+ String plainText = transformReport(aReport, _textXslt);
mail.setHtmlMsg(htmlText);
mail.setTextMsg(plainText);
* @throws TransformerException
* In case of problems transforming.
*/
- private String transformReport(Element aReport, InputResource aXslt)
+ private String transformReport(Element aReport, String aXslt)
throws IOException, TransformerException {
String reportXmlText = aReport.asXML();
- return new XSLT().textTransform(reportXmlText.getBytes(), aXslt);
+ XSLT xsltProcessor = new XSLT(new ClasspathUriResolver());
+ return xsltProcessor.textTransform(reportXmlText.getBytes(), xsltProcessor.resolve(aXslt));
}
}
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;
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, "");
}
/**
* @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();
* @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());
* @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();
- }
}
}
}