| | |
| | | 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 und PDF-Dokumenten |
| | | * |
| | | * ?pdf=true im URL fuegt PDF-Ausgabe hinzu |
| | | * 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 PDFEXT = ".pdf"; |
| | | 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, htmlfile); |
| | | // 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()) { |
| | | response.setContentType("application/pdf"); |
| | | transform(absname, PDF); |
| | | } |
| | | |
| | | String pdf = request.getParameter(PDF); |
| | | if(null != pdf && pdf.length() > 0 && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) { |
| | | File pdffile = new File(adocfile.getParentFile(), fname + PDFEXT); |
| | | if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) { |
| | | transform(absname, pdffile); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // HTML-Datei ausgeben |
| | | 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); |
| | |
| | | } |
| | | } |
| | | |
| | | private void transform(String absoluteFileName, File target) { |
| | | Map<String, Object> options = null; |
| | | Map<String, Object> attributes; |
| | | Asciidoctor asciidoctor = create(); |
| | | String fname = target.getName().toLowerCase(); |
| | | |
| | | if(fname.endsWith(HTMLEXT)) { |
| | | attributes = attributes().noFooter(false) |
| | | .sourceHighlighter("highlightjs") |
| | | //.tableOfContents(true) |
| | | //.sectionNumbers(true) |
| | | .asMap(); |
| | | options = options().inPlace(false) |
| | | .attributes(attributes) |
| | | .asMap(); |
| | | } else if(fname.endsWith(PDFEXT)) { |
| | | attributes = attributes().noFooter(false) |
| | | .asMap(); |
| | | options = options().inPlace(false) |
| | | .attributes(attributes) |
| | | .backend("pdf") |
| | | .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); |
| | | } |
| | | |
| | | /** |
| | | * 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) { |
| | | Map<String, Object> attributes; |
| | | File outFile = new File(fileName); |
| | | String thisDirName = outFile.getParent(); |
| | | File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml"); |
| | | if(pdfStyles.exists()) { |
| | | attributes = attributes() |
| | | .attribute("pdf-themesdir", thisDirName) |
| | | .attribute("pdf-theme","custom") |
| | | .attribute("pdf-fontsdir", thisDirName + "/fonts") |
| | | .attribute("allow-uri-read") |
| | | .sourceHighlighter("highlightjs") |
| | | .asMap(); |
| | | } else { |
| | | attributes = attributes() |
| | | .sourceHighlighter("highlightjs") |
| | | .asMap(); |
| | | } |
| | | Map<String, Object> options; |
| | | if(null != backend) { |
| | | options = options().inPlace(false) |
| | | .backend(backend).attributes(attributes).asMap(); |
| | | |
| | | } else { |
| | | options = options().inPlace(false) |
| | | .attributes(attributes).asMap(); |
| | | } |
| | | |
| | | Asciidoctor asciidoctor = create(); |
| | | asciidoctor.requireLibrary("asciidoctor-diagram"); |
| | | asciidoctor.convertFile(new File(fileName), options); |
| | | } |
| | | |
| | | /** |
| | | * 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) |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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) |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() { |