You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by wg...@apache.org on 2005/12/01 07:36:58 UTC

svn commit: r350188 - in /jakarta/velocity/core/trunk/src: java/org/apache/velocity/exception/ java/org/apache/velocity/runtime/log/ java/org/apache/velocity/runtime/resource/loader/ java/org/apache/velocity/util/ test/org/apache/velocity/test/ test/or...

Author: wglass
Date: Wed Nov 30 22:36:49 2005
New Revision: 350188

URL: http://svn.apache.org/viewcvs?rev=350188&view=rev
Log:
Set the cause for thrown exceptions when run under JDK 1.4+.  VELOCITY-425.

Added:
    jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java   (with props)
    jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java   (with props)
Modified:
    jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java
    jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java
    jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java
    jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java
    jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java

Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java?rev=350188&r1=350187&r2=350188&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java (original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java Wed Nov 30 22:36:49 2005
@@ -1,5 +1,7 @@
 package org.apache.velocity.exception;
 
+import org.apache.velocity.util.ExceptionUtils;
+
 /*
  * Copyright 2001-2004 The Apache Software Foundation.
  *
@@ -50,6 +52,7 @@
     {
         super(message);
         this.wrapped = e;
+        ExceptionUtils.setCause(this, e);
         this.methodName = methodName;
     }       
 

Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java?rev=350188&r1=350187&r2=350188&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java (original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java Wed Nov 30 22:36:49 2005
@@ -18,12 +18,13 @@
 
 import java.io.IOException;
 import java.lang.reflect.Field;
+import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
-import org.apache.log4j.RollingFileAppender;
 import org.apache.log4j.PatternLayout;
-import org.apache.log4j.Level;
+import org.apache.log4j.RollingFileAppender;
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.apache.velocity.runtime.RuntimeServices;
+import org.apache.velocity.util.ExceptionUtils;
 
 /**
  * Implementation of a simple log4j system that will either latch onto
@@ -118,7 +119,7 @@
         catch (IOException ioe)
         {
             rsvc.getLog().warn("Could not create file appender '"+file+'\'', ioe);
-            throw new Exception("Error configuring Log4JLogChute : " + ioe);
+            throw ExceptionUtils.createRuntimeException("Error configuring Log4JLogChute : ", ioe);
         }
     }
 

Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java?rev=350188&r1=350187&r2=350188&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java (original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java Wed Nov 30 22:36:49 2005
@@ -20,6 +20,7 @@
 
 import org.apache.velocity.runtime.resource.Resource;
 import org.apache.velocity.util.ClassUtils;
+import org.apache.velocity.util.ExceptionUtils;
 import org.apache.velocity.exception.ResourceNotFoundException;
 
 import org.apache.commons.collections.ExtendedProperties;
@@ -113,11 +114,7 @@
         }
         catch( Exception fnfe )
         {
-            /*
-             *  log and convert to a general Velocity ResourceNotFoundException
-             */
-
-            throw new ResourceNotFoundException( fnfe.getMessage() );
+            throw (ResourceNotFoundException) ExceptionUtils.createWithCause(ResourceNotFoundException.class, "problem with template: " + name, fnfe );
         }
 
         if (result == null)

Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java?rev=350188&r1=350187&r2=350188&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java (original)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java Wed Nov 30 22:36:49 2005
@@ -30,6 +30,7 @@
 import org.apache.commons.collections.ExtendedProperties;
 import org.apache.velocity.exception.ResourceNotFoundException;
 import org.apache.velocity.runtime.resource.Resource;
+import org.apache.velocity.util.ExceptionUtils;
 
 /**
  * <P>This is a simple template file loader that loads templates
@@ -263,15 +264,17 @@
      *  @param i_operation string for logging, indicating caller's intention
      *
      *  @return timestamp as long
+     * @throws ResourceNotFoundException 
      */
-     private long readLastModified(Resource resource, String i_operation)
+     private long readLastModified(Resource resource, String i_operation) 
      {
          /*
           *  get the template name from the resource
           */
 
          String name = resource.getName();
-         try
+         
+        try
          {
              Connection conn = openDbConnection();
 
@@ -303,15 +306,19 @@
          }
          catch(SQLException e)
          {
-             log.error("DataSourceResourceLoader Error: error while "
+             String msg = "DataSourceResourceLoader Error: error while "
                  + i_operation + " when trying to load resource "
-                 + name, e);
-         }
+                 + name;
+             log.error(msg, e);
+             throw ExceptionUtils.createRuntimeException(msg, e);
+      }
          catch(NamingException e)
          {
-             log.error("DataSourceResourceLoader Error: error while "
+             String msg = "DataSourceResourceLoader Error: error while "
                  + i_operation + " when trying to load resource "
-                 + name, e);
+                 + name;
+             log.error(msg, e);
+             throw ExceptionUtils.createRuntimeException(msg, e);
          }
 
          return 0;
@@ -355,8 +362,10 @@
          }
          catch (Exception e)
          {
-             log.info("DataSourceResourceLoader Quirk: problem when closing connection", e);
-         }
+            String msg = "DataSourceResourceLoader Quirk: problem when closing connection";
+            log.info(msg, e);
+            throw  ExceptionUtils.createRuntimeException(msg, e);
+        }
      }
 
     /**

Added: jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java?rev=350188&view=auto
==============================================================================
--- jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java (added)
+++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java Wed Nov 30 22:36:49 2005
@@ -0,0 +1,100 @@
+package org.apache.velocity.util;
+
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/**
+ * Use this to create a new Exception.  This will run under JDK 1.3 or greater.
+ * However, it running under JDK 1.4 it will set the cause.
+ *
+ * @author <a href="mailto:isidore@setgame.com">Llewellyn Falco</a>
+ */
+public class ExceptionUtils
+{
+    private static boolean causesAllowed = true;
+
+    /**
+     * Create a new RuntimeException, setting the cause if possible.
+     */
+    public static RuntimeException createRuntimeException(
+            String message, Throwable cause)
+    {
+        return (RuntimeException) createWithCause(
+                RuntimeException.class, message, cause);
+    }
+
+    /**
+     * Create a new Exception, setting the cause if possible.
+     */
+    public static Throwable createWithCause(Class clazz,
+            String message, Throwable cause)
+    {
+        Throwable re = null;
+        if (causesAllowed)
+        {
+            try
+            {
+                Constructor constructor = clazz
+                        .getConstructor(new Class[]{String.class,
+                                Throwable.class});
+                re = (Throwable) constructor
+                        .newInstance(new Object[]{message, cause});
+            }
+            catch (Exception e)
+            {
+                causesAllowed = false;
+            }
+        }
+        if (re == null)
+        {
+            try
+            {
+                Constructor constructor = clazz
+                        .getConstructor(new Class[]{String.class});
+                re = (Throwable) constructor
+                        .newInstance(new Object[]{message
+                                + " caused by " + cause});
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException("Error caused " + e); // should be impossible
+            }
+        }
+        return re;
+    }
+
+    /**
+     * Set the cause of the Exception.  Will detect if this is not allowed.
+     */
+    public static void setCause(Throwable onObject, Throwable cause)
+    {
+        if (causesAllowed)
+        {
+            try
+            {
+                Method method = onObject.getClass().getMethod("initCause", new Class[]{Throwable.class});
+                method.invoke(onObject, new Object[]{cause});
+            }
+            catch (Exception e)
+            {
+                causesAllowed = false;
+            }
+        }
+    }
+}

Propchange: jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java
------------------------------------------------------------------------------
    svn:keywords = Id Author Date Revision

Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java?rev=350188&view=auto
==============================================================================
--- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java (added)
+++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java Wed Nov 30 22:36:49 2005
@@ -0,0 +1,88 @@
+package org.apache.velocity.test;
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+
+import java.io.StringWriter;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.context.Context;
+import org.apache.velocity.exception.MethodInvocationException;
+import org.apache.velocity.test.provider.TestProvider;
+import org.apache.velocity.util.ExceptionUtils;
+
+
+
+/**
+ * Test that thrown exceptions include (under JDK 1.4+ a proper cause.
+ *
+ * @author <a href="mailto:wglass@forio.com">Will Glass-Husain</a>
+ * @version $Id$
+ */
+public class WrappedExceptionTestCase extends BaseTestCase implements TemplateTestBase
+{
+    VelocityEngine ve;
+    
+    /**
+     * Default constructor.
+     */
+    public WrappedExceptionTestCase(String name)
+    {
+        super(name);
+    }
+    
+    public static Test suite ()
+    {
+        return new TestSuite(WrappedExceptionTestCase.class);
+    }
+
+    public void setUp() throws Exception
+    {
+        ve = new VelocityEngine();
+        ve.init();
+    }
+
+
+    public void testMethodException() throws Exception
+    {
+
+        // accumulate a list of invalid references
+        Context context = new VelocityContext();
+        StringWriter writer = new StringWriter();
+        context.put("test",new TestProvider());
+        
+        try 
+        {   
+            ve.evaluate(context,writer,"test","$test.getThrow()");
+            fail ("expected an exception");
+        } 
+        catch (MethodInvocationException E)
+        {
+            assertEquals(Exception.class,E.getCause().getClass());
+            assertEquals("From getThrow()",E.getCause().getMessage());
+        }
+
+    }
+    public void testExceptionUtils()
+    {
+        Error e = new Error("Inside");
+        RuntimeException re = ExceptionUtils.createRuntimeException("Outside", e);
+        assertEquals("cause was set", e,re.getCause());
+    }
+
+}

Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Id Author Date Revision

Modified: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java?rev=350188&r1=350187&r2=350188&view=diff
==============================================================================
--- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java (original)
+++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java Wed Nov 30 22:36:49 2005
@@ -349,15 +349,12 @@
     public String getFoo()
         throws Exception
     {
-        System.out.println("Hello from getfoo");
-
         throw new Exception("From getFoo()");
     }
 
     public String getThrow()
         throws Exception
     {
-        System.out.println("Hello from geThrow");
        throw new Exception("From getThrow()");
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org


Re: svn commit: r350188 - in /jakarta/velocity/core/trunk/src: java/org/apache/velocity/exception/ java/org/apache/velocity/runtime/log/ java/org/apache/velocity/runtime/resource/loader/ java/org/apache/velocity/util/ test/org/apache/velocity/test/ test/or

Posted by Will Glass-Husain <wg...@forio.com>.
The goal is to set the the Cause property when running under JDK 1.4, but 
still also be compatible with JDK 1.3.

Does NestableException accomplish this?

WILL

----- Original Message ----- 
From: "Alexey Panchenko" <al...@olmisoft.com>
To: "Velocity Developers List" <ve...@jakarta.apache.org>
Sent: Thursday, December 01, 2005 3:02 AM
Subject: Re: svn commit: r350188 - in /jakarta/velocity/core/trunk/src: 
java/org/apache/velocity/exception/ java/org/apache/velocity/runtime/log/ 
java/org/apache/velocity/runtime/resource/loader/ 
java/org/apache/velocity/util/ test/org/apache/velocity/test/ test/or...


> Hello,
>
>> Author: wglass
>> Date: Wed Nov 30 22:36:49 2005
>> New Revision: 350188
>
>> URL: http://svn.apache.org/viewcvs?rev=350188&view=rev
>> Log:
>> Set the cause for thrown exceptions when run under JDK 1.4+. 
>> VELOCITY-425.
>>
>> Added:
>> 
>> jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java 
>> (with props)
>> 
>> jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java 
>> (with props)
>> Modified:
>> 
>> jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java
>> 
>> jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java
>> 
>> jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java
>> 
>> jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java
>> 
>> jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java
>
> Why not just inherit from
> org.apache.commons.lang.exception.NestableException/NestableRuntimeException
> ?
>
> The simpliest way to go is
> VelocityException extends NestableException
> VelocityRuntimeException extends NestableRuntimeException
> and throw one of them.
>
> Creating exceptions thru reflection seems a bit complex.
>
> Also:
>
> throw new VelocityRuntimeException(msg, e)
>
> looks simplier than
>
> throw ExceptionUtils.createRuntimeException(msg, e)
>
> -- 
> Best regards,
> Alexey                            mailto:alex+news@olmisoft.com
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org


Re: svn commit: r350188 - in /jakarta/velocity/core/trunk/src: java/org/apache/velocity/exception/ java/org/apache/velocity/runtime/log/ java/org/apache/velocity/runtime/resource/loader/ java/org/apache/velocity/util/ test/org/apache/velocity/test/ test/or...

Posted by Alexey Panchenko <al...@olmisoft.com>.
Hello,

> Author: wglass
> Date: Wed Nov 30 22:36:49 2005
> New Revision: 350188

> URL: http://svn.apache.org/viewcvs?rev=350188&view=rev
> Log:
> Set the cause for thrown exceptions when run under JDK 1.4+.  VELOCITY-425.
>
> Added:
>     jakarta/velocity/core/trunk/src/java/org/apache/velocity/util/ExceptionUtils.java   (with props)
>     jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/WrappedExceptionTestCase.java   (with props)
> Modified:
>     jakarta/velocity/core/trunk/src/java/org/apache/velocity/exception/MethodInvocationException.java
>     jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/log/Log4JLogChute.java
>     jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.java
>     jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/resource/loader/DataSourceResourceLoader.java
>     jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/provider/TestProvider.java

Why not just inherit from
org.apache.commons.lang.exception.NestableException/NestableRuntimeException
?

The simpliest way to go is
VelocityException extends NestableException
VelocityRuntimeException extends NestableRuntimeException
and throw one of them.

Creating exceptions thru reflection seems a bit complex.

Also:

throw new VelocityRuntimeException(msg, e)

looks simplier than

throw ExceptionUtils.createRuntimeException(msg, e)

-- 
Best regards,
 Alexey                            mailto:alex+news@olmisoft.com


---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org