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.rendering.engine;
35
36 import info.magnolia.cms.beans.config.ServerConfiguration;
37 import info.magnolia.cms.core.AggregationState;
38 import info.magnolia.context.MgnlContext;
39 import info.magnolia.rendering.context.RenderingContext;
40
41 import java.io.IOException;
42 import java.io.PrintWriter;
43 import java.io.Writer;
44
45 import javax.inject.Inject;
46 import javax.jcr.RepositoryException;
47
48 import org.apache.commons.lang.StringUtils;
49 import org.apache.commons.lang.exception.ExceptionUtils;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53
54
55
56
57 public class ModeDependentRenderExceptionHandler implements RenderExceptionHandler {
58
59 private static Logger log = LoggerFactory.getLogger(ModeDependentRenderExceptionHandler.class);
60
61 public static final String RENDER_ERROR_MESSAGE_BEGIN =
62 "<!-- ERROR MESSAGE STARTS HERE --><script language=javascript>//\"></script><script language=javascript>//\'></script><script language=javascript>//\"></script><script language=javascript>//\'></script></title></xmp></script></noscript></style></object></head></pre></table></form></table></table></table></a></u></i></b><div align=left style='background-color:#FFFF00; color:#FF0000; display:block; border-top:double; padding:2pt; font-size:medium; font-family:Arial,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; text-transform: none'><b style='font-size:medium'>Template Error!</b><pre><xmp>";
63
64 public static final String RENDER_ERROR_MESSAGE_END = "</xmp></pre></div></html>";
65
66 private ServerConfiguration serverConfiguration;
67
68 @Inject
69 public ModeDependentRenderExceptionHandler(ServerConfiguration config) {
70 this.serverConfiguration = config;
71 }
72
73 @Override
74 public void handleException(RenderException renderException, RenderingContext renderingContext) {
75 String path;
76 try {
77 path = renderingContext.getCurrentContent().getPath();
78 } catch (RepositoryException e) {
79 path = "Can't read content";
80 }
81 String id = renderingContext.getRenderableDefinition().getId();
82 PrintWriter out;
83 try {
84 out = getPrintWriterFor(renderingContext.getAppendable());
85 AggregationState aggregationState = MgnlContext.getAggregationState();
86
87 String msg = String.format("Error while rendering [%s] with template [%s] for URI [%s]:\n%s",
88 path, id, aggregationState.getOriginalBrowserURI() +
89 (StringUtils.isEmpty(aggregationState.getQueryString()) ? "" : "=" + aggregationState.getQueryString()),
90 ExceptionUtils.getMessage(renderException));
91
92 if (serverConfiguration.isAdmin() && !aggregationState.isPreviewMode()) {
93 inEditMode(msg, renderException, out);
94 } else {
95 inPublicMode(msg, renderException, out);
96 }
97 } catch (IOException e) {
98 throw new RuntimeException("Can't log template exception.", e);
99 }
100 out.flush();
101 }
102
103 private PrintWriter getPrintWriterFor(Writer out) {
104 return (out instanceof PrintWriter) ? (PrintWriter) out : new PrintWriter(out);
105 }
106
107 protected void inPublicMode(String msg, RenderException renderException, PrintWriter out) {
108 log.error(msg, renderException);
109 }
110
111 protected void inEditMode(String msg, RenderException renderException, PrintWriter out) {
112 log.error(msg, renderException);
113 out.println(RENDER_ERROR_MESSAGE_BEGIN);
114 out.println(msg);
115 out.println(RENDER_ERROR_MESSAGE_END);
116 }
117 }