WebBox Klassenbibliothek
ulrich
2020-07-21 38929aa1f4f4a017be4d2e93c32165b9e51f635d
src/de/uhilger/wbx/web/AdocServlet.java
@@ -24,64 +24,84 @@
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 static org.asciidoctor.AttributesBuilder.attributes;
import static org.asciidoctor.OptionsBuilder.options;
/**
 * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) 
 * zu HTML-Seiten
 * zu HTML-Seiten und PDF-Dokumenten
 * 
 * Mit Angabe des Parameters ?pdf=true im URL wird PDF erzeugt, andernfalls HTML
 */
public class AdocServlet extends HttpServlet  {
  
  private static final String DOT = ".";
  private static final String HTMLEXT = ".html";
  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.
   * Die Methode processRequest verarbeitet HTTP-Anfragen des Typs
   * <code>GET</code> und <code>POST</code>.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   * @param request die Servlet-Anfrage
   * @param response die Servlet-Antwort
   * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
   * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
   */
  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);
    // 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);
    File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben
    response.setCharacterEncoding("UTF-8");
    /*
      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.equalsIgnoreCase(Boolean.TRUE.toString())) {
      File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
      outfile = pdffile; // PDF soll zurueckgegeben werden
      if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
        transform(absname, PDF);
      }
    }
      
      FileInputStream in = new FileInputStream(htmlfile);
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    try (PrintWriter out = response.getWriter()) {
      // abhaengig vom Parameter pdf HTML- oder PDF-Datei ausgeben
      FileInputStream in = new FileInputStream(outfile);
      BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
      String line;
      while ((line = reader.readLine()) != null) {
        out.println(line);
@@ -89,57 +109,47 @@
    }
  }
  
  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);
  /**
   * Nach HTML transformieren
   * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
   */
  private void transform(String fileName) {
    transform(fileName, null);
  }  
  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>");
  /**
   * In ein Format transformieren, das von einem 'Backend' von Asciidoctor
   * unterstuetzt wird
   * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
   * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn
   * nach PDF transformiert werden soll
   */
  private void transform(String fileName, String backend) {
    File outFile = new File(fileName);
    Map<String, Object> attributes = attributes().attribute("pdf-themesdir", outFile.getParent()).attribute("pdf-theme","test").sourceHighlighter("highlightjs")
                                       .asMap();
    Map<String, Object> options;
    if(null != backend) {
      options = options().inPlace(false)
              .backend(backend).attributes(attributes).asMap();
      
      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>");
    } else {
      options = options().inPlace(false)
              .attributes(attributes).asMap();
    }
    
    Asciidoctor asciidoctor = create();
    asciidoctor.requireLibrary("asciidoctor-diagram");
    asciidoctor.convertFile(new File(fileName), options);
  }
  // <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.
   * Die HTTP-<code>GET</code>-Methode verarbeiten.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   * @param request die Servlet-Anfrage
   * @param response die Servlet-Antwort
   * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
   * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
   */
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
@@ -148,12 +158,12 @@
  }
  /**
   * Handles the HTTP <code>POST</code> method.
   * Die HTTP-<code>POST</code>-Methode verarbeiten.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   * @param request die Servlet-Anfrage
   * @param response die Servlet-Antwort
   * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert
   * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert
   */
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
@@ -162,13 +172,13 @@
  }
  /**
   * Returns a short description of the servlet.
   * Eine Kurzbeschreibung des Servlets ausgeben.
   *
   * @return a String containing servlet description
   * @return einen String mit der Kurzbeschreibung des Servlets
   */
  @Override
  public String getServletInfo() {
    return "AdocServlet";
  }// </editor-fold>
    return SERVLET_NAME;
  }
}