X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.app.servlet.publish%2Fsrc%2Forg%2Fargeo%2Fapp%2Fservlet%2Fpublish%2FDbkServlet.java;h=f2d38e1c0afd00c55726e9bcef5f61de05a98ab6;hb=1d6420b858bfe6f354d34086e62b49dc0c781c94;hp=f1d26760b104ec20f0c35eb34f1e95bb64975d72;hpb=806ea79d59bd58307382e3b7693f52b10db3bc68;p=gpl%2Fargeo-suite.git diff --git a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java index f1d2676..f2d38e1 100644 --- a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java +++ b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java @@ -43,7 +43,8 @@ import org.apache.commons.io.IOUtils; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.xalan.processor.TransformerFactoryImpl; -import org.argeo.api.cms.CmsTheme; +import org.argeo.api.cms.CmsLog; +import org.argeo.api.cms.ux.CmsTheme; import org.argeo.app.docbook.DbkType; import org.argeo.app.docbook.DbkUtils; import org.argeo.cms.auth.RemoteAuthUtils; @@ -59,6 +60,8 @@ import org.w3c.dom.Document; public class DbkServlet extends HttpServlet { private static final long serialVersionUID = 6906020513498289335L; + private CmsLog log = CmsLog.getLog(DbkServlet.class); + private Repository repository; private DocumentBuilderFactory documentBuilderFactory; @@ -70,6 +73,8 @@ public class DbkServlet extends HttpServlet { private Map themes = Collections.synchronizedMap(new HashMap<>()); + private String xslBase; + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { @@ -139,32 +144,38 @@ public class DbkServlet extends HttpServlet { Source xmlInput = new DOMSource(doc); if (pdf) { - //String baseUri = req.getRequestURI(); + // String baseUri = req.getRequestURI(); FopFactory fopFactory = FopFactory.newInstance(URI.create(req.getRequestURL().toString())); resp.setContentType("application/pdf"); - // DocBook to FO - byte[] foBytes; - try (ByteArrayOutputStream out = new ByteArrayOutputStream();) { - Result xmlOutput = new StreamResult(out); - Transformer docBookTransformer = docBoookFoTemplates.newTransformer(); - docBookTransformer.transform(xmlInput, xmlOutput); - foBytes = out.toByteArray(); - } - - // FO to PDF - try (InputStream foIn = new ByteArrayInputStream(foBytes)) { - Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream()); - Transformer fopTransformer = transformerFactory.newTransformer(); // identity - Source src = new StreamSource(foIn); - Result fopResult = new SAXResult(fop.getDefaultHandler()); - fopTransformer.transform(src, fopResult); - } +// // DocBook to FO +// byte[] foBytes; +// try (ByteArrayOutputStream out = new ByteArrayOutputStream();) { +// Result xmlOutput = new StreamResult(out); +// Transformer docBookTransformer = docBoookFoTemplates.newTransformer(); +// docBookTransformer.transform(xmlInput, xmlOutput); +// foBytes = out.toByteArray(); +// } +// +// // FO to PDF +// try (InputStream foIn = new ByteArrayInputStream(foBytes)) { +// Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream()); +// Transformer fopTransformer = transformerFactory.newTransformer(); // identity +// Source src = new StreamSource(foIn); +// Result fopResult = new SAXResult(fop.getDefaultHandler()); +// fopTransformer.transform(src, fopResult); +// } +// + + Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream()); + Transformer docBookTransformer = getDocBoookFoTemplates().newTransformer(); + Result fopResult = new SAXResult(fop.getDefaultHandler()); + docBookTransformer.transform(xmlInput, fopResult); } else { Result xmlOutput = new StreamResult(resp.getOutputStream()); resp.setContentType("text/html"); - Transformer docBookTransformer = docBoookHtmlTemplates.newTransformer(); + Transformer docBookTransformer = getDocBoookHtmlTemplates().newTransformer(); // gather CSS if (cmsTheme != null) { @@ -220,7 +231,7 @@ public class DbkServlet extends HttpServlet { public void init() throws ServletException { // TODO improve configuration and provisioning of DocBook XSL - String xslBase = System.getProperty("argeo.docbook.xsl"); + xslBase = System.getProperty("argeo.docbook.xsl"); if (xslBase == null) { // We need namespace aware XSL! // Fedora (sudo dnf install docbook5-style-xsl) @@ -228,8 +239,8 @@ public class DbkServlet extends HttpServlet { if (!Files.exists(Paths.get(defaultXslBase))) { 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."); + log.error("System property argeo.docbook.xsl is not set and default location " + defaultXslBase + + " does not exist."); } } xslBase = defaultXslBase; @@ -240,18 +251,15 @@ public class DbkServlet extends HttpServlet { 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(); - - String htmlXsl = xslBase + "/html/docbook.xsl"; - docBoookHtmlTemplates = createDocBookTemplates(htmlXsl); - String foXsl = xslBase + "/fo/docbook.xsl"; - docBoookFoTemplates = createDocBookTemplates(foXsl); } protected Templates createDocBookTemplates(String xsl) { try { + if (transformerFactory == null) { + // We must explicitly use the non-XSLTC transformer, as XSLTC is not working + // with DocBook stylesheets + transformerFactory = new TransformerFactoryImpl(); + } Source xslSource = new StreamSource(xsl); Templates templates = transformerFactory.newTemplates(xslSource); if (templates == null) @@ -263,6 +271,22 @@ public class DbkServlet extends HttpServlet { } + protected Templates getDocBoookHtmlTemplates() { + if (docBoookHtmlTemplates == null) { + String htmlXsl = xslBase + "/html/docbook.xsl"; + docBoookHtmlTemplates = createDocBookTemplates(htmlXsl); + } + return docBoookHtmlTemplates; + } + + protected Templates getDocBoookFoTemplates() { + if (docBoookFoTemplates == null) { + String foXsl = xslBase + "/fo/docbook.xsl"; + docBoookFoTemplates = createDocBookTemplates(foXsl); + } + return docBoookFoTemplates; + } + public void setRepository(Repository repository) { this.repository = repository; }