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.rendering.context.RenderingContext;
39 import info.magnolia.rendering.util.AppendableWriter;
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.inject.Provider;
47 import javax.jcr.RepositoryException;
48
49 import org.apache.commons.lang3.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 final 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 final ServerConfiguration serverConfiguration;
67 private final Provider<AggregationState> aggregationStateProvider;
68
69 @Inject
70 public ModeDependentRenderExceptionHandler(ServerConfiguration config, Provider<AggregationState> aggregationStateProvider) {
71 this.serverConfiguration = config;
72 this.aggregationStateProvider = aggregationStateProvider;
73 }
74
75 @Override
76 public void handleException(RenderException renderException, RenderingContext renderingContext) {
77 try {
78 final String path = renderingContext.getCurrentContent().getPath();
79 final PrintWriter printWriter = getPrintWriterFor(renderingContext.getAppendable());
80
81 final String id = renderingContext.getRenderableDefinition().getId();
82 final AggregationState aggregationState = aggregationStateProvider.get();
83
84 final String msg = String.format("Error while rendering [%s] with template [%s] for URI [%s]:\n%s",
85 path, id, formatURI(aggregationState), ExceptionUtils.getMessage(renderException));
86
87 this.processException(renderException, printWriter, msg);
88 } catch (RepositoryException e) {
89 throw new RuntimeException("Can't log template exception.", e);
90 } catch (IOException e) {
91 throw new RuntimeException("Can't log template exception.", e);
92 }
93 }
94
95 @Override
96 public void handleException(RenderException renderException, Appendable out) {
97 final AggregationState aggregationState = aggregationStateProvider.get();
98
99 final String msg = String.format("Error while rendering URI [%s]:\n%s",
100 formatURI(aggregationState), ExceptionUtils.getMessage(renderException));
101
102 this.processException(renderException, this.getPrintWriterFor(new AppendableWriter(out)), msg);
103 }
104
105
106 private void processException(RenderException renderException, PrintWriter printWriter, String msg) {
107 if (serverConfiguration.isAdmin() && !aggregationStateProvider.get().isPreviewMode()) {
108 inEditMode(msg, renderException, printWriter);
109 } else {
110 inPublicMode(msg, renderException, printWriter);
111 }
112 printWriter.flush();
113 }
114
115 private PrintWriter getPrintWriterFor(Writer out) {
116 return (out instanceof PrintWriter) ? (PrintWriter) out : new PrintWriter(out);
117 }
118
119 protected void inPublicMode(String msg, RenderException renderException, PrintWriter out) {
120 log.error(msg, renderException);
121 }
122
123 protected void inEditMode(String msg, RenderException renderException, PrintWriter out) {
124 log.error(msg, renderException);
125 out.println(RENDER_ERROR_MESSAGE_BEGIN);
126 out.println(msg);
127 out.println(RENDER_ERROR_MESSAGE_END);
128 }
129
130 private String formatURI(AggregationState aggregationState) {
131 final StringBuilder sb = new StringBuilder();
132 sb.append(aggregationState.getOriginalBrowserURI());
133 if (aggregationState.getQueryString() != null) {
134 sb.append("?");
135 sb.append(aggregationState.getQueryString());
136 }
137 return sb.toString();
138 }
139 }