src/main/java/au/id/djc/stringtemplate/webmvc/StringTemplateView.java (2417B) - raw
1 package au.id.djc.stringtemplate.webmvc;
2
3 import java.io.InputStream;
4 import java.io.InputStreamReader;
5 import java.io.PrintWriter;
6 import java.nio.charset.Charset;
7 import java.util.List;
8 import java.util.Locale;
9 import java.util.Map;
10
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.antlr.stringtemplate.StringTemplate;
15 import org.antlr.stringtemplate.StringTemplateErrorListener;
16 import org.antlr.stringtemplate.StringTemplateGroup;
17 import org.antlr.stringtemplate.language.DefaultTemplateLexer;
18 import org.springframework.web.servlet.view.AbstractTemplateView;
19
20 import au.id.djc.stringtemplate.AttributeRenderer;
21
22 public class StringTemplateView extends AbstractTemplateView {
23
24 private String rootTemplateName = "root";
25 private Charset charset = Charset.defaultCharset();
26 private StringTemplateErrorListener errorListener;
27 private List<AttributeRenderer> attributeRenderers;
28
29 public void setRootTemplateName(String rootTemplateName) {
30 this.rootTemplateName = rootTemplateName;
31 }
32
33 public void setCharset(Charset charset) {
34 this.charset = charset;
35 }
36
37 public void setErrorListener(StringTemplateErrorListener errorListener) {
38 this.errorListener = errorListener;
39 }
40
41 public void setAttributeRenderers(List<AttributeRenderer> attributeRenderers) {
42 this.attributeRenderers = attributeRenderers;
43 }
44
45 @Override
46 public boolean checkResource(Locale locale) throws Exception {
47 return getClass().getResourceAsStream(getUrl()) != null;
48 }
49
50 @Override
51 protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
52 throws Exception {
53 InputStream groupStream = getClass().getResourceAsStream(getUrl());
54 StringTemplateGroup templateGroup = new StringTemplateGroup(new InputStreamReader(groupStream, charset),
55 DefaultTemplateLexer.class, errorListener);
56 for (AttributeRenderer attributeRenderer: attributeRenderers) {
57 templateGroup.registerRenderer(attributeRenderer.getTargetClass(), attributeRenderer);
58 }
59 StringTemplate template = templateGroup.getInstanceOf(rootTemplateName);
60 template.setAttributes(model);
61 PrintWriter writer = response.getWriter();
62 writer.print(template);
63 }
64
65 }