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.site.renderer;
35
36 import info.magnolia.beanmerger.BeanMergerUtil;
37 import info.magnolia.config.registry.Registry;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.jcr.util.NodeUtil;
40 import info.magnolia.module.site.Site;
41 import info.magnolia.module.site.SiteManager;
42 import info.magnolia.module.site.templates.FallbackTemplateDefinition;
43 import info.magnolia.rendering.context.RenderingContext;
44 import info.magnolia.rendering.engine.RenderException;
45 import info.magnolia.rendering.renderer.Renderer;
46 import info.magnolia.rendering.renderer.registry.RendererRegistry;
47 import info.magnolia.rendering.template.RenderableDefinition;
48
49 import java.util.Map;
50
51 import javax.inject.Inject;
52 import javax.jcr.Node;
53 import javax.jcr.RepositoryException;
54
55 import org.apache.jackrabbit.commons.JcrUtils;
56
57
58
59
60 public class SiteAwareRendererWrapper implements Renderer {
61
62 private final SiteManager siteManager;
63 private final FallbackTemplateDefinition fallbackTemplateDefinition;
64 private final RendererRegistry rendererRegistry;
65
66 private String wrappedRendererType;
67
68 @Inject
69 public SiteAwareRendererWrapper(SiteManager siteManager, FallbackTemplateDefinition fallbackTemplateDefinition, RendererRegistry rendererRegistry) {
70 this.siteManager = siteManager;
71 this.fallbackTemplateDefinition = fallbackTemplateDefinition;
72 this.rendererRegistry = rendererRegistry;
73 }
74
75 @Override
76 public void render(final RenderingContext renderingCtx, Map<String, Object> contextObjects) throws RenderException {
77 Node content = renderingCtx.getCurrentContent();
78
79 try {
80 RenderableDefinition renderableDefinition = renderingCtx.getRenderableDefinition();
81
82
83 if (content != null && NodeUtil.isNodeType(content, NodeTypes.Page.NAME)) {
84 final Site site = getSite(content);
85
86 renderableDefinition = BeanMergerUtil.merge(renderableDefinition, site.getTemplates().getPrototype(), fallbackTemplateDefinition.getFallbackTemplateDefinition());
87 }
88
89 renderingCtx.push(content, renderableDefinition);
90
91 try {
92 rendererRegistry.getProvider(wrappedRendererType).get().render(renderingCtx, contextObjects);
93 } catch (Registry.NoSuchDefinitionException e) {
94 throw new RenderException("Render type '" + wrappedRendererType + "' does not exist.", e);
95 } finally {
96 renderingCtx.pop();
97 }
98 } catch (RepositoryException e) {
99 throw new RenderException(String.format("Could not determine node type of node [%s]", content), e);
100 }
101 }
102
103 protected Site getSite(Node node) {
104 final Site site = siteManager.getAssignedSite(node);
105 if (site == null) {
106 throw new IllegalStateException("No site configuration found for [" + JcrUtils.toString(node) + "]");
107 }
108 return site;
109 }
110
111 public String getWrappedRendererType() {
112 return wrappedRendererType;
113 }
114
115 public void setWrappedRendererType(String wrappedRendererType) {
116 this.wrappedRendererType = wrappedRendererType;
117 }
118 }