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 |  115 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 76 insertions(+), 39 deletions(-)

diff --git a/src/de/uhilger/wbx/web/AdocServlet.java b/src/de/uhilger/wbx/web/AdocServlet.java
index 6f9d7d7..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,13 +55,13 @@
   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 
@@ -72,8 +77,8 @@
     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.setContentType("text/html;charset=UTF-8");
-
+    response.setCharacterEncoding("UTF-8");
+    
     /*
       nach HTML transformieren, wenn die Quelle sich geandert hat oder 
       die HTML-Datei noch nicht existiert
@@ -87,54 +92,86 @@
       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
-      response.setContentType("application/pdf;charset=UTF-8");
       if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
+        response.setContentType("application/pdf");
         transform(absname, PDF);
       }
-    }
-      
-    try (PrintWriter out = response.getWriter()) {
-      // abhaengig vom Parameter pdf HTML- oder PDF-Datei ausgeben
-      FileInputStream in = new FileInputStream(outfile);
-      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-      String line;
-      while ((line = reader.readLine()) != null) {
-        out.println(line);
+      ServletOutputStream os = response.getOutputStream();
+      InputStream bytes = new FileInputStream(outfile);
+      int b = bytes.read();
+      while(b > -1 ) {
+        os.write(b);
+        b = bytes.read();
       }
+    } 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)
@@ -143,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)
@@ -157,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