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>


Reply via email to