You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2006/12/08 20:41:51 UTC

svn commit: r484711 - /velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java

Author: nbubna
Date: Fri Dec  8 11:41:50 2006
New Revision: 484711

URL: http://svn.apache.org/viewvc?view=rev&rev=484711
Log:
catch exceptions in eval() (as the javadoc has long claimed to), but make old behavior optional via config

Modified:
    velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java

Modified: velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java
URL: http://svn.apache.org/viewvc/velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java?view=diff&rev=484711&r1=484710&r2=484711
==============================================================================
--- velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java (original)
+++ velocity/tools/trunk/src/java/org/apache/velocity/tools/generic/RenderTool.java Fri Dec  8 11:41:50 2006
@@ -87,17 +87,26 @@
      */
     public static final int DEFAULT_PARSE_DEPTH = 20;
     public static final String KEY_PARSE_DEPTH = "parse.depth";
+    public static final String KEY_CATCH_EXCEPTIONS = "catch.exceptions";
 
     private static final String LOG_TAG = "RenderTool.eval()";
 
     private VelocityEngine engine = null;
     private int parseDepth = DEFAULT_PARSE_DEPTH;
+    private boolean catchExceptions = true;
 
+    /**
+     * Looks for parse depth and catch.exceptions parameters.
+     * @since VelocityTools 1.3
+     */
     public void configure(Map params)
     {
         ValueParser parser = new ValueParser(params);
         int depth = parser.getInt(KEY_PARSE_DEPTH, DEFAULT_PARSE_DEPTH);
         setParseDepth(depth);
+
+        boolean catchEm = parser.getBoolean(KEY_CATCH_EXCEPTIONS, true);
+        setCatchExceptions(catchEm);
     }
 
     /**
@@ -130,16 +139,66 @@
     }
 
     /**
+     * Sets whether or not the render() and eval() methods should catch
+     * exceptions during their execution or not.
+     * @since VelocityTools 1.3
+     */
+    public void setCatchExceptions(boolean catchExceptions)
+    {
+        this.catchExceptions = catchExceptions;
+    }
+
+    /**
+     * Returns <code>true</code> if this render() and eval() methods will
+     * catch exceptions thrown during rendering.
+     * @since VelocityTools 1.3
+     */
+    public boolean getCatchExceptions()
+    {
+        return this.catchExceptions;
+    }
+
+    /**
      * <p>Evaluates a String containing VTL using the current context,
-     * and returns the result as a String.  If this fails, then
-     * <code>null</code> will be returned.  This evaluation is not
-     * recursive.</p>
+     * and returns the result as a String.  By default if this fails, then
+     * <code>null</code> will be returned, though this tool can be configured
+     * to let Exceptions pass through. This evaluation is not recursive.</p>
      *
      * @param ctx the current Context
      * @param vtl the code to be evaluated
      * @return the evaluated code as a String
      */
     public String eval(Context ctx, String vtl) throws Exception
+    {
+        if (this.catchExceptions)
+        {
+            try
+            {
+                return internalEval(ctx, vtl);
+            }
+            catch (Exception e)
+            {
+                String msg = LOG_TAG + " threw Exception: " + e;
+                if (engine == null)
+                {
+                    Velocity.debug(msg);
+                }
+                else
+                {
+                    engine.debug(msg);
+                }
+                return null;
+            }
+        }
+        else
+        {
+            return internalEval(ctx, vtl);
+        }
+    }
+
+
+    /* Internal implementation of the eval() method function. */
+    private String internalEval(Context ctx, String vtl) throws Exception
     {
         if (vtl == null)
         {