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 package info.magnolia.module.templating.paragraphs;
35
36 import freemarker.template.TemplateException;
37 import info.magnolia.module.templating.RenderableDefinition;
38 import info.magnolia.module.templating.RenderingModel;
39 import info.magnolia.cms.core.Content;
40 import info.magnolia.context.MgnlContext;
41 import info.magnolia.freemarker.FreemarkerHelper;
42 import info.magnolia.module.templating.RenderException;
43 import org.apache.commons.lang.exception.ExceptionUtils;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 import javax.servlet.jsp.JspWriter;
48 import java.io.IOException;
49 import java.io.PrintWriter;
50 import java.io.Writer;
51 import java.util.HashMap;
52 import java.util.Locale;
53 import java.util.Map;
54
55
56
57
58
59
60
61
62
63 public class FreemarkerParagraphRenderer extends AbstractParagraphRenderer {
64
65 private static Logger log = LoggerFactory.getLogger(FreemarkerParagraphRenderer.class);
66
67 private final FreemarkerHelper fmHelper;
68
69
70
71
72
73
74 public FreemarkerParagraphRenderer() {
75 this(FreemarkerHelper.getInstance());
76 }
77
78 public FreemarkerParagraphRenderer(FreemarkerHelper fmRenderer) {
79 this.fmHelper = fmRenderer;
80 }
81
82 @Override
83 protected void onRender(Content content, RenderableDefinition definition, Writer out, final Map ctx, String templatePath) throws RenderException {
84 final Locale locale = MgnlContext.getAggregationState().getLocale();
85
86 boolean wrap = false;
87 try {
88 if (out instanceof JspWriter) {
89
90 wrap = true;
91 out = new PrintWriter(out);
92 }
93 log.debug ("About to call FM renderer with {}wrapped writer: {}", wrap? "" : "un", out );
94 fmHelper.render(templatePath, locale, definition.getI18nBasename(), ctx, out);
95
96
97 } catch (TemplateException e) {
98
99
100 }catch (Exception e) {
101 throw new RenderException("Can't render paragraph template " + templatePath + ": " + ExceptionUtils.getRootCauseMessage(e), e);
102 } finally {
103 if (wrap) {
104 try {
105 out.flush();
106 } catch (IOException e) {
107
108 e.printStackTrace();
109 }
110 }
111 }
112 }
113
114 @Override
115 protected Map saveContextState(Map ctx) {
116 Map state = super.saveContextState(ctx);
117 saveAttribute(ctx, state, "params");
118 return state;
119 }
120
121 @Override
122 protected void setupContext(Map ctx, Content content, RenderableDefinition definition, RenderingModel state, Object actionResult) {
123 super.setupContext(ctx, content, definition, state, actionResult);
124 setContextAttribute(ctx, "params", MgnlContext.getParameters());
125 }
126
127 @Override
128 protected Map newContext() {
129 return new HashMap();
130 }
131
132 }