import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
-import org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl;
+import org.apache.xalan.processor.TransformerFactoryImpl;
import org.argeo.cms.servlet.ServletAuthUtils;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
import org.w3c.dom.Document;
+/**
+ * A servlet transforming a dbk:* JCR node into HTML, using the DocBook XSL.
+ */
public class DbkServlet extends HttpServlet {
private static final long serialVersionUID = 6906020513498289335L;
private Repository repository;
- private DocumentBuilderFactory factory;
+ private DocumentBuilderFactory documentBuilderFactory;
private TransformerFactory transformerFactory;
private Templates docBoookTemplates;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.setContentType("text/html; charset=utf-8");
+ // TODO customise DocBook so that it outputs UTF-8
+ // see http://www.sagehill.net/docbookxsl/OutputEncoding.html
+ resp.setContentType("text/html; charset=ISO-8859-1");
Session session = null;
try {
pathInfo = pathInfo.substring(1);
String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
+ // TODO optimise with pipes, SAX, etc. ?
+
byte[] arr;
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
session.exportDocumentView(path, out, true, false);
arr = out.toByteArray();
- System.out.println(new String(arr, StandardCharsets.UTF_8));
+// System.out.println(new String(arr, StandardCharsets.UTF_8));
} catch (RepositoryException e) {
throw new JcrException(e);
}
try (InputStream in = new ByteArrayInputStream(arr);
- ByteArrayOutputStream out = new ByteArrayOutputStream();) {
-// Source xsl = new StreamSource(new File("/usr/share/sgml/docbook/xsl-stylesheets/xhtml/docbook.xsl"));
-// Source xsl = new StreamSource(
-// Files.newBufferedReader(Paths.get("/home/mbaudier/Downloads/docbook-xsl-1.79.2/xhtml/docbook.xsl"),
-// StandardCharsets.US_ASCII),
-// "file:///home/mbaudier/Downloads/docbook-xsl-1.79.2/xhtml/docbook.xsl");
- Source xsl = new StreamSource(
- new File(System.getProperty("user.home") + "/Downloads/docbook-xsl-1.79.2/html/docbook.xsl"));
-// if (docBoookTemplates == null) {
-// try {
-// docBoookTemplates = transformerFactory.newTemplates(xsl);
-// } catch (TransformerConfigurationException e) {
-// throw new ServletException("Cannot instantiate XSL " + xsl, e);
-// }
-// }
-
-// Source xmlInput = new StreamSource(new File("/home/mbaudier/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml"));
-// Source xmlInput = new StreamSource(in);
- Result xmlOutput = new StreamResult(out);
-
-// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-//// DocumentBuilderFactory factory = new org.apache.xerces.jaxp.DocumentBuilderFactoryImpl();
-// factory.setXIncludeAware(true);
-// factory.setNamespaceAware(true);
- DocumentBuilder docBuilder = factory.newDocumentBuilder();
-// Document doc = docBuilder
-// .parse(new File("/home/mbaudier/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml"));
- Document doc = docBuilder.parse(in);
- Source xmlInput = new DOMSource(doc);
+// ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ) {
-// SAXParserFactory factory = SAXParserFactory.newInstance();
-// SAXParser saxParser = factory.newSAXParser();
-// Source xmlInput = new SAXSource(saxParser.getXMLReader(),
-// new InputSource(new FileReader(new File("/home/mbaudier/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml"),StandardCharsets.UTF_8)));
+ Result xmlOutput = new StreamResult(resp.getOutputStream());
-// Source xmlInput = new StreamSource(
-// new File("/home/mbaudier/dev/workspaces/argeo-suite/xslt-test/input.xml"));
-// Result xmlOutput = new StreamResult(new File("output.html"));
+ DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
+// Document doc = docBuilder.parse(new File(
+// System.getProperty("user.home") + "/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml"));
+ Document doc = docBuilder.parse(in);
+ Source xmlInput = new DOMSource(doc);
-// TransformerFactory transformerFactory = new org.apache.xalan.processor.TransformerFactoryImpl();
- Transformer transformer = transformerFactory.newTransformer(xsl);
+ Transformer transformer = docBoookTemplates.newTransformer();
transformer.transform(xmlInput, xmlOutput);
- resp.getOutputStream().write(out.toByteArray());
+// resp.getOutputStream().write(out.toByteArray());
} catch (Exception e) {
throw new ServletException("Cannot transform " + path, e);
}
@Override
public void init() throws ServletException {
- factory = DocumentBuilderFactory.newInstance();
- factory.setXIncludeAware(true);
- factory.setNamespaceAware(true);
- transformerFactory = new SmartTransformerFactoryImpl();
+
+ // TODO improve configuration and provisioning of DocBook XSL
+ String xslBase = System.getProperty("argeo.docbook.xsl");
+ if (xslBase == null) {
+ String defaultXslBase = "/opt/docbook-xsl";
+ if (!Files.exists(Paths.get(defaultXslBase))) {
+ throw new ServletException("System property argeo.docbook.xsl is not set and default location "
+ + defaultXslBase + " does not exist.");
+ } else {
+ xslBase = defaultXslBase;
+ }
+ }
+ String xsl = xslBase + "/html/docbook.xsl";
+
+ documentBuilderFactory = DocumentBuilderFactory.newInstance();
+ documentBuilderFactory.setXIncludeAware(true);
+ documentBuilderFactory.setNamespaceAware(true);
+
+ // We must explicitly use the non-XSLTC transformer, as XSLTC is not working
+ // with DocBook stylesheets
+ transformerFactory = new TransformerFactoryImpl();
+
+ Source xslSource = new StreamSource(xsl);
+ try {
+ docBoookTemplates = transformerFactory.newTemplates(xslSource);
+ if (docBoookTemplates == null)
+ throw new ServletException("Could not instantiate XSL " + xsl);
+ } catch (TransformerConfigurationException e) {
+ throw new ServletException("Cannot instantiate XSL " + xsl, e);
+ }
}
public void setRepository(Repository repository) {