/* 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 . */ 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 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; /** * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) * zu HTML-Seiten * */ public class AdocServlet extends HttpServlet { private static final String DOT = "."; private static final String HTMLEXT = ".html"; /** * Processes requests for both HTTP GET and POST * 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 + HTMLEXT); /* transformieren, wenn die Quelle sich geandert hat oder die HTML-Datei noch nicht existiert */ if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) { transform(absname); } 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 absoluteFileName) { Asciidoctor asciidoctor = create(); Map attributes = attributes() .noFooter(false) //.tableOfContents(true) //.sectionNumbers(true) .asMap(); Map options = options().inPlace(false) .attributes(attributes) .asMap(); asciidoctor.convertFile(new File(absoluteFileName), options); } private void test(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { /* TODO output your page here. You may use following sample code. */ out.println(""); out.println(""); out.println(""); out.println("Servlet AdocServlet"); out.println(""); out.println(""); out.println("

Servlet AdocServlet at " + request.getContextPath() + "

"); out.println("

request.getRequestURI(): " + request.getRequestURI() + "

"); out.println("

request.getRequestURL(): " + request.getRequestURL() + "

"); out.println("

request.getServletPath(): " + request.getServletPath() + "

"); out.println("

request.getPathInfo(): " + request.getPathInfo() + "

"); String vPath = request.getServletPath(); out.println("

vPath: " + vPath); out.println("

getServletContext().getRealPath(vPath): " + getServletContext().getRealPath(vPath) + "

"); out.println(""); out.println(""); } } // /** * Handles the HTTP GET 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 POST 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 "AdocServlet"; }// }