Extract JCR in a separate bundle
[gpl/argeo-suite.git] / org.argeo.app.servlet.publish / src / org / argeo / app / servlet / publish / DbkServlet.java
index d3459cf73a6514446cb9d4491a6095bf70784505..246a0c20f5d88b9362599a8fc2f6b0b34a51c3a0 100644 (file)
@@ -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<String, CmsTheme> 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;
        }