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=246a0c20f5d88b9362599a8fc2f6b0b34a51c3a0;hb=d6c9d33b61e475914d3f8d7534374ed30eca8150;hp=d3459cf73a6514446cb9d4491a6095bf70784505;hpb=21f71ef7f7a823f26fb75c70568579d922f4cb36;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 d3459cf..246a0c2 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 @@ -42,10 +42,10 @@ import javax.xml.transform.stream.StreamSource; 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.app.jcr.docbook.DbkJcrUtils; import org.argeo.cms.auth.RemoteAuthUtils; import org.argeo.cms.servlet.ServletHttpRequest; import org.argeo.jcr.Jcr; @@ -53,12 +53,16 @@ import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.w3c.dom.Document; +import net.sf.saxon.BasicTransformerFactory; + /** * 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 CmsLog log = CmsLog.getLog(DbkServlet.class); + private Repository repository; private DocumentBuilderFactory documentBuilderFactory; @@ -70,6 +74,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 { @@ -110,7 +116,7 @@ public class DbkServlet extends HttpServlet { if (node.hasNode(DbkType.article.get())) { Node dbkNode = node.getNode(DbkType.article.get()); - if (DbkUtils.isDbk(dbkNode)) { + if (DbkJcrUtils.isDbk(dbkNode)) { CmsTheme cmsTheme = null; String themeId = req.getParameter("themeId"); if (themeId != null) { @@ -139,7 +145,7 @@ 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"); @@ -161,16 +167,16 @@ public class DbkServlet extends HttpServlet { // fopTransformer.transform(src, fopResult); // } // - + Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream()); - Transformer docBookTransformer = docBoookFoTemplates.newTransformer(); + 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) { @@ -226,7 +232,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) @@ -234,8 +240,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; @@ -246,18 +252,16 @@ 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) { + transformerFactory = new BasicTransformerFactory(); + // 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) @@ -269,6 +273,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; }