From 828ffa35841a585ddeeac9d934e3a4951e1702c0 Mon Sep 17 00:00:00 2001 From: ulrich Date: Mon, 28 Dec 2020 09:53:39 +0000 Subject: [PATCH] Von DefaultServlet auf HttpServlet umgestellt --- src/de/uhilger/wbx/web/AdocServlet.java | 170 +++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 105 insertions(+), 65 deletions(-) diff --git a/src/de/uhilger/wbx/web/AdocServlet.java b/src/de/uhilger/wbx/web/AdocServlet.java index 5ab61c9..a80ba5c 100644 --- a/src/de/uhilger/wbx/web/AdocServlet.java +++ b/src/de/uhilger/wbx/web/AdocServlet.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.HashMap; @@ -30,9 +31,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; +import javax.servlet.ServletOutputStream; import static org.asciidoctor.Asciidoctor.Factory.create; import org.asciidoctor.Asciidoctor; +import static org.asciidoctor.AttributesBuilder.attributes; +import static org.asciidoctor.OptionsBuilder.options; +import org.asciidoctor.SafeMode; @@ -40,7 +45,7 @@ * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) * zu HTML-Seiten und PDF-Dokumenten * - * ?pdf=true im URL fuegt PDF-Ausgabe hinzu + * Mit Angabe des Parameters ?pdf=true im URL wird PDF erzeugt, andernfalls HTML */ public class AdocServlet extends HttpServlet { @@ -50,88 +55,123 @@ private static final String SERVLET_NAME = "AdocServlet"; /** - * Processes requests for both HTTP <code>GET</code> and <code>POST</code> - * methods. + * Die Methode processRequest verarbeitet HTTP-Anfragen des Typs + * <code>GET</code> und <code>POST</code>. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setContentType("text/html;charset=UTF-8"); - try (PrintWriter out = response.getWriter()) { - // Asciidoc-Quelldatei aus HTTP-Request ermitteln - String vPath = request.getServletPath(); - String absname = getServletContext().getRealPath(vPath); - File adocfile = new File(absname); - - // HTML-Datei ermitteln - String nameext = adocfile.getName(); - String fname = nameext.substring(0, nameext.lastIndexOf(DOT)); - File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML); - - /* - nach HTML transformieren, wenn die Quelle sich geandert hat oder - die HTML-Datei noch nicht existiert - */ - if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) { - transform(absname); + // Asciidoc-Quelldatei aus HTTP-Request ermitteln + String vPath = request.getServletPath(); + String absname = getServletContext().getRealPath(vPath); + File adocfile = new File(absname); + + // HTML-Datei ermitteln + String nameext = adocfile.getName(); + String fname = nameext.substring(0, nameext.lastIndexOf(DOT)); + File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML); + File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben + response.setCharacterEncoding("UTF-8"); + + /* + nach HTML transformieren, wenn die Quelle sich geandert hat oder + die HTML-Datei noch nicht existiert + */ + if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) { + transform(absname); + } + + /* + nach PDF transformieren, wenn der Parameter pdf=true existiert und + wenn die Quelle sich geandert hat oder + die PDF-Datei noch nicht existiert + */ + + String pdf = request.getParameter(PDF); + if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) { + File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF); + outfile = pdffile; // PDF soll zurueckgegeben werden + if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) { + response.setContentType("application/pdf"); + transform(absname, PDF); } - - /* - nach PDF transformieren, wenn der Parameter pdf=true existiert und - wenn die Quelle sich geandert hat oder - die PDF-Datei noch nicht existiert - */ - String pdf = request.getParameter(PDF); - if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) { - File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF); - if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) { - transform(absname, PDF); - } + ServletOutputStream os = response.getOutputStream(); + InputStream bytes = new FileInputStream(outfile); + int b = bytes.read(); + while(b > -1 ) { + os.write(b); + b = bytes.read(); } - - // HTML-Datei ausgeben - FileInputStream in = new FileInputStream(htmlfile); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - String line; - while ((line = reader.readLine()) != null) { - out.println(line); - } + } else { + PrintWriter out = response.getWriter(); + InputStreamReader in = new InputStreamReader(new FileInputStream(outfile), "UTF-8"); + in.transferTo(out); } } + /** + * Nach HTML transformieren + * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe + */ private void transform(String fileName) { transform(fileName, null); } + /** + * In ein Format transformieren, das von einem 'Backend' von Asciidoctor + * unterstuetzt wird + * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe + * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn + * nach PDF transformiert werden soll + */ private void transform(String fileName, String backend) { - Map<String, Object> attributes = new HashMap<>(); - attributes.put("no_footer", false); - attributes.put("source_highlighter", "highlightjs"); - - Map<String, Object> options = new HashMap<>(); - options.put("attributes", attributes); - options.put("in_place", false); + Map<String, Object> attributes; + File outFile = new File(fileName); + String thisDirName = outFile.getParent(); + File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml"); + if(pdfStyles.exists()) { + attributes = attributes() + .attribute("pdf-themesdir", thisDirName) + .attribute("pdf-theme","custom") + .attribute("pdf-fontsdir", thisDirName + "/fonts") + .attribute("allow-uri-read") + .sourceHighlighter("highlightjs") + .asMap(); + } else { + attributes = attributes() + .sourceHighlighter("highlightjs") + .asMap(); + } + Map<String, Object> options; if(null != backend) { - options.put("backend", backend); + options = options().inPlace(false) + .safe(SafeMode.SERVER) + .backend(backend).attributes(attributes).asMap(); + + } else { + options = options().inPlace(false) + .safe(SafeMode.SERVER) + .attributes(attributes).asMap(); } Asciidoctor asciidoctor = create(); + asciidoctor.requireLibrary("asciidoctor-diagram"); asciidoctor.convertFile(new File(fileName), options); } /** - * Handles the HTTP <code>GET</code> method. + * Die HTTP-<code>GET</code>-Methode verarbeiten. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) @@ -140,12 +180,12 @@ } /** - * Handles the HTTP <code>POST</code> method. + * Die HTTP-<code>POST</code>-Methode verarbeiten. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) @@ -154,9 +194,9 @@ } /** - * Returns a short description of the servlet. + * Eine Kurzbeschreibung des Servlets ausgeben. * - * @return a String containing servlet description + * @return einen String mit der Kurzbeschreibung des Servlets */ @Override public String getServletInfo() { -- Gitblit v1.9.3