From d4d7d01337ead36932642850c579ced9ad158fe5 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 13 Jun 2021 17:18:07 +0200 Subject: [PATCH] Introduce DocBook XSL servlet. --- dep/org.argeo.suite.dep.ui.rap/pom.xml | 8 +- .../OSGI-INF/dbkServlet.xml | 10 ++ .../OSGI-INF/htmlServletContext.xml | 9 ++ publishing/org.argeo.publishing.ui/bnd.bnd | 3 + .../argeo/publishing/servlet/DbkServlet.java | 131 ++++++++++++++++++ .../publishing/ui/DocumentUiProvider.java | 4 + 6 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml create mode 100644 publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml create mode 100644 publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml index 66d2a8c..20b5f1b 100644 --- a/dep/org.argeo.suite.dep.ui.rap/pom.xml +++ b/dep/org.argeo.suite.dep.ui.rap/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 org.argeo.suite @@ -107,6 +109,10 @@ org.argeo.tp.javax javax.xml.bind + + org.argeo.tp.apache + org.apache.xerces + 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 index 0000000..b2caa7b --- /dev/null +++ b/publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml @@ -0,0 +1,10 @@ + + + + + + + + "/> + + 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 index 0000000..e0c1f6b --- /dev/null +++ b/publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/publishing/org.argeo.publishing.ui/bnd.bnd b/publishing/org.argeo.publishing.ui/bnd.bnd index a2a5f70..30b13d8 100644 --- a/publishing/org.argeo.publishing.ui/bnd.bnd +++ b/publishing/org.argeo.publishing.ui/bnd.bnd @@ -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 index 0000000..fe4ca32 --- /dev/null +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java @@ -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; + } + +} diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java index a2a4977..1170765 100644 --- a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java +++ b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java @@ -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()); -- 2.30.2