Introduce DocBook XSL servlet.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 13 Jun 2021 15:18:07 +0000 (17:18 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 13 Jun 2021 15:18:07 +0000 (17:18 +0200)
dep/org.argeo.suite.dep.ui.rap/pom.xml
publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml [new file with mode: 0644]
publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml [new file with mode: 0644]
publishing/org.argeo.publishing.ui/bnd.bnd
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java [new file with mode: 0644]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java

index 66d2a8c6444179ce85a5b6f3ea8d51861c0b1c3c..20b5f1b06eb109459fca3a7932092844615525f0 100644 (file)
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.suite</groupId>
                        <groupId>org.argeo.tp.javax</groupId>
                        <artifactId>javax.xml.bind</artifactId>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.apache</groupId>
+                       <artifactId>org.apache.xerces</artifactId>
+               </dependency>
 
                <!-- Jackson JSON processor -->
                <dependency>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml
new file mode 100644 (file)
index 0000000..b2caa7b
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="DocBook Servlet">
+   <implementation class="org.argeo.publishing.servlet.DbkServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/dbk/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=htmlServletContext)"/>"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+</scr:component>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml
new file mode 100644 (file)
index 0000000..e0c1f6b
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
+   <implementation class="org.argeo.cms.servlet.CmsServletContext"/>
+   <service>
+      <provide interface="org.osgi.service.http.context.ServletContextHelper"/>
+   </service>
+   <property name="osgi.http.whiteboard.context.name" type="String" value="htmlServletContext"/>
+   <property name="osgi.http.whiteboard.context.path" type="String" value="/html"/>
+</scr:component>
index a2a5f70ff80a6dfbd0824cf4c23b3844210f1dfc..30b13d813f7d42b68d382e5fc78320830df62dd1 100644 (file)
@@ -1,4 +1,5 @@
 Import-Package:\
+org.osgi.service.http.context,\
 javax.jcr.nodetype,\
 org.osgi.service.event,\
 org.argeo.suite.ui,\
@@ -13,4 +14,6 @@ cms.datamodel; name=docbook; cnd=/org/argeo/docbook/docbook.cnd; abstract=true
 
 Service-Component:\
 OSGI-INF/fontsServlet.xml,\
+OSGI-INF/htmlServletContext.xml,\
+OSGI-INF/dbkServlet.xml,\
 OSGI-INF/documentUiProvider.xml
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java
new file mode 100644 (file)
index 0000000..fe4ca32
--- /dev/null
@@ -0,0 +1,131 @@
+package org.argeo.publishing.servlet;
+
+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 javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl;
+import org.argeo.cms.servlet.ServletAuthUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.w3c.dom.Document;
+
+public class DbkServlet extends HttpServlet {
+       private static final long serialVersionUID = 6906020513498289335L;
+
+       private Repository repository;
+
+       private DocumentBuilderFactory factory;
+       private TransformerFactory transformerFactory;
+       private Templates docBoookTemplates;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               resp.setContentType("text/html; charset=utf-8");
+
+               Session session = null;
+               try {
+                       session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
+
+                       String pathInfo = req.getPathInfo();
+                       if (pathInfo.startsWith("//"))
+                               pathInfo = pathInfo.substring(1);
+                       String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
+
+                       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));
+                       } 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);
+
+//                     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)));
+
+//                     Source xmlInput = new StreamSource(
+//                                     new File("/home/mbaudier/dev/workspaces/argeo-suite/xslt-test/input.xml"));
+//                     Result xmlOutput = new StreamResult(new File("output.html"));
+
+//                     TransformerFactory transformerFactory = new org.apache.xalan.processor.TransformerFactoryImpl();
+                               Transformer transformer = transformerFactory.newTransformer(xsl);
+                               transformer.transform(xmlInput, xmlOutput);
+                               resp.getOutputStream().write(out.toByteArray());
+                       } catch (Exception e) {
+                               throw new ServletException("Cannot transform " + path, e);
+                       }
+               } finally {
+                       Jcr.logout(session);
+               }
+       }
+
+       @Override
+       public void init() throws ServletException {
+               factory = DocumentBuilderFactory.newInstance();
+               factory.setXIncludeAware(true);
+               factory.setNamespaceAware(true);
+               transformerFactory = new SmartTransformerFactoryImpl();
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
index a2a4977276054fb979ca43a72a84c8f8751ee621..11707652c3ee3149d81cfec32d637b8968206d7d 100644 (file)
@@ -6,6 +6,7 @@ import javax.jcr.nodetype.NodeType;
 
 import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsLink;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
 import org.argeo.cms.ui.widgets.ScrolledPage;
@@ -27,6 +28,9 @@ public class DocumentUiProvider implements CmsUiProvider {
                        // Title
                        parent.setLayout(CmsUiUtils.noSpaceGridLayout());
 
+                       CmsLink toHtml = new CmsLink("To HTML", "/html/dbk" + textNode.getPath());
+                       toHtml.createUiPart(parent, context);
+
                        ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
                        page.setLayoutData(CmsUiUtils.fillAll());
                        page.setLayout(CmsUiUtils.noSpaceGridLayout());