WebBox Klassenbibliothek
ulrich@undisclosed
2020-04-20 70be19081e67ce8013bacc1d778629d09867f882
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;
27 import javax.servlet.ServletException;
28 import javax.servlet.http.HttpServlet;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31 import java.util.Map;
32
33 import static org.asciidoctor.AttributesBuilder.attributes;
34 import static org.asciidoctor.OptionsBuilder.options;
35 import static org.asciidoctor.Asciidoctor.Factory.create;
36 import org.asciidoctor.Asciidoctor;
37
38
39
40 /**
41  * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) 
70be19 42  * zu HTML-Seiten und PDF-Dokumenten
1385d2 43  */
U 44 public class AdocServlet extends HttpServlet  {
45   
46   private static final String DOT = ".";
47   private static final String HTMLEXT = ".html";
70be19 48   private static final String PDFEXT = ".pdf";
U 49   private static final String PDF = "pdf";
50   private static final String SERVLET_NAME = "AdocServlet";
1385d2 51   
U 52   /**
53    * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
54    * methods.
55    *
56    * @param request servlet request
57    * @param response servlet response
58    * @throws ServletException if a servlet-specific error occurs
59    * @throws IOException if an I/O error occurs
60    */
61   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
62           throws ServletException, IOException 
63   {
64     response.setContentType("text/html;charset=UTF-8");
65     try (PrintWriter out = response.getWriter()) {
66
67       // Asciidoc-Quelldatei aus HTTP-Request ermitteln
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 + HTMLEXT);
76       
77       /*
78         transformieren, wenn die Quelle sich geandert hat oder 
79         die HTML-Datei noch nicht existiert
80       */
81       if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
70be19 82         transform(absname, htmlfile);
U 83       }
84    
85       String pdf = request.getParameter(PDF);
86       if(null != pdf && pdf.length() > 0 && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
87         File pdffile = new File(adocfile.getParentFile(), fname + PDFEXT);
88         if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
89           transform(absname, pdffile);
90         }
1385d2 91       }
U 92       
70be19 93       // HTML-Datei ausgeben
1385d2 94       FileInputStream in = new FileInputStream(htmlfile);
U 95       BufferedReader reader = new BufferedReader(new InputStreamReader(in));
96       String line;
97       while ((line = reader.readLine()) != null) {
98         out.println(line);
99       }
100     }
101   }
102   
70be19 103   private void transform(String absoluteFileName, File target) {
U 104     Map<String, Object> options = null;
105     Map<String, Object> attributes;
1385d2 106     Asciidoctor asciidoctor = create();    
70be19 107     String fname = target.getName().toLowerCase();
U 108     
109     if(fname.endsWith(HTMLEXT)) {
110       attributes = attributes().noFooter(false)
111                                 .sourceHighlighter("highlightjs")                                        
112                                 //.tableOfContents(true) 
113                                 //.sectionNumbers(true)
114                                 .asMap();
115       options = options().inPlace(false)
116                                 .attributes(attributes) 
117                                 .asMap();     
118     } else if(fname.endsWith(PDFEXT)) {
119       attributes = attributes().noFooter(false)
120                                 .asMap();
121       options = options().inPlace(false)
122                           .attributes(attributes) 
123                           .backend("pdf")
124                           .asMap();     
125     }
126     asciidoctor.convertFile(new File(absoluteFileName), options);    
1385d2 127   }  
U 128
129   /**
130    * Handles the HTTP <code>GET</code> method.
131    *
132    * @param request servlet request
133    * @param response servlet response
134    * @throws ServletException if a servlet-specific error occurs
135    * @throws IOException if an I/O error occurs
136    */
137   @Override
138   protected void doGet(HttpServletRequest request, HttpServletResponse response)
139           throws ServletException, IOException {
140     processRequest(request, response);
141   }
142
143   /**
144    * Handles the HTTP <code>POST</code> method.
145    *
146    * @param request servlet request
147    * @param response servlet response
148    * @throws ServletException if a servlet-specific error occurs
149    * @throws IOException if an I/O error occurs
150    */
151   @Override
152   protected void doPost(HttpServletRequest request, HttpServletResponse response)
153           throws ServletException, IOException {
154     processRequest(request, response);
155   }
156
157   /**
158    * Returns a short description of the servlet.
159    *
160    * @return a String containing servlet description
161    */
162   @Override
163   public String getServletInfo() {
70be19 164     return SERVLET_NAME;
U 165   }
1385d2 166
U 167 }