/*
|
WebBox - Dein Server.
|
Copyright (C) 2020 Ulrich Hilger, http://uhilger.de
|
|
This program is free software: you can redistribute it and/or modify
|
it under the terms of the GNU Affero General Public License as
|
published by the Free Software Foundation, either version 3 of the
|
License, or (at your option) any later version.
|
|
This program is distributed in the hope that it will be useful,
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
GNU Affero General Public License for more details.
|
|
You should have received a copy of the GNU Affero General Public License
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
|
package de.uhilger.wbx.web;
|
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.io.PrintWriter;
|
import java.util.HashMap;
|
import javax.servlet.ServletException;
|
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.util.Map;
|
|
import static org.asciidoctor.AttributesBuilder.attributes;
|
import static org.asciidoctor.OptionsBuilder.options;
|
import static org.asciidoctor.Asciidoctor.Factory.create;
|
import org.asciidoctor.Asciidoctor;
|
import org.asciidoctor.OptionsBuilder;
|
|
|
|
/**
|
* Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc)
|
* zu HTML-Seiten und PDF-Dokumenten
|
*
|
* ?pdf=true im URL fuegt PDF-Ausgabe hinzu
|
*/
|
public class AdocServlet extends HttpServlet {
|
|
private static final String DOT = ".";
|
private static final String HTML = "html";
|
private static final String PDF = "pdf";
|
private static final String SERVLET_NAME = "AdocServlet";
|
|
/**
|
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
|
* methods.
|
*
|
* @param request servlet request
|
* @param response servlet response
|
* @throws ServletException if a servlet-specific error occurs
|
* @throws IOException if an I/O error occurs
|
*/
|
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);
|
}
|
|
/*
|
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.length() > 0 && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
|
File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
|
if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
|
transform(absname, PDF);
|
}
|
}
|
|
// 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);
|
}
|
}
|
}
|
|
private void transform(String fileName) {
|
transform(fileName, null);
|
}
|
|
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);
|
if(null != backend) {
|
options.put("backend", backend);
|
}
|
|
Asciidoctor asciidoctor = create();
|
asciidoctor.convertFile(new File(fileName), options);
|
}
|
|
/**
|
* Handles the HTTP <code>GET</code> method.
|
*
|
* @param request servlet request
|
* @param response servlet response
|
* @throws ServletException if a servlet-specific error occurs
|
* @throws IOException if an I/O error occurs
|
*/
|
@Override
|
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
throws ServletException, IOException {
|
processRequest(request, response);
|
}
|
|
/**
|
* Handles the HTTP <code>POST</code> method.
|
*
|
* @param request servlet request
|
* @param response servlet response
|
* @throws ServletException if a servlet-specific error occurs
|
* @throws IOException if an I/O error occurs
|
*/
|
@Override
|
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
throws ServletException, IOException {
|
processRequest(request, response);
|
}
|
|
/**
|
* Returns a short description of the servlet.
|
*
|
* @return a String containing servlet description
|
*/
|
@Override
|
public String getServletInfo() {
|
return SERVLET_NAME;
|
}
|
|
}
|