WebBox Klassenbibliothek
ulrich@undisclosed
2020-04-22 d572ec8e5807f9431bfebcad8110972de2da53a7
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;
36
37
38
39 /**
40  * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) 
70be19 41  * zu HTML-Seiten und PDF-Dokumenten
d8a1ab 42  * 
d572ec 43  * Mit Angabe des Parameters ?pdf=true im URL wird PDF erzeugt, andernfalls HTML
1385d2 44  */
U 45 public class AdocServlet extends HttpServlet  {
46   
47   private static final String DOT = ".";
3bbfbc 48   private static final String HTML = "html";
70be19 49   private static final String PDF = "pdf";
U 50   private static final String SERVLET_NAME = "AdocServlet";
1385d2 51   
U 52   /**
d572ec 53    * Die Methode processRequest verarbeitet HTTP-Anfragen des Typs  
U 54    * <code>GET</code> und <code>POST</code>.
1385d2 55    *
d572ec 56    * @param request die Servlet-Anfrage
U 57    * @param response die Servlet-Antwort
58    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
59    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 60    */
U 61   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
62           throws ServletException, IOException 
63   {
64
a22ef6 65     // Asciidoc-Quelldatei aus HTTP-Request ermitteln
U 66     String vPath = request.getServletPath();
67     String absname = getServletContext().getRealPath(vPath);
68     File adocfile = new File(absname);
69
70     // HTML-Datei ermitteln
71     String nameext = adocfile.getName();
72     String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
73     File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML);
74     File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben
75     response.setContentType("text/html;charset=UTF-8");
76
77     /*
78       nach HTML transformieren, wenn die Quelle sich geandert hat oder 
79       die HTML-Datei noch nicht existiert
80     */
81     if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
82       transform(absname);
83     }
84
85     /*
86       nach PDF transformieren, wenn der Parameter pdf=true existiert und 
87       wenn die Quelle sich geandert hat oder 
88       die PDF-Datei noch nicht existiert
89     */
90     String pdf = request.getParameter(PDF);
91     if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
92       File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
93       outfile = pdffile; // PDF soll zurueckgegeben werden
94       response.setContentType("application/pdf;charset=UTF-8");
95       if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
96         transform(absname, PDF);
70be19 97       }
a22ef6 98     }
1385d2 99       
a22ef6 100     try (PrintWriter out = response.getWriter()) {
U 101       // abhaengig vom Parameter pdf HTML- oder PDF-Datei ausgeben
102       FileInputStream in = new FileInputStream(outfile);
1385d2 103       BufferedReader reader = new BufferedReader(new InputStreamReader(in));
U 104       String line;
105       while ((line = reader.readLine()) != null) {
106         out.println(line);
107       }
108     }
109   }
110   
d572ec 111   /**
U 112    * Nach HTML transformieren
113    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
114    */
3bbfbc 115   private void transform(String fileName) {
U 116     transform(fileName, null);
1385d2 117   }  
3bbfbc 118   
d572ec 119   /**
U 120    * In ein Format transformieren, das von einem 'Backend' von Asciidoctor 
121    * unterstuetzt wird
122    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
123    * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn 
124    * nach PDF transformiert werden soll
125    */
3bbfbc 126   private void transform(String fileName, String backend) {    
U 127     Map<String, Object> attributes = new HashMap<>();
128     attributes.put("no_footer", false);
129     attributes.put("source_highlighter", "highlightjs");
130
131     Map<String, Object> options = new HashMap<>();
132     options.put("attributes", attributes); 
133     options.put("in_place", false); 
134     if(null != backend) {
135       options.put("backend", backend);
136     }
137     
138     Asciidoctor asciidoctor = create();    
139     asciidoctor.convertFile(new File(fileName), options);    
140   }
1385d2 141
U 142   /**
d572ec 143    * Die HTTP-<code>GET</code>-Methode verarbeiten.
1385d2 144    *
d572ec 145    * @param request die Servlet-Anfrage
U 146    * @param response die Servlet-Antwort
147    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
148    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 149    */
U 150   @Override
151   protected void doGet(HttpServletRequest request, HttpServletResponse response)
152           throws ServletException, IOException {
153     processRequest(request, response);
154   }
155
156   /**
d572ec 157    * Die HTTP-<code>POST</code>-Methode verarbeiten.
1385d2 158    *
d572ec 159    * @param request die Servlet-Anfrage
U 160    * @param response die Servlet-Antwort
161    * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
162    * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
1385d2 163    */
U 164   @Override
165   protected void doPost(HttpServletRequest request, HttpServletResponse response)
166           throws ServletException, IOException {
167     processRequest(request, response);
168   }
169
170   /**
d572ec 171    * Eine Kurzbeschreibung des Servlets ausgeben.
1385d2 172    *
d572ec 173    * @return einen String mit der Kurzbeschreibung des Servlets
1385d2 174    */
U 175   @Override
176   public String getServletInfo() {
70be19 177     return SERVLET_NAME;
U 178   }
1385d2 179
U 180 }