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.resources.renderers;
35
36 import info.magnolia.cms.beans.config.ServerConfiguration;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.jcr.util.PropertyUtil;
39 import info.magnolia.module.resources.ResourcesModule;
40 import info.magnolia.objectfactory.Components;
41 import info.magnolia.rendering.context.RenderingContext;
42 import info.magnolia.rendering.engine.RenderException;
43 import info.magnolia.rendering.engine.RenderingEngine;
44 import info.magnolia.rendering.renderer.Renderer;
45 import info.magnolia.rendering.util.AppendableWriter;
46
47 import java.io.IOException;
48 import java.util.Map;
49
50 import javax.inject.Inject;
51 import javax.jcr.Node;
52 import javax.jcr.RepositoryException;
53 import javax.jcr.Session;
54
55 import org.apache.commons.lang3.StringUtils;
56 import org.apache.jackrabbit.commons.JcrUtils;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59
60
61
62
63 public class ReferenceResourceRenderer implements Renderer {
64
65 private static final Logger log = LoggerFactory.getLogger(ReferenceResourceRenderer.class);
66
67 private final RenderingEngine engine;
68 private final ServerConfiguration servConf;
69
70
71
72
73 @Deprecated
74 public ReferenceResourceRenderer() {
75 this(Components.getComponent(RenderingEngine.class), Components.getComponent(ServerConfiguration.class));
76 }
77
78 @Inject
79 public ReferenceResourceRenderer(RenderingEngine renderingEngine, ServerConfiguration servConf) {
80 this.engine = renderingEngine;
81 this.servConf = servConf;
82 }
83
84 @Override
85 public void render(RenderingContext ctx, Map<String, Object> contextObjects) throws RenderException {
86 String logMessage = "";
87 Node content = ctx.getCurrentContent();
88
89 String referencedPath = PropertyUtil.getString(content, "reference");
90 if (referencedPath != null) {
91 Node referencedResource = null;
92 try {
93 Session session = MgnlContext.getJCRSession(ResourcesModule.DEFAULT_WORKSPACE);
94 if (session.nodeExists(referencedPath)) {
95 referencedResource = session.getNode(referencedPath);
96 engine.render(referencedResource, ctx.getOutputProvider());
97 } else {
98 logMessage = "The referenced resource '" + referencedPath + "' does not exist.";
99 log.error(logMessage);
100
101 }
102 } catch (RepositoryException e) {
103 logMessage = "Unable to render referenced resource node ." + JcrUtils.toString(referencedResource);
104 throw new RenderException(logMessage, e);
105 }
106 } else {
107 logMessage = "Reference resource " + JcrUtils.toString(content) + " does not contain any 'reference' property value targeting another resource node.";
108 log.error(logMessage);
109 }
110
111
112 try {
113 if (StringUtils.isNotEmpty(logMessage)) {
114
115 if (servConf.isAdmin()) {
116 AppendableWriter out = ctx.getAppendable();
117 out.append(htmlCommentLogMessage(logMessage));
118 }
119 }
120 } catch (IOException e) {
121 throw new RenderException(logMessage, e);
122 }
123 }
124
125 private String htmlCommentLogMessage(String logMessage) {
126 return "<!-- " + logMessage + " -->";
127 }
128 }