Author: ghuber
Date: Thu Oct 10 11:44:17 2013
New Revision: 1530927
URL: http://svn.apache.org/r1530927
Log:
Show template rather than just logging
Added:
roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-parse.vm
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/Renderer.java
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/VelocityRenderer.java
roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-page.vm
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/Renderer.java
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/Renderer.java?rev=1530927&r1=1530926&r2=1530927&view=diff
==============================================================================
---
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/Renderer.java
(original)
+++
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/Renderer.java
Thu Oct 10 11:44:17 2013
@@ -34,6 +34,6 @@ public interface Renderer {
*
* Throws an exception if there is a problem during rendering.
*/
- void render(Map model, Writer writer) throws RenderingException;
+ void render(Map<String, Object> model, Writer writer) throws
RenderingException;
}
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java?rev=1530927&r1=1530926&r2=1530927&view=diff
==============================================================================
---
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java
(original)
+++
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/PlanetFeedServlet.java
Thu Oct 10 11:44:17 2013
@@ -21,11 +21,13 @@ package org.apache.roller.weblogger.ui.r
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
+
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -38,6 +40,7 @@ import org.apache.roller.weblogger.pojos
import org.apache.roller.weblogger.ui.rendering.Renderer;
import org.apache.roller.weblogger.ui.rendering.RendererManager;
import
org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository.DeviceType;
+import org.apache.roller.weblogger.ui.rendering.model.Model;
import org.apache.roller.weblogger.ui.rendering.model.UtilitiesModel;
import org.apache.roller.weblogger.ui.rendering.util.cache.PlanetCache;
import org.apache.roller.weblogger.ui.rendering.util.PlanetRequest;
@@ -118,8 +121,7 @@ public class PlanetFeedServlet extends H
// looks like we need to render content
- @SuppressWarnings("unchecked")
- HashMap<String, Object> model = new HashMap();
+ HashMap<String, Object> model = new HashMap<String, Object>();
try {
// populate the rendering model
if (request.getParameter("group") != null) {
Modified:
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/VelocityRenderer.java
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/VelocityRenderer.java?rev=1530927&r1=1530926&r2=1530927&view=diff
==============================================================================
---
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/VelocityRenderer.java
(original)
+++
roller/trunk/app/src/main/java/org/apache/roller/weblogger/ui/rendering/velocity/VelocityRenderer.java
Thu Oct 10 11:44:17 2013
@@ -21,6 +21,7 @@ package org.apache.roller.weblogger.ui.r
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.pojos.Template;
@@ -31,134 +32,216 @@ import org.apache.roller.weblogger.ui.re
import org.apache.roller.weblogger.ui.rendering.model.UtilitiesModel;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.context.Context;
+import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
-
/**
* Renderer that renders using the Velocity template engine.
*/
public class VelocityRenderer implements Renderer {
-
+
private static Log log = LogFactory.getLog(VelocityRenderer.class);
-
+
// the original template we are supposed to render
private Template renderTemplate = null;
- private MobileDeviceRepository.DeviceType deviceType = null;
-
+ private MobileDeviceRepository.DeviceType deviceType = null;
+
// the velocity templates
private org.apache.velocity.Template velocityTemplate = null;
private org.apache.velocity.Template velocityDecorator = null;
-
+
// a possible exception
- private Exception parseException = null;
-
-
- public VelocityRenderer(Template template,
- MobileDeviceRepository.DeviceType deviceType) throws
Exception {
-
+ private Exception velocityException = null;
+
+ public VelocityRenderer(Template template,
+ MobileDeviceRepository.DeviceType deviceType) throws Exception {
+
// the Template we are supposed to render
this.renderTemplate = template;
- this.deviceType = deviceType;
-
+ this.deviceType = deviceType;
+
try {
// make sure that we can locate the template
// if we can't then this will throw an exception
- velocityTemplate = RollerVelocity.getTemplate(template.getId(),
deviceType, "UTF-8");
-
+ velocityTemplate = RollerVelocity.getTemplate(template.getId(),
+ deviceType, "UTF-8");
+
// if this is a ThemeTemplate than look for a decorator too
- if(template instanceof ThemeTemplate) {
+ if (template instanceof ThemeTemplate) {
ThemeTemplate templ = (ThemeTemplate) template;
-
+
Template decorator = templ.getDecorator();
- if(decorator != null) {
- velocityDecorator =
RollerVelocity.getTemplate(decorator.getId(), "UTF-8");
+ if (decorator != null) {
+ velocityDecorator = RollerVelocity.getTemplate(
+ decorator.getId(), "UTF-8");
}
}
- } catch(ResourceNotFoundException ex) {
+ } catch (ResourceNotFoundException ex) {
// velocity couldn't find the resource so lets log a warning
- log.warn("Error creating renderer for "+template.getId()+
- " due to ["+ex.getMessage()+"]");
-
- // then just rethrow so that the caller knows this instantiation
failed
+ log.warn("Error creating renderer for " + template.getId()
+ + " due to [" + ex.getMessage() + "]");
+
+ // then just rethrow so that the caller knows this instantiation
+ // failed
throw ex;
-
- } catch(ParseErrorException ex) {
+
+ } catch (ParseErrorException ex) {
// in the case of a parsing error we want to render an
// error page instead so the user knows what was wrong
- parseException = ex;
-
+ velocityException = ex;
+
// need to lookup error page template
- velocityTemplate = RollerVelocity.getTemplate("error-page.vm",
deviceType);
-
- } catch(Exception ex) {
+ velocityTemplate = RollerVelocity.getTemplate("error-page.vm",
+ deviceType);
+
+ } catch (MethodInvocationException ex) {
+
+ // in the case of a invocation error we want to render an
+ // error page instead so the user knows what was wrong
+ velocityException = ex;
+
+ // need to lookup error page template
+ velocityTemplate = RollerVelocity.getTemplate("error-page.vm",
+ deviceType);
+
+ } catch (Exception ex) {
// some kind of generic/unknown exception, dump it to the logs
- log.error("Unknown exception creatting renderer for
"+template.getId(), ex);
-
+ log.error(
+ "Unknown exception creatting renderer for "
+ + template.getId(), ex);
+
// throw if back to the caller
throw ex;
}
}
-
-
- public void render(Map model, Writer out) throws RenderingException {
-
+
+ /**
+ * @see
org.apache.roller.weblogger.ui.rendering.Renderer#render(java.util.Map,
+ * java.io.Writer)
+ */
+ public void render(Map<String, Object> model, Writer out)
+ throws RenderingException {
+
try {
- if(parseException != null) {
-
- Context ctx = new VelocityContext(model);
- ctx.put("exception", parseException);
- ctx.put("exceptionSource", renderTemplate.getId());
- ctx.put("utils", new UtilitiesModel());
-
- // render output to Writer
- velocityTemplate.merge(ctx, out);
-
+ if (velocityException != null) {
+
+ // Render exception
+ renderException(model, out, null);
+
// and we're done
return;
}
-
+
long startTime = System.currentTimeMillis();
-
+
// convert model to Velocity Context
Context ctx = new VelocityContext(model);
-
+
if (velocityDecorator != null) {
-
+
/**
- * We only allow decorating once, so the process isn't
- * fully recursive. This is just to keep it simple.
+ * We only allow decorating once, so the process isn't fully
+ * recursive. This is just to keep it simple.
*/
-
+
// render base template to a temporary StringWriter
StringWriter sw = new StringWriter();
velocityTemplate.merge(ctx, sw);
-
+
// put rendered template into context
ctx.put("decorator_body", sw.toString());
-
- log.debug("Applying decorator "+velocityDecorator.getName());
-
+
+ log.debug("Applying decorator " + velocityDecorator.getName());
+
// now render decorator to our output writer
velocityDecorator.merge(ctx, out);
-
+
} else {
-
+
// no decorator, so just merge template to our output writer
velocityTemplate.merge(ctx, out);
}
-
+
long endTime = System.currentTimeMillis();
- long renderTime = (endTime - startTime)/1000;
-
- log.debug("Rendered ["+renderTemplate.getId()+"] in "+renderTime+"
secs");
-
+ long renderTime = (endTime - startTime) / 1000;
+
+ log.debug("Rendered [" + renderTemplate.getId() + "] in "
+ + renderTime + " secs");
+
+ } catch (ParseErrorException ex) {
+
+ // in the case of a parsing error including a page we want to
render
+ // an error on the page instead so the user knows what was wrong
+ velocityException = ex;
+
+ // need to lookup parse error template
+ renderException(model, out, "error-parse.vm");
+
+ // and we're done
+ return;
+
+ } catch (MethodInvocationException ex) {
+
+ // in the case of a parsing error including a page we want to
render
+ // an error on the page instead so the user knows what was wrong
+ velocityException = ex;
+
+ // need to lookup parse error template
+ renderException(model, out, "error-parse.vm");
+
+ // and we're done
+ return;
+
} catch (Exception ex) {
// wrap and rethrow so caller can deal with it
throw new RenderingException("Error during rendering", ex);
}
}
+ /**
+ * Render Velocity Exception.
+ *
+ * @param model
+ * the model
+ * @param out
+ * the out
+ * @param template
+ * the template. Null if using existing template name
+ *
+ * @throws RenderingException
+ * the rendering exception
+ */
+ private void renderException(Map<String, Object> model, Writer out,
+ String template) throws RenderingException {
+
+ try {
+
+ if (template != null) {
+ // need to lookup error page template
+ velocityTemplate = RollerVelocity.getTemplate(template,
+ deviceType);
+ }
+
+ Context ctx = new VelocityContext(model);
+ ctx.put("exception", velocityException);
+ ctx.put("exceptionSource", renderTemplate.getId());
+ ctx.put("exceptionDevice", deviceType);
+ ctx.put("utils", new UtilitiesModel());
+
+ // render output to Writer
+ velocityTemplate.merge(ctx, out);
+
+ // and we're done
+ return;
+
+ } catch (Exception e) {
+ // wrap and rethrow so caller can deal with it
+ throw new RenderingException("Error during rendering", e);
+ }
+
+ }
+
}
Modified:
roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-page.vm
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-page.vm?rev=1530927&r1=1530926&r2=1530927&view=diff
==============================================================================
--- roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-page.vm
(original)
+++ roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-page.vm
Thu Oct 10 11:44:17 2013
@@ -14,20 +14,65 @@
limitations under the License. For additional information regarding
copyright in this work, please see the NOTICE file in the top level
directory of this distribution.
-*#<html>
-<body>
+*#
+</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>$text.get("errorPage.title")</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <style>
+ a {text-decoration: none;}
+ .bannerStatusBox a, .bannerStatusBox a {font-weight: bold;}
+ .bannerLeft {padding: 4px 15px 4px 10px;}
+ .bannerRight {padding: 4px 10px 4px 15px;text-align: right;}
+ .bannerBox {width: 100%;background: #f00;}
+ #banner {margin: 0px;padding: 0px 0px 0px 0px;}
+ .bannerStatusBox {width: 100%;border: grey 1px solid;}
+ .bannerStatusBox {background: none repeat scroll 0 0 #AD3431;color:
white;}
+ .bannerStatusBox a {color: white;}
+ .bannerStatusBox a:link {color: white;}
+ .bannerStatusBox a:visited {color: white;}
+ .dottedtable {border: 1px dotted #CCCCCC;}
+ </style
+ </head>
+ <body>
+
+ <div id="banner">
+ <div id="bannerStatusBox">
+ <table class="bannerStatusBox" cellpadding="0" cellspacing="0">
+ <tr>
+ <td class="bannerLeft"></td>
+ <td class="bannerRight">
+ <a href="$url.absoluteSite">$config.siteName</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div style="padding: 15px 25px 25px 25px">
+ <h2 class="error">Velocity template error</h2>
+
+ <table width="80%" border="1px" class="dottedtable"
style="border-collapse: collapse;">
+ <tr>
+ <td class="dottedtable" width="20%">Velocity Exception</td>
+ <td class="dottedtable">Velocity template error :
$exceptionDevice</td>
+ </tr>
+ <tr>
+ <td class="dottedtable" width="20%">Message</td>
+ <td
class="dottedtable">$utils.autoformat($utils.escapeHTML($exception.getMessage()))</td>
+ </tr>
+ <tr>
+ <td class="dottedtable" width="20%">Type</td>
+ <td class="dottedtable">$exceptionSource</td>
+ </tr>
+ <tr>
+ <td class="dottedtable" width="20%">Exception</td>
+ <td class="dottedtable">$!exception.getClass().getName()</td>
+ </tr>
+ </table>
+ </div>
-<h1>Velocity template error</h1>
-
-<p><b>EXCEPTION</b>: [$!exception.getClass().getName()]</p>
-
-<p><b>EXCEPTION SOURCE</b>: [$exceptionSource]</p>
-
-<p><b>EXCEPTION MESSAGE</b>:</p>
-
-#if ($exception.getMessage())
- $utils.autoformat($exception.getMessage())
-#end
-
-</body>
+ </body>
</html>
\ No newline at end of file
Added:
roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-parse.vm
URL:
http://svn.apache.org/viewvc/roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-parse.vm?rev=1530927&view=auto
==============================================================================
--- roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-parse.vm
(added)
+++ roller/trunk/app/src/main/webapp/WEB-INF/velocity/templates/error-parse.vm
Thu Oct 10 11:44:17 2013
@@ -0,0 +1,45 @@
+#**
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. The ASF licenses this file to You
+ under the Apache License, Version 2.0 (the "License"); you may not
+ use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. For additional information regarding
+ copyright in this work, please see the NOTICE file in the top level
+ directory of this distribution.
+*#
+#*
+ Velocity #parse error include page
+*#
+<span class="error">
+ <ul>
+ <li>Velocity template error</li>
+ </ul>
+</span>
+<div style="padding: 15px 25px 25px 25px">
+ <table width="80%" border="1px" style="border-collapse: collapse; border:
1px dotted #CCCCCC">
+ <tr>
+ <td style="border: 1px dotted #CCCCCC" width="20%">Exception</td>
+ <td style="border: 1px dotted #CCCCCC">Velocity template error :
$exceptionDevice</td>
+ </tr>
+ <tr>
+ <td style="border: 1px dotted #CCCCCC" width="20%">Message</td>
+ <td style="border: 1px dotted
#CCCCCC">$utils.autoformat($utils.escapeHTML($exception.getMessage()))</td>
+ </tr>
+ <tr>
+ <td style="border: 1px dotted #CCCCCC"" width="20%">Type</td>
+ <td style="border: 1px dotted #CCCCCC">$exceptionSource</td>
+ </tr>
+ <tr>
+ <td style="border: 1px dotted #CCCCCC" width="20%">Exception</td>
+ <td style="border: 1px dotted
#CCCCCC">$!exception.getClass().getName()</td>
+ </tr>
+ </table>
+</div>