WebBox Klassenbibliothek
ulrich
2020-04-16 1385d2dd22c7bf8189c68a876037779555a22443
Asciidoctor Servlet eingebaut
1 files added
174 ■■■■■ changed files
src/de/uhilger/wbx/web/AdocServlet.java 174 ●●●●● patch | view | raw | blame | history
src/de/uhilger/wbx/web/AdocServlet.java
New file
@@ -0,0 +1,174 @@
/*
    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 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 <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 + 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<String, Object> attributes = attributes()
                                        .noFooter(false)
                                        //.tableOfContents(true)
                                        //.sectionNumbers(true)
                                        .asMap();
    Map<String, Object> 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("<!DOCTYPE html>");
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet AdocServlet</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h1>Servlet AdocServlet at " + request.getContextPath() + "</h1>");
      out.println("<p>request.getRequestURI(): " + request.getRequestURI() + "</p>");
      out.println("<p>request.getRequestURL(): " + request.getRequestURL() + "</p>");
      out.println("<p>request.getServletPath(): " + request.getServletPath() + "</p>");
      out.println("<p>request.getPathInfo(): " + request.getPathInfo() + "</p>");
      String vPath = request.getServletPath();
      out.println("<p>vPath: " + vPath);
      out.println("<p>getServletContext().getRealPath(vPath): " +
              getServletContext().getRealPath(vPath) + "</p>");
      out.println("</body>");
      out.println("</html>");
    }
  }
  // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
  /**
   * 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 "AdocServlet";
  }// </editor-fold>
}