Templates mit jdk.httpserver nutzen
ulrich
2021-07-06 a6f1f3292dce4eb1aa7a162e06bf0980b90cb5f8
commit | author | age
5a290d 1 /*
U 2   Helix - Dateiverwaltung
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.template;
19
20 import com.github.mustachejava.Mustache;
21 import com.github.mustachejava.MustacheFactory;
22 import com.sun.net.httpserver.HttpExchange;
23 import de.uhilger.httpserver.base.HttpHelper;
24 import de.uhilger.httpserver.base.HttpResponder;
25 import de.uhilger.httpserver.base.handler.FileHandler;
26 import java.io.File;
27 import java.io.IOException;
28 import java.io.OutputStream;
29 import java.io.StringWriter;
30 import java.util.Map;
31 import java.util.logging.Logger;
32
33 /**
34  * Der TemplateActor rendert den Inhalt einer Map in 
35  * ein Mustache-Template und gibt das Ergebnis zurueck.
36  * 
37  * @author Ulrich Hilger
38  * @version 1, 04.07.2021
39  */
40 public class TemplateActor {
41   
42   private static final Logger logger = Logger.getLogger(TemplateActor.class.getName());  
43   
44   public static final String STR_DOT = ".";
45   public static final String STR_EMPTY = "";
46   public static final String STR_SLASH = "/";
47   
48   public static final String ATTR_TEMPLATE = "template";
49   
50   //public static final String WELCOME_FILE = "index.htmi";
51   
52   /**
53    * Eine HTTP-Anfrage bearbeiten
54    * 
55    * Erfordert den Namen des Templates im Attribut TemplateActor.ATTR_TEMPLATE
56    * 
57    * Wenn im HttpContext das Attribut FileHandler.ATTR_FILE_BASE vorhanden ist, 
58    * wird dessen Inhalt als Basis-Ordner für das zu verwendende Template genutzt. 
59    * Anderenfalls wird das Template im Classpath gesucht.
60    * 
61    * @param exchange  die Anfrage und -Antwort-Infos der HTTP-Anfrage
62    * @param data die Map mit den variablen Inhalten des Templates
63    * @return das ausgefuellte Template
64    * @throws IOException 
65    */
66   public String render(HttpExchange exchange, Map data) throws IOException {
67     MustacheFactory mf;
68     Mustache m;
69     HttpHelper helper = new HttpHelper();
70     Map attributes = exchange.getHttpContext().getAttributes();
71     String fileBase = helper.getAttrStr(attributes, FileHandler.ATTR_FILE_BASE, STR_EMPTY);
72     File fileRoot = new File(fileBase);    
a6f1f3 73     logger.fine("fileRoot: " + fileRoot.getAbsolutePath());
5a290d 74     String template = helper.getAttrStr(attributes, ATTR_TEMPLATE, STR_EMPTY);
U 75     File templateFile = new File(fileRoot, template);
76     if(templateFile.exists()) {
a6f1f3 77       logger.fine("using template " + templateFile.getAbsolutePath());
5a290d 78       mf = new NeonMustacheFactory(fileRoot);
U 79       m = mf.compile(template);
80     } else {
a6f1f3 81       logger.fine("template " + templateFile.getAbsolutePath() + " not found");
5a290d 82       mf = new NeonMustacheFactory();
U 83       m = mf.compile(template);
84     }
85     StringWriter writer = new StringWriter();
86     m.execute(writer, data).flush();    
87     return writer.toString();    
88   }
89   
90 }