Templates mit jdk.httpserver nutzen
ulrich
2021-07-07 73eed012df8d842738f64dc45ce5f13aad788b5e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
  Helix - Dateiverwaltung
  Copyright (C) 2021  Ulrich Hilger
 
  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 <https://www.gnu.org/licenses/>.
 */
package de.uhilger.httpserver.template;
 
import com.github.mustachejava.Mustache;
import com.github.mustachejava.MustacheFactory;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.httpserver.base.HttpHelper;
import de.uhilger.httpserver.base.HttpResponder;
import de.uhilger.httpserver.base.handler.FileHandler;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Map;
import java.util.logging.Logger;
 
/**
 * Der TemplateActor rendert den Inhalt einer Map in 
 * ein Mustache-Template und gibt das Ergebnis zurueck.
 * 
 * @author Ulrich Hilger
 * @version 1, 04.07.2021
 */
public class TemplateActor {
  
  private static final Logger logger = Logger.getLogger(TemplateActor.class.getName());  
  
  public static final String STR_DOT = ".";
  public static final String STR_EMPTY = "";
  public static final String STR_SLASH = "/";
  
  //public static final String ATTR_TEMPLATE = "template";
  
  //public static final String WELCOME_FILE = "index.htmi";
  
  /**
   * Eine HTTP-Anfrage bearbeiten
   * 
   * Erfordert den Namen des Templates im Attribut TemplateActor.ATTR_TEMPLATE
   * 
   * Wenn im HttpContext das Attribut FileHandler.ATTR_FILE_BASE vorhanden ist, 
   * wird dessen Inhalt als Basis-Ordner für das zu verwendende Template genutzt. 
   * Anderenfalls wird das Template im Classpath gesucht.
   * 
   * @param exchange  die Anfrage und -Antwort-Infos der HTTP-Anfrage
   * @param data die Map mit den variablen Inhalten des Templates
   * @return das ausgefuellte Template
   * @throws IOException 
   */
  public String render(HttpExchange exchange, Map data, String template) throws IOException {
    MustacheFactory mf;
    Mustache m;
    HttpHelper helper = new HttpHelper();
    Map attributes = exchange.getHttpContext().getAttributes();
    String fileBase = helper.getAttrStr(attributes, FileHandler.ATTR_FILE_BASE, STR_EMPTY);
    File fileRoot = new File(fileBase);    
    logger.fine("fileRoot: " + fileRoot.getAbsolutePath());
    //String template = helper.getAttrStr(attributes, ATTR_TEMPLATE, STR_EMPTY);
    File templateFile = new File(fileRoot, template);
    if(templateFile.exists()) {
      logger.fine("using template " + templateFile.getAbsolutePath());
      mf = new NeonMustacheFactory(fileRoot);
      m = mf.compile(template);
    } else {
      logger.fine("template " + templateFile.getAbsolutePath() + " not found");
      mf = new NeonMustacheFactory();
      m = mf.compile(template);
    }
    StringWriter writer = new StringWriter();
    m.execute(writer, data).flush();    
    return writer.toString();    
  }
  
}