Author: wglass Date: Tue Jan 3 21:45:40 2006 New Revision: 365832 URL: http://svn.apache.org/viewcvs?rev=365832&view=rev Log: Pass through RuntimeExceptions from plugins and event handlers. (except for MethodExceptionEventHandler). VELOCITY-429.
Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java (with props) jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java (with props) jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java (with props) jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java (with props) Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Include.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Parse.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VMProxyArg.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTMethod.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestException.java jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestImpl.java jakarta/velocity/core/trunk/xdocs/changes.xml Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/Template.java Tue Jan 3 21:45:40 2006 @@ -16,23 +16,20 @@ * limitations under the License. */ -import java.io.InputStream; -import java.io.Writer; import java.io.BufferedReader; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.io.Writer; -import org.apache.velocity.runtime.resource.Resource; -import org.apache.velocity.runtime.parser.ParseException; -import org.apache.velocity.runtime.parser.node.SimpleNode; - -import org.apache.velocity.VelocityContext; import org.apache.velocity.context.Context; import org.apache.velocity.context.InternalContextAdapterImpl; - -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.MethodInvocationException; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.parser.ParseException; +import org.apache.velocity.runtime.parser.node.SimpleNode; +import org.apache.velocity.runtime.resource.Resource; /** * This class is used for controlling all template @@ -134,6 +131,13 @@ */ errorCondition = new ParseErrorException( pex ); throw errorCondition; + } + /** + * pass through runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch( Exception e ) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/Velocity.java Tue Jan 3 21:45:40 2006 @@ -16,31 +16,28 @@ * limitations under the License. */ -import java.io.Writer; -import java.util.Properties; -import java.io.InputStream; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Reader; -import java.io.BufferedReader; import java.io.StringReader; -import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.Properties; -import org.apache.velocity.context.Context; +import org.apache.commons.collections.ExtendedProperties; import org.apache.velocity.Template; +import org.apache.velocity.context.Context; import org.apache.velocity.context.InternalContextAdapterImpl; -import org.apache.velocity.runtime.log.Log; -import org.apache.velocity.runtime.RuntimeSingleton; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.parser.node.SimpleNode; - -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.MethodInvocationException; - +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.RuntimeSingleton; +import org.apache.velocity.runtime.log.Log; import org.apache.velocity.runtime.parser.ParseException; - -import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.runtime.parser.node.SimpleNode; /** * This class provides services to the application @@ -374,7 +371,26 @@ return retval; } - catch( Exception e ) + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } + catch( ParseErrorException e ) + { + RuntimeSingleton.error( "Velocity.invokeVelocimacro() : error " + e ); + } + catch( MethodInvocationException e ) + { + RuntimeSingleton.error( "Velocity.invokeVelocimacro() : error " + e ); + } + catch( ResourceNotFoundException e ) + { + RuntimeSingleton.error( "Velocity.invokeVelocimacro() : error " + e ); + } + catch( IOException e ) { RuntimeSingleton.error( "Velocity.invokeVelocimacro() : error " + e ); } Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/app/VelocityEngine.java Tue Jan 3 21:45:40 2006 @@ -16,31 +16,28 @@ * limitations under the License. */ -import java.io.Writer; -import java.util.Properties; -import java.io.InputStream; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.Reader; -import java.io.BufferedReader; import java.io.StringReader; -import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.Properties; -import org.apache.velocity.context.Context; +import org.apache.commons.collections.ExtendedProperties; import org.apache.velocity.Template; +import org.apache.velocity.context.Context; import org.apache.velocity.context.InternalContextAdapterImpl; -import org.apache.velocity.runtime.RuntimeInstance; +import org.apache.velocity.exception.MethodInvocationException; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.RuntimeInstance; import org.apache.velocity.runtime.log.Log; -import org.apache.velocity.runtime.parser.node.SimpleNode; - -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.exception.ParseErrorException; -import org.apache.velocity.exception.MethodInvocationException; - import org.apache.velocity.runtime.parser.ParseException; - -import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.runtime.parser.node.SimpleNode; /** * <p> @@ -330,6 +327,13 @@ { nodeTree.init( ica, ri ); } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch( Exception e ) { ri.getLog().error("Velocity.evaluate() : init exception for tag = " @@ -418,6 +422,13 @@ logTag, construct.toString() ); return retval; + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch( Exception e ) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java Tue Jan 3 21:45:40 2006 @@ -16,29 +16,22 @@ * limitations under the License. */ -import java.io.Writer; import java.io.IOException; - +import java.io.Writer; import java.util.Iterator; import org.apache.velocity.app.event.EventCartridge; - -import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.context.Context; - -import org.apache.velocity.runtime.resource.Resource; - -import org.apache.velocity.runtime.RuntimeServices; -import org.apache.velocity.runtime.RuntimeConstants; - -import org.apache.velocity.runtime.parser.node.Node; -import org.apache.velocity.runtime.parser.node.SimpleNode; -import org.apache.velocity.runtime.parser.node.ASTReference; - +import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; - +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.RuntimeServices; +import org.apache.velocity.runtime.parser.node.ASTReference; +import org.apache.velocity.runtime.parser.node.Node; +import org.apache.velocity.runtime.parser.node.SimpleNode; +import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.util.introspection.Info; import org.apache.velocity.util.introspection.IntrospectionCacheData; @@ -364,6 +357,13 @@ try { i = rsvc.getUberspect().getIterator(listObject, uberInfo); + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch(Exception ee) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Include.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Include.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Include.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Include.java Tue Jan 3 21:45:40 2006 @@ -217,6 +217,13 @@ throw rnfe; } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch (Exception e) { rsvc.getLog().error("#include(): arg = '" + arg + Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Parse.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Parse.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Parse.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/Parse.java Tue Jan 3 21:45:40 2006 @@ -179,6 +179,13 @@ throw pee; } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch ( Exception e) { rsvc.getLog().error("#parse() : arg = " + arg + '.', e); @@ -195,23 +202,23 @@ ((SimpleNode) t.getData()).render( context, writer ); } } - catch ( Exception e ) + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) { - /* - * if it's a MIE, it came from the render.... throw it... - */ - - if ( e instanceof MethodInvocationException) - { - throw (MethodInvocationException) e; - } - - // Also throw Runtime Exceptions up the chain. Should fix VELOCITY-424. - if (e instanceof RuntimeException) - { - throw (RuntimeException) e; - } + throw e; + } + /* + * if it's a MIE, it came from the render.... throw it... + */ + catch( MethodInvocationException e ) + { + throw e; + } + catch ( Exception e ) + { rsvc.getLog().error("Exception rendering #parse(" + arg + ')', e); return false; } Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VMProxyArg.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VMProxyArg.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VMProxyArg.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VMProxyArg.java Tue Jan 3 21:45:40 2006 @@ -19,6 +19,7 @@ import java.io.BufferedReader; import java.io.StringReader; import java.io.StringWriter; + import org.apache.velocity.VelocityContext; import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.context.InternalContextAdapterImpl; @@ -318,6 +319,13 @@ retObject = writer; } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch (Exception e ) { log.error("VMProxyArg.getObject() : error rendering reference", e); @@ -418,6 +426,13 @@ nodeTree.init(ica, rsvc); } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch ( Exception e ) { log.error("VMProxyArg.setup() : exception " + Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java Tue Jan 3 21:45:40 2006 @@ -21,6 +21,7 @@ import java.io.StringReader; import java.io.Writer; import java.util.HashMap; + import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.context.VMContext; import org.apache.velocity.exception.MethodInvocationException; @@ -171,16 +172,24 @@ rsvc.getLog().error("VM error " + macroName + ". Null AST"); } } - catch ( Exception e ) + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) { - /* - * if it's a MIE, it came from the render.... throw it... - */ + throw e; + } - if ( e instanceof MethodInvocationException) - { - throw (MethodInvocationException) e; - } + /* + * if it's a MIE, it came from the render.... throw it... + */ + catch( MethodInvocationException e ) + { + throw e; + } + + catch ( Exception e ) + { rsvc.getLog().error("VelocimacroProxy.render() : exception VM = #" + macroName + "()", e); @@ -295,6 +304,13 @@ VMReferenceMungeVisitor v = new VMReferenceMungeVisitor( hm ); nodeTree.jjtAccept( v, null ); } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch ( Exception e ) { rsvc.getLog().error("VelocimacroManager.parseTree() : exception " + Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java Tue Jan 3 21:45:40 2006 @@ -133,6 +133,14 @@ } } } + + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch(Exception e) { log.error("ASTIdentifier.execute() : identifier = "+identifier, e); @@ -170,7 +178,13 @@ return EventHandlerUtil.methodException(rsvc, context, o.getClass(), vg.getMethodName(), (Exception) t); } - catch(Exception e) + + /** + * If the event handler throws an exception, then wrap it + * in a MethodInvocationException. Don't pass through RuntimeExceptions like other + * similar catchall code blocks. + */ + catch( Exception e ) { throw new MethodInvocationException( "Invocation of method '" + vg.getMethodName() + "'" @@ -201,6 +215,13 @@ catch(IllegalArgumentException iae) { return null; + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch(Exception e) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTMethod.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTMethod.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTMethod.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTMethod.java Tue Jan 3 21:45:40 2006 @@ -184,6 +184,13 @@ throw mie; } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch( Exception e ) { /* @@ -238,6 +245,12 @@ { return EventHandlerUtil.methodException( rsvc, context, o.getClass(), methodName, (Exception) t ); } + + /** + * If the event handler throws an exception, then wrap it + * in a MethodInvocationException. Don't pass through RuntimeExceptions like other + * similar catchall code blocks. + */ catch( Exception e ) { throw new MethodInvocationException( @@ -266,6 +279,13 @@ + ite.getTargetException().getMessage(), ite.getTargetException(), methodName ); } + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch( Exception e ) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTReference.java Tue Jan 3 21:45:40 2006 @@ -416,6 +416,13 @@ + ite.getTargetException().getClass(), ite.getTargetException(), identifier ); } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } catch(Exception e) { /* Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java Tue Jan 3 21:45:40 2006 @@ -17,10 +17,14 @@ */ import java.io.BufferedReader; +import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import org.apache.velocity.context.InternalContextAdapter; +import org.apache.velocity.exception.MethodInvocationException; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.parser.Parser; import org.apache.velocity.runtime.parser.ParserVisitor; @@ -191,14 +195,30 @@ return ret; } } - catch(Exception e) + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; + } + catch( ParseErrorException e ) + { + log.error("Error in interpolating string literal", e); + } + catch( MethodInvocationException e ) { - /* - * eh. If anything wrong, just punt - * and output the literal - */ log.error("Error in interpolating string literal", e); } + catch( ResourceNotFoundException e ) + { + log.error("Error in interpolating string literal", e); + } + catch( IOException e ) + { + log.error("Error in interpolating string literal", e); + } + } /* Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java Tue Jan 3 21:45:40 2006 @@ -15,11 +15,10 @@ * limitations under the License. */ -import org.apache.velocity.util.introspection.Introspector; - +import org.apache.velocity.runtime.RuntimeLogger; import org.apache.velocity.runtime.log.Log; import org.apache.velocity.runtime.log.RuntimeLoggerLog; -import org.apache.velocity.runtime.RuntimeLogger; +import org.apache.velocity.util.introspection.Introspector; /** * Handles discovery and valuation of a @@ -86,6 +85,13 @@ method = null; } + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch(Exception e) { Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java Tue Jan 3 21:45:40 2006 @@ -17,10 +17,10 @@ import java.lang.reflect.InvocationTargetException; -import org.apache.velocity.util.introspection.Introspector; +import org.apache.velocity.runtime.RuntimeLogger; import org.apache.velocity.runtime.log.Log; import org.apache.velocity.runtime.log.RuntimeLoggerLog; -import org.apache.velocity.runtime.RuntimeLogger; +import org.apache.velocity.util.introspection.Introspector; /** * Returned the value of object property when executed. @@ -105,6 +105,13 @@ return; } + } + /** + * pass through application level runtime exceptions + */ + catch( RuntimeException e ) + { + throw e; } catch(Exception e) { Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java?rev=365832&view=auto ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java (added) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java Tue Jan 3 21:45:40 2006 @@ -0,0 +1,178 @@ +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.runtime.RuntimeConstants; +import org.apache.velocity.test.misc.ExceptionGeneratingDirective; +import org.apache.velocity.test.misc.ExceptionGeneratingEventHandler; +import org.apache.velocity.test.misc.ExceptionGeneratingResourceLoader; +import org.apache.velocity.test.provider.TestProvider; + +/** + * Test case for miscellaneous Exception related issues. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Will Glass-Husain</a> + * @version $Id$ + */ +public class ExceptionTestCase extends BaseTestCase implements TemplateTestBase +{ + VelocityEngine ve; + + /** + * Default constructor. + */ + public ExceptionTestCase(String name) + { + super(name); + } + + public static Test suite () + { + return new TestSuite(ExceptionTestCase.class); + } + + + public void testReferenceInsertionEventHandlerException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.EVENTHANDLER_REFERENCEINSERTION,ExceptionGeneratingEventHandler.class.getName()); + ve.init(); + assertException(ve); + } + + /** + * Note - this is the one case where RuntimeExceptions *are not* passed through + * verbatim. + * @throws Exception + */ + public void testMethodExceptionEventHandlerException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.EVENTHANDLER_METHODEXCEPTION,ExceptionGeneratingEventHandler.class.getName()); + ve.init(); + Context context = new VelocityContext(); + context.put ("test",new TestProvider()); + assertMethodInvocationException(ve,context,"$test.getThrow()"); + assertMethodInvocationException(ve,context,"$test.throw"); + } + + public void testNullSetEventHandlerException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.EVENTHANDLER_NULLSET,ExceptionGeneratingEventHandler.class.getName()); + ve.init(); + assertException(ve,"#set($test = $abc)"); + } + + public void testIncludeEventHandlerException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.EVENTHANDLER_INCLUDE,ExceptionGeneratingEventHandler.class.getName()); + ve.init(); + assertException(ve,"#include('dummy')"); + } + + public void testResourceLoaderException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty(RuntimeConstants.RESOURCE_LOADER,"except"); + ve.setProperty("except.resource.loader.class",ExceptionGeneratingResourceLoader.class.getName()); + try + { + ve.init(); // tries to get the macro file + ve.getTemplate("test.txt"); + fail("Should have thrown RuntimeException"); + } + catch (RuntimeException E) + { + // do nothing + } + } + + + public void testDirectiveException() + throws Exception + { + ve = new VelocityEngine(); + ve.setProperty("userdirective",ExceptionGeneratingDirective.class.getName()); + ve.init(); + assertException(ve,"#Exception() test #end"); + } + + + + public void assertException(VelocityEngine ve) + throws Exception + { + Context context = new VelocityContext(); + context.put ("test","test"); + assertException(ve,context,"this is a $test"); + } + + public void assertException(VelocityEngine ve, String input) + throws Exception + { + Context context = new VelocityContext(); + context.put ("test","test"); + assertException(ve,context,input); + } + + public void assertException(VelocityEngine ve, Context context, String input) + throws Exception + { + try + { + StringWriter writer = new StringWriter(); + ve.evaluate(context,writer,"test",input); + fail("Expected RuntimeException"); + } + catch (RuntimeException E) + { + // do nothing + } + } + public void assertMethodInvocationException(VelocityEngine ve, Context context, String input) + throws Exception + { + try + { + StringWriter writer = new StringWriter(); + ve.evaluate(context,writer,"test",input); + fail("Expected MethodInvocationException"); + } + catch (MethodInvocationException E) + { + // do nothing + } + } + + +} Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/ExceptionTestCase.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Revision Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java?rev=365832&view=auto ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java (added) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java Tue Jan 3 21:45:40 2006 @@ -0,0 +1,56 @@ +package org.apache.velocity.test.misc; + +/* + * 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.IOException; +import java.io.Writer; + +import org.apache.velocity.context.InternalContextAdapter; +import org.apache.velocity.exception.MethodInvocationException; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.directive.Directive; +import org.apache.velocity.runtime.parser.node.Node; + +/** + * that always throws an exception. Used to test + * that RuntimeExceptions are passed through. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Will Glass-Husain</a> + * @version $Id$ + */ +public class ExceptionGeneratingDirective extends Directive +{ + + public String getName() + { + return "Exception"; + } + + public int getType() + { + return Directive.BLOCK; + } + + public boolean render(InternalContextAdapter context, Writer writer, Node node) + throws IOException, ResourceNotFoundException, ParseErrorException, + MethodInvocationException + { + throw new RuntimeException("exception"); + } + +} Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingDirective.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Revision Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java?rev=365832&view=auto ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java (added) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java Tue Jan 3 21:45:40 2006 @@ -0,0 +1,56 @@ +package org.apache.velocity.test.misc; + +/* + * 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 org.apache.velocity.app.event.IncludeEventHandler; +import org.apache.velocity.app.event.MethodExceptionEventHandler; +import org.apache.velocity.app.event.NullSetEventHandler; +import org.apache.velocity.app.event.ReferenceInsertionEventHandler; + +/** + * Event handlers that always throws an exception. Used to test + * that RuntimeExceptions are passed through. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Will Glass-Husain</a> + * @version $Id$ + */ +public class ExceptionGeneratingEventHandler implements IncludeEventHandler, + MethodExceptionEventHandler, NullSetEventHandler, ReferenceInsertionEventHandler +{ + + public String includeEvent(String includeResourcePath, String currentResourcePath, + String directiveName) + { + throw new RuntimeException("exception"); + } + + public Object methodException(Class claz, String method, Exception e) throws Exception + { + throw new RuntimeException("exception"); + } + + public boolean shouldLogOnNullSet(String lhs, String rhs) + { + throw new RuntimeException("exception"); + } + + public Object referenceInsert(String reference, Object value) + { + throw new RuntimeException("exception"); + } + +} Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Revision Added: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java?rev=365832&view=auto ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java (added) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java Tue Jan 3 21:45:40 2006 @@ -0,0 +1,55 @@ +package org.apache.velocity.test.misc; + +/* + * 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.InputStream; + +import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.resource.Resource; +import org.apache.velocity.runtime.resource.loader.ResourceLoader; + +/** + * Resource Loader that always throws an exception. Used to test + * that RuntimeExceptions are passed through. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Will Glass-Husain</a> + * @version $Id$ + */ +public class ExceptionGeneratingResourceLoader extends ResourceLoader +{ + + public void init(ExtendedProperties configuration) + { + } + + public InputStream getResourceStream(String source) throws ResourceNotFoundException + { + throw new RuntimeException("exception"); + } + + public boolean isSourceModified(Resource resource) + { + return false; + } + + public long getLastModified(Resource resource) + { + return 0; + } + +} Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/ExceptionGeneratingResourceLoader.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Revision Modified: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestException.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestException.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestException.java (original) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestException.java Tue Jan 3 21:45:40 2006 @@ -28,7 +28,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Llewellyn Falco</a> * @version $Id$ */ -public class UberspectTestException extends Error +public class UberspectTestException extends RuntimeException { /** Modified: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestImpl.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestImpl.java?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestImpl.java (original) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/misc/UberspectTestImpl.java Tue Jan 3 21:45:40 2006 @@ -33,9 +33,10 @@ if (method == null) { - throw new UberspectTestException("Method " + - obj.getClass().getName() + "." + methodName + - " does not exist.", i); + if (obj == null) + throw new UberspectTestException("Can't call method '" + methodName + "' on null object",i); + else + throw new UberspectTestException("Did not find method "+ obj.getClass().getName()+"."+methodName, i); } return method; @@ -47,8 +48,10 @@ if (propertyGet == null) { - throw new UberspectTestException("Did not find "+ - obj.getClass().getName()+"."+identifier, i); + if (obj == null) + throw new UberspectTestException("Can't call getter '" + identifier + "' on null object",i); + else + throw new UberspectTestException("Did not find "+ obj.getClass().getName()+"."+identifier, i); } return propertyGet; Modified: jakarta/velocity/core/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/xdocs/changes.xml?rev=365832&r1=365831&r2=365832&view=diff ============================================================================== --- jakarta/velocity/core/trunk/xdocs/changes.xml (original) +++ jakarta/velocity/core/trunk/xdocs/changes.xml Tue Jan 3 21:45:40 2006 @@ -24,6 +24,16 @@ <body> <release version="1.5-dev" date="in Subversion"> + <action type="update" dev="wglass" issue="VELOCITY-429" due-to=""> + Pass through all runtime exceptions. Among other benefits, this + allows plugins to throw a runtime exception to signify an application + level problem in the calling application. + </action> + + <action type="fix" dev="wglass" issue="VELOCITY-98" due-to="Michal Chmielewski"> + When #include was followed by #parse with the same file name, a ClassCastException was thrown. + </action> + <action type="add" dev="wglass" issue="VELOCITY-425" due-to="Llewellyn Falco"> Wrapped exceptions now have Cause property set on JDK 1.4. (note that Velocity continues to run under JDK 1.3). --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]