WebBox Klassenbibliothek
ulrich
2020-07-23 f2a70357272c7a2e61f724385e23b4c4fa2e69cb
commit | author | age
1385d2 1 /*
U 2     WebBox - Dein Server.
3     Copyright (C) 2020 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 package de.uhilger.wbx.web;
20
21 import java.io.BufferedReader;
22 import java.io.File;
23 import java.io.FileInputStream;
24 import java.io.IOException;
25 import java.io.InputStreamReader;
26 import java.io.PrintWriter;
3bbfbc 27 import java.util.HashMap;
1385d2 28 import javax.servlet.ServletException;
U 29 import javax.servlet.http.HttpServlet;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32 import java.util.Map;
33
34 import static org.asciidoctor.Asciidoctor.Factory.create;
35 import org.asciidoctor.Asciidoctor;
c5090a 36 import static org.asciidoctor.AttributesBuilder.attributes;
U 37 import static org.asciidoctor.OptionsBuilder.options;
1385d2 38
U 39
40
41 /**
42  * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) 
70be19 43  * zu HTML-Seiten und PDF-Dokumenten
d8a1ab 44  * 
d572ec 45  * Mit Angabe des Parameters ?pdf=true im URL wird PDF erzeugt, andernfalls HTML
1385d2 46  */
U 47 public class AdocServlet extends HttpServlet  {
48   
49   private static final String DOT = ".";
3bbfbc 50   private static final String HTML = "html";
70be19 51   private static final String PDF = "pdf";
U 52   private static final String SERVLET_NAME = "AdocServlet";
1385d2 53   
U 54   /**
d572ec 55    * Die Methode processRequest verarbeitet HTTP-Anfragen des Typs  
U 56    * <code>GET</code> und <code>POST</code>.
1385d2 57    *
d572ec 58    * @param request die Servlet-Anfrage
U 59    * @param response die Servlet-Antwort
60    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
61    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 62    */
U 63   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
64           throws ServletException, IOException 
65   {
66
a22ef6 67     // Asciidoc-Quelldatei aus HTTP-Request ermitteln
U 68     String vPath = request.getServletPath();
69     String absname = getServletContext().getRealPath(vPath);
70     File adocfile = new File(absname);
71
72     // HTML-Datei ermitteln
73     String nameext = adocfile.getName();
74     String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
75     File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML);
76     File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben
0fa5e7 77     response.setCharacterEncoding("UTF-8");
U 78     
a22ef6 79     /*
U 80       nach HTML transformieren, wenn die Quelle sich geandert hat oder 
81       die HTML-Datei noch nicht existiert
82     */
83     if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
84       transform(absname);
85     }
86
87     /*
88       nach PDF transformieren, wenn der Parameter pdf=true existiert und 
89       wenn die Quelle sich geandert hat oder 
90       die PDF-Datei noch nicht existiert
91     */
92     String pdf = request.getParameter(PDF);
93     if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
94       File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
95       outfile = pdffile; // PDF soll zurueckgegeben werden
96       if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
f2a703 97         response.setContentType("application/pdf");
a22ef6 98         transform(absname, PDF);
70be19 99       }
a22ef6 100     }
1385d2 101       
a22ef6 102     try (PrintWriter out = response.getWriter()) {
U 103       // abhaengig vom Parameter pdf HTML- oder PDF-Datei ausgeben
104       FileInputStream in = new FileInputStream(outfile);
132307 105       BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
1385d2 106       String line;
U 107       while ((line = reader.readLine()) != null) {
108         out.println(line);
109       }
110     }
111   }
112   
d572ec 113   /**
U 114    * Nach HTML transformieren
115    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
116    */
3bbfbc 117   private void transform(String fileName) {
U 118     transform(fileName, null);
1385d2 119   }  
3bbfbc 120   
d572ec 121   /**
U 122    * In ein Format transformieren, das von einem 'Backend' von Asciidoctor 
123    * unterstuetzt wird
124    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
125    * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn 
126    * nach PDF transformiert werden soll
127    */
3bbfbc 128   private void transform(String fileName, String backend) {    
e70523 129     Map<String, Object> attributes;
38929a 130     File outFile = new File(fileName);
f2a703 131     String thisDirName = outFile.getParent();
e70523 132     File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml");
U 133     if(pdfStyles.exists()) {
134       attributes = attributes()
f2a703 135               .attribute("pdf-themesdir", thisDirName)
e70523 136               .attribute("pdf-theme","custom")
f2a703 137               .attribute("pdf-fontsdir", thisDirName + "/fonts")
U 138               .attribute("allow-uri-read")
e70523 139               .sourceHighlighter("highlightjs")
U 140               .asMap();
141     } else {
142       attributes = attributes()
143               .sourceHighlighter("highlightjs")
144               .asMap();
145     }
7bee9c 146     Map<String, Object> options;
U 147     if(null != backend) {
148       options = options().inPlace(false)
149               .backend(backend).attributes(attributes).asMap();
150       
151     } else {
152       options = options().inPlace(false)
153               .attributes(attributes).asMap();
154     }
3bbfbc 155     
U 156     Asciidoctor asciidoctor = create();    
16c6c6 157     asciidoctor.requireLibrary("asciidoctor-diagram");
3bbfbc 158     asciidoctor.convertFile(new File(fileName), options);    
U 159   }
1385d2 160
U 161   /**
d572ec 162    * Die HTTP-<code>GET</code>-Methode verarbeiten.
1385d2 163    *
d572ec 164    * @param request die Servlet-Anfrage
U 165    * @param response die Servlet-Antwort
166    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
167    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 168    */
U 169   @Override
170   protected void doGet(HttpServletRequest request, HttpServletResponse response)
171           throws ServletException, IOException {
172     processRequest(request, response);
173   }
174
175   /**
d572ec 176    * Die HTTP-<code>POST</code>-Methode verarbeiten.
1385d2 177    *
d572ec 178    * @param request die Servlet-Anfrage
U 179    * @param response die Servlet-Antwort
180    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
181    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 182    */
U 183   @Override
184   protected void doPost(HttpServletRequest request, HttpServletResponse response)
185           throws ServletException, IOException {
186     processRequest(request, response);
187   }
188
189   /**
d572ec 190    * Eine Kurzbeschreibung des Servlets ausgeben.
1385d2 191    *
d572ec 192    * @return einen String mit der Kurzbeschreibung des Servlets
1385d2 193    */
U 194   @Override
195   public String getServletInfo() {
70be19 196     return SERVLET_NAME;
U 197   }
1385d2 198
U 199 }