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.blossom.view;
35
36 import java.util.Map;
37 import javax.jcr.Node;
38 import javax.servlet.ServletContext;
39 import javax.servlet.http.HttpServletRequest;
40
41 import org.springframework.beans.factory.InitializingBean;
42 import org.springframework.context.MessageSource;
43 import org.springframework.context.MessageSourceAware;
44 import org.springframework.util.ClassUtils;
45 import org.springframework.web.context.ServletContextAware;
46 import org.springframework.web.servlet.support.JstlUtils;
47 import org.springframework.web.servlet.support.RequestContext;
48
49 import info.magnolia.context.MgnlContext;
50 import info.magnolia.module.blossom.render.RenderContext;
51 import info.magnolia.rendering.context.RenderingContext;
52 import info.magnolia.rendering.model.RenderingModel;
53 import info.magnolia.rendering.renderer.ContextAttributeConfiguration;
54 import info.magnolia.rendering.renderer.JspRenderer;
55 import info.magnolia.rendering.template.RenderableDefinition;
56
57
58
59
60
61
62 public class JspTemplateViewRenderer extends JspRenderer implements ServletContextAware, MessageSourceAware, InitializingBean {
63
64 private static final boolean jstlPresent = ClassUtils.isPresent(
65 "javax.servlet.jsp.jstl.core.Config", TemplateViewResolver.class.getClassLoader());
66
67 private ServletContext servletContext;
68 private MessageSource messageSource;
69
70 public void addContextAttribute(String name, Class<?> componentClass) {
71 ContextAttributeConfiguration attributeConfiguration = new ContextAttributeConfiguration();
72 attributeConfiguration.setName(name);
73 attributeConfiguration.setComponentClass(componentClass);
74 addContextAttribute(name, attributeConfiguration);
75 }
76
77 @Override
78 protected void setupContext(Map<String, Object> ctx, Node content, info.magnolia.rendering.template.RenderableDefinition definition, info.magnolia.rendering.model.RenderingModel<?> model, Object actionResult) {
79 super.setupContext(ctx, content, definition, model, actionResult);
80 ctx.putAll(RenderContext.get().getModel());
81 }
82
83 @Override
84 protected void onRender(Node content, info.magnolia.rendering.template.RenderableDefinition definition, RenderingContext renderingCtx, Map<String, Object> ctx, String templateScript) throws info.magnolia.rendering.engine.RenderException {
85
86 if (jstlPresent) {
87 HttpServletRequest request = MgnlContext.getWebContext().getRequest();
88 if (this.messageSource != null) {
89 JstlUtils.exposeLocalizationContext(request, this.messageSource);
90 } else {
91 JstlUtils.exposeLocalizationContext(new RequestContext(request, servletContext));
92 }
93 }
94
95 super.onRender(content, definition, renderingCtx, ctx, templateScript);
96 }
97
98 @Override
99 protected String resolveTemplateScript(Node content, RenderableDefinition definition, RenderingModel<?> model, String actionResult) {
100 return RenderContext.get().getTemplateScript();
101 }
102
103 @Override
104 public void setServletContext(ServletContext servletContext) {
105 this.servletContext = servletContext;
106 }
107
108 @Override
109 public void setMessageSource(MessageSource messageSource) {
110 this.messageSource = messageSource;
111 }
112
113 @Override
114 public void afterPropertiesSet() throws Exception {
115 if (jstlPresent && this.messageSource != null) {
116 this.messageSource = JstlUtils.getJstlAwareMessageSource(servletContext, this.messageSource);
117 }
118 }
119 }