Author: cbrisson Date: Sun Dec 11 08:27:14 2016 New Revision: 1773548 URL: http://svn.apache.org/viewvc?rev=1773548&view=rev Log: [engine] review event handling
1) Add a Context argument for all events. 2) Get rid of the Executor pattern ; event handlers are directly called by the cartridge. Removed: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerMethodExecutor.java Modified: velocity/engine/trunk/pom.xml velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventCartridge.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerUtil.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/IncludeEventHandler.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/InvalidReferenceEventHandler.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/MethodExceptionEventHandler.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/ReferenceInsertionEventHandler.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/EscapeReference.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeNotFound.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/PrintExceptions.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/BuiltInEventHandlerTestCase.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/EventHandlingTestCase.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IncludeEventHandlingTestCase.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler1.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler2.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity758TestCase.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java velocity/engine/trunk/velocity-engine-examples/src/main/java/org/apache/velocity/example/EventExample.java Modified: velocity/engine/trunk/pom.xml URL: http://svn.apache.org/viewvc/velocity/engine/trunk/pom.xml?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/pom.xml (original) +++ velocity/engine/trunk/pom.xml Sun Dec 11 08:27:14 2016 @@ -68,8 +68,8 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> - <debug>false</debug> - <optimize>true</optimize> + <debug>true</debug> + <optimize>false</optimize> <showDeprecation>true</showDeprecation> <showWarning>true</showWarning> <source>1.7</source> Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventCartridge.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventCartridge.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventCartridge.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventCartridge.java Sun Dec 11 08:27:14 2016 @@ -20,13 +20,17 @@ package org.apache.velocity.app.event; */ import org.apache.velocity.context.Context; +import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.context.InternalEventContext; +import org.apache.velocity.exception.VelocityException; import org.apache.velocity.runtime.RuntimeServices; import org.apache.velocity.util.RuntimeServicesAware; +import org.apache.velocity.util.introspection.Info; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -53,16 +57,72 @@ import java.util.Set; */ public class EventCartridge { - private List referenceHandlers = new ArrayList(); - private List methodExceptionHandlers = new ArrayList(); - private List includeHandlers = new ArrayList(); - private List invalidReferenceHandlers = new ArrayList(); + private List<ReferenceInsertionEventHandler> referenceHandlers = new ArrayList(); + private MethodExceptionEventHandler methodExceptionHandler = null; + private List<IncludeEventHandler> includeHandlers = new ArrayList(); + private List<InvalidReferenceEventHandler> invalidReferenceHandlers = new ArrayList(); /** * Ensure that handlers are not initialized more than once. */ Set initializedHandlers = new HashSet(); + protected RuntimeServices rsvc = null; + + protected Logger getLog() + { + return rsvc == null ? LoggerFactory.getLogger(EventCartridge.class) : rsvc.getLog(); + } + + /** + * runtime services setter, called during initialization + * @param rs runtime services + * @since 2.0 + */ + public synchronized void setRuntimeServices(RuntimeServices rs) + { + if (rsvc == null) + { + rsvc = rs; + /* allow for this method to be called *after* adding event handlers */ + for (EventHandler handler : referenceHandlers) + { + if (handler instanceof RuntimeServicesAware && !initializedHandlers.contains(handler)) + { + ((RuntimeServicesAware)handler).setRuntimeServices(rs); + initializedHandlers.add(handler); + } + } + if (methodExceptionHandler != null && + methodExceptionHandler instanceof RuntimeServicesAware && + !initializedHandlers.contains(methodExceptionHandler)) + { + ((RuntimeServicesAware)methodExceptionHandler).setRuntimeServices(rs); + initializedHandlers.add(methodExceptionHandler); + } + for (EventHandler handler : includeHandlers) + { + if (handler instanceof RuntimeServicesAware && !initializedHandlers.contains(handler)) + { + ((RuntimeServicesAware)handler).setRuntimeServices(rs); + initializedHandlers.add(handler); + } + } + for (EventHandler handler : invalidReferenceHandlers) + { + if (handler instanceof RuntimeServicesAware && !initializedHandlers.contains(handler)) + { + ((RuntimeServicesAware)handler).setRuntimeServices(rs); + initializedHandlers.add(handler); + } + } + } + else if (rsvc != rs) + { + throw new VelocityException("an event cartridge cannot be used by several different runtime services instances"); + } + } + /** * Adds an event handler(s) to the Cartridge. This method * will find all possible event handler interfaces supported @@ -88,22 +148,28 @@ public class EventCartridge if ( ev instanceof MethodExceptionEventHandler ) { - addMethodExceptionHandler( (MethodExceptionEventHandler) ev ); + addMethodExceptionHandler((MethodExceptionEventHandler) ev); found = true; } if ( ev instanceof IncludeEventHandler ) { - addIncludeEventHandler( (IncludeEventHandler) ev ); + addIncludeEventHandler((IncludeEventHandler) ev); found = true; } if ( ev instanceof InvalidReferenceEventHandler ) { - addInvalidReferenceEventHandler( (InvalidReferenceEventHandler) ev ); + addInvalidReferenceEventHandler((InvalidReferenceEventHandler) ev); found = true; } + if (found && rsvc != null && ev instanceof RuntimeServicesAware && !initializedHandlers.contains(ev)) + { + ((RuntimeServicesAware)ev).setRuntimeServices(rsvc); + initializedHandlers.add(ev); + } + return found; } @@ -126,7 +192,14 @@ public class EventCartridge */ public void addMethodExceptionHandler( MethodExceptionEventHandler ev ) { - methodExceptionHandlers.add( ev ); + if (methodExceptionHandler == null) + { + methodExceptionHandler = ev; + } + else + { + getLog().warn("ignoring extra method exception handler"); + } } /** @@ -168,153 +241,181 @@ public class EventCartridge return false; } - boolean found = false; - if ( ev instanceof ReferenceInsertionEventHandler ) - return referenceHandlers.remove( ev ); + { + return referenceHandlers.remove(ev); + } if ( ev instanceof MethodExceptionEventHandler ) - return methodExceptionHandlers.remove(ev ); + { + if (ev == methodExceptionHandler) + { + methodExceptionHandler = null; + return true; + } + } if ( ev instanceof IncludeEventHandler ) - return includeHandlers.remove( ev ); + { + return includeHandlers.remove(ev); + } if ( ev instanceof InvalidReferenceEventHandler ) - return invalidReferenceHandlers.remove( ev ); - - return found; - } + { + return invalidReferenceHandlers.remove(ev); + } - /** - * Iterate through all the stored ReferenceInsertionEventHandler objects - * - * @return iterator of handler objects, null if there are not handlers - * @since 1.5 - */ - public Iterator getReferenceInsertionEventHandlers() - { - return referenceHandlers.size() == 0 ? null : referenceHandlers.iterator(); + return false; } /** - * Iterate through all the stored MethodExceptionEventHandler objects + * Call reference insertion handlers * - * @return iterator of handler objects - * @since 1.5 + * @return value returned by handlers + * @since 2.0 */ - public Iterator getMethodExceptionEventHandlers() + public Object referenceInsert(InternalContextAdapter context, String reference, Object value) { - return methodExceptionHandlers.iterator(); + for (ReferenceInsertionEventHandler handler : referenceHandlers) + { + value = handler.referenceInsert(context, reference, value); + } + return value; } - /** - * Iterate through all the stored IncludeEventHandlers objects - * - * @return iterator of handler objects - */ - public Iterator getIncludeEventHandlers() - { - return includeHandlers.iterator(); - } + /** + * Check whether this event cartridge has a method exception event handler + * @return true if a method exception event handler has been registered + * @since 2.0 + */ + boolean hasMethodExceptionEventHandler() + { + return methodExceptionHandler != null; + } /** - * Iterate through all the stored InvalidReferenceEventHandlers objects + * Call method exception event handler * - * @return iterator of handler objects - * @since 1.5 - */ - public Iterator getInvalidReferenceEventHandlers() - { - return invalidReferenceHandlers.iterator(); - } - - /** - * Attached the EventCartridge to the context - * - * Final because not something one should mess with lightly :) - * - * @param context context to attach to - * @return true if successful, false otherwise + * @return value returned by handler + * @since 2.0 */ - public final boolean attachToContext( Context context ) + public Object methodException(Context context, Class claz, String method, Exception e, Info info ) { - if ( context instanceof InternalEventContext ) + if (methodExceptionHandler != null) { - InternalEventContext iec = (InternalEventContext) context; - - iec.attachEventCartridge( this ); - - /** - * while it's tempting to call setContext on each handler from here, - * this needs to be done before each method call. This is - * because the specific context will change as inner contexts - * are linked in through macros, foreach, or directly by the user. - */ - - return true; - } - else - { - return false; + return methodExceptionHandler.methodException(context, claz, method, e, info); } + return null; } /** - * Initialize the handlers. For global handlers this is called when Velocity - * is initialized. For local handlers this is called when the first handler - * is executed. Handlers will not be initialized more than once. + * Call include event handlers * - * @param rs - * @since 1.5 + * @return include path + * @since 2.0 */ - public void initialize (RuntimeServices rs) + public String includeEvent(Context context, String includeResourcePath, String currentResourcePath, String directiveName) { - - for ( Iterator i = referenceHandlers.iterator(); i.hasNext(); ) - { - EventHandler eh = ( EventHandler ) i.next(); - if ( (eh instanceof RuntimeServicesAware) && - !initializedHandlers.contains(eh) ) - { - ((RuntimeServicesAware) eh).setRuntimeServices ( rs ); - initializedHandlers.add( eh ); - } - } - - for ( Iterator i = methodExceptionHandlers.iterator(); i.hasNext(); ) - { - EventHandler eh = ( EventHandler ) i.next(); - if ( (eh instanceof RuntimeServicesAware) && - !initializedHandlers.contains(eh) ) - { - ((RuntimeServicesAware) eh).setRuntimeServices ( rs ); - initializedHandlers.add( eh ); - } - } - - for ( Iterator i = includeHandlers.iterator(); i.hasNext(); ) + for (IncludeEventHandler handler : includeHandlers) { - EventHandler eh = ( EventHandler ) i.next(); - if ( (eh instanceof RuntimeServicesAware) && - !initializedHandlers.contains(eh) ) + includeResourcePath = handler.includeEvent(context, includeResourcePath, currentResourcePath, directiveName); + /* reflect 1.x behavior: exit after at least one execution whenever a null include path has been found */ + if (includeResourcePath == null) { - ((RuntimeServicesAware) eh).setRuntimeServices ( rs ); - initializedHandlers.add( eh ); + break; } } - - for ( Iterator i = invalidReferenceHandlers.iterator(); i.hasNext(); ) - { - EventHandler eh = ( EventHandler ) i.next(); - if ( (eh instanceof RuntimeServicesAware) && - !initializedHandlers.contains(eh) ) - { - ((RuntimeServicesAware) eh).setRuntimeServices ( rs ); - initializedHandlers.add( eh ); - } - } - + return includeResourcePath; } - -} + /** + * Call invalid reference handlers for an invalid getter + * + * @return value returned by handlers + * @since 2.0 + */ + public Object invalidGetMethod(Context context, String reference, Object object, String property, Info info) + { + Object result = null; + for (InvalidReferenceEventHandler handler : invalidReferenceHandlers) + { + result = handler.invalidGetMethod(context, reference, object, property, info); + /* reflect 1.x behavior: exit after at least one execution whenever a non-null value has been found */ + if (result != null) + { + break; + } + } + return result; + } + + /** + * Call invalid reference handlers for an invalid setter + * + * @return whether to stop further chaining in the next cartridge + * @since 2.0 + */ + public boolean invalidSetMethod(Context context, String leftreference, String rightreference, Info info) + { + for (InvalidReferenceEventHandler handler : invalidReferenceHandlers) + { + if (handler.invalidSetMethod(context, leftreference, rightreference, info)) + { + return true; + } + } + return false; + } + + /** + * Call invalid reference handlers for an invalid method call + * + * @return value returned by handlers + * @since 2.0 + */ + public Object invalidMethod(Context context, String reference, Object object, String method, Info info) + { + Object result = null; + for (InvalidReferenceEventHandler handler : invalidReferenceHandlers) + { + result = handler.invalidMethod(context, reference, object, method, info); + /* reflect 1.x behavior: exit after at least one execution whenever a non-null value has been found */ + if (result != null) + { + break; + } + } + return result; + } + + /** + * Attached the EventCartridge to the context + * + * Final because not something one should mess with lightly :) + * + * @param context context to attach to + * @return true if successful, false otherwise + */ + public final boolean attachToContext( Context context ) + { + if ( context instanceof InternalEventContext ) + { + InternalEventContext iec = (InternalEventContext) context; + + iec.attachEventCartridge( this ); + + /** + * while it's tempting to call setContext on each handler from here, + * this needs to be done before each method call. This is + * because the specific context will change as inner contexts + * are linked in through macros, foreach, or directly by the user. + */ + + return true; + } + else + { + return false; + } + } + } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerUtil.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerUtil.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerUtil.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/EventHandlerUtil.java Sun Dec 11 08:27:14 2016 @@ -56,49 +56,16 @@ public class EventHandlerUtil { public static Object referenceInsert(RuntimeServices rsvc, InternalContextAdapter context, String reference, Object value) { - // app level cartridges have already been initialized - - /* - * Performance modification: EventCartridge.getReferenceInsertionEventHandlers - * now returns a null if there are no handlers. Thus we can avoid creating the - * Iterator object. - */ - EventCartridge ev1 = rsvc.getApplicationEventCartridge(); - Iterator applicationEventHandlerIterator = - (ev1 == null) ? null: ev1.getReferenceInsertionEventHandlers(); - - EventCartridge ev2 = context.getEventCartridge(); - initializeEventCartridge(rsvc, ev2); - Iterator contextEventHandlerIterator = - (ev2 == null) ? null: ev2.getReferenceInsertionEventHandlers(); - - try - { - /* - * Performance modification: methodExecutor is created only if one of the - * iterators is not null. - */ - - EventHandlerMethodExecutor methodExecutor = null; - - if( applicationEventHandlerIterator != null ) - { - methodExecutor = - new ReferenceInsertionEventHandler.referenceInsertExecutor(context, reference, value); - iterateOverEventHandlers(applicationEventHandlerIterator, methodExecutor); - } - - if( contextEventHandlerIterator != null ) + try + { + value = rsvc.getApplicationEventCartridge().referenceInsert(context, reference, value); + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) { - if( methodExecutor == null ) - methodExecutor = - new ReferenceInsertionEventHandler.referenceInsertExecutor(context, reference, value); - - iterateOverEventHandlers(contextEventHandlerIterator, methodExecutor); + contextCartridge.setRuntimeServices(rsvc); + value = contextCartridge.referenceInsert(context, reference, value); } - - - return methodExecutor != null ? methodExecutor.getReturnValue() : value; + return value; } catch (RuntimeException e) { @@ -109,7 +76,7 @@ public class EventHandlerUtil { throw new VelocityException("Exception in event handler.",e); } } - + /** * Called when a method exception is generated during Velocity merge. Only * the first valid event handler in the sequence is called. The default @@ -131,30 +98,31 @@ public class EventHandlerUtil { InternalContextAdapter context, Class claz, String method, Exception e, Info info) throws Exception { - // app level cartridges have already been initialized - EventCartridge ev1 = rsvc.getApplicationEventCartridge(); - Iterator applicationEventHandlerIterator = - (ev1 == null) ? null: ev1.getMethodExceptionEventHandlers(); - - EventCartridge ev2 = context.getEventCartridge(); - initializeEventCartridge(rsvc, ev2); - Iterator contextEventHandlerIterator = - (ev2 == null) ? null: ev2.getMethodExceptionEventHandlers(); - - EventHandlerMethodExecutor methodExecutor = - new MethodExceptionEventHandler.MethodExceptionExecutor(context, claz, method, e, info); - - if ( ((applicationEventHandlerIterator == null) || !applicationEventHandlerIterator.hasNext()) && - ((contextEventHandlerIterator == null) || !contextEventHandlerIterator.hasNext()) ) + try { - throw e; + EventCartridge ev = rsvc.getApplicationEventCartridge(); + if (ev.hasMethodExceptionEventHandler()) + { + return ev.methodException(context, claz, method, e, info); + } + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) + { + contextCartridge.setRuntimeServices(rsvc); + return contextCartridge.methodException(context, claz, method, e, info); + } + } + catch (RuntimeException re) + { + throw re; + } + catch (Exception ex) + { + throw new VelocityException("Exception in event handler.", ex); } - - callEventHandlers( - applicationEventHandlerIterator, - contextEventHandlerIterator, methodExecutor); - - return methodExecutor.getReturnValue(); + + /* default behaviour is to re-throw exception */ + throw e; } /** @@ -181,28 +149,16 @@ public class EventHandlerUtil { InternalContextAdapter context, String includeResourcePath, String currentResourcePath, String directiveName) { - // app level cartridges have already been initialized - EventCartridge ev1 = rsvc.getApplicationEventCartridge(); - Iterator applicationEventHandlerIterator = - (ev1 == null) ? null: ev1.getIncludeEventHandlers(); - - EventCartridge ev2 = context.getEventCartridge(); - initializeEventCartridge(rsvc, ev2); - Iterator contextEventHandlerIterator = - (ev2 == null) ? null: ev2.getIncludeEventHandlers(); - - try - { - EventHandlerMethodExecutor methodExecutor = - new IncludeEventHandler.IncludeEventExecutor( - context, includeResourcePath, - currentResourcePath, directiveName); - - callEventHandlers( - applicationEventHandlerIterator, - contextEventHandlerIterator, methodExecutor); - - return (String) methodExecutor.getReturnValue(); + try + { + includeResourcePath = rsvc.getApplicationEventCartridge().includeEvent(context, includeResourcePath, currentResourcePath, directiveName); + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) + { + contextCartridge.setRuntimeServices(rsvc); + includeResourcePath = contextCartridge.includeEvent(context, includeResourcePath, currentResourcePath, directiveName); + } + return includeResourcePath; } catch (RuntimeException e) { @@ -230,15 +186,27 @@ public class EventHandlerUtil { InternalContextAdapter context, String reference, Object object, String property, Info info) { - return - invalidReferenceHandlerCall ( - new InvalidReferenceEventHandler.InvalidGetMethodExecutor - (context, reference, object, property, info), - rsvc, - context); + try + { + Object result = rsvc.getApplicationEventCartridge().invalidGetMethod(context, reference, object, property, info); + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) + { + contextCartridge.setRuntimeServices(rsvc); + result = contextCartridge.invalidGetMethod(context, reference, object, property, info); + } + return result; + } + catch (RuntimeException e) + { + throw e; + } + catch (Exception e) + { + throw new VelocityException("Exception in event handler.",e); + } } - - + /** * Called when an invalid set method is encountered. * @@ -252,14 +220,26 @@ public class EventHandlerUtil { InternalContextAdapter context, String leftreference, String rightreference, Info info) { - /** - * ignore return value - */ - invalidReferenceHandlerCall ( - new InvalidReferenceEventHandler.InvalidSetMethodExecutor - (context, leftreference, rightreference, info), - rsvc, - context); + try + { + if (!rsvc.getApplicationEventCartridge().invalidSetMethod(context, leftreference, rightreference, info)) + { + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) + { + contextCartridge.setRuntimeServices(rsvc); + contextCartridge.invalidSetMethod(context, leftreference, rightreference, info); + } + } + } + catch (RuntimeException e) + { + throw e; + } + catch (Exception e) + { + throw new VelocityException("Exception in event handler.",e); + } } /** @@ -277,45 +257,16 @@ public class EventHandlerUtil { InternalContextAdapter context, String reference, Object object, String method, Info info) { - return - invalidReferenceHandlerCall ( - new InvalidReferenceEventHandler.InvalidMethodExecutor - (context, reference, object, method, info), - rsvc, - context); - } - - - /** - * Calls event handler method with appropriate chaining across event handlers. - * - * @param methodExecutor - * @param rsvc current instance of RuntimeServices - * @param context The current context - * @return return value from method, or null if no return value - */ - public static Object invalidReferenceHandlerCall( - EventHandlerMethodExecutor methodExecutor, - RuntimeServices rsvc, - InternalContextAdapter context) - { - // app level cartridges have already been initialized - EventCartridge ev1 = rsvc.getApplicationEventCartridge(); - Iterator applicationEventHandlerIterator = - (ev1 == null) ? null: ev1.getInvalidReferenceEventHandlers(); - - EventCartridge ev2 = context.getEventCartridge(); - initializeEventCartridge(rsvc, ev2); - Iterator contextEventHandlerIterator = - (ev2 == null) ? null: ev2.getInvalidReferenceEventHandlers(); - try { - callEventHandlers( - applicationEventHandlerIterator, - contextEventHandlerIterator, methodExecutor); - - return methodExecutor.getReturnValue(); + Object result = rsvc.getApplicationEventCartridge().invalidMethod(context, reference, object, method, info); + EventCartridge contextCartridge = context.getEventCartridge(); + if (contextCartridge != null) + { + contextCartridge.setRuntimeServices(rsvc); + result = contextCartridge.invalidMethod(context, reference, object, method, info); + } + return result; } catch (RuntimeException e) { @@ -325,77 +276,5 @@ public class EventHandlerUtil { { throw new VelocityException("Exception in event handler.",e); } - } - - /** - * Initialize the event cartridge if appropriate. - * - * @param rsvc current instance of RuntimeServices - * @param eventCartridge the event cartridge to be initialized - */ - private static void initializeEventCartridge(RuntimeServices rsvc, EventCartridge eventCartridge) - { - if (eventCartridge != null) - { - try - { - eventCartridge.initialize(rsvc); - } - catch (Exception e) - { - throw new VelocityException("Couldn't initialize event cartridge : ", e); - } - } - } - - - /** - * Loop through both the application level and context-attached event handlers. - * - * @param applicationEventHandlerIterator Iterator that loops through all global event handlers declared at application level - * @param contextEventHandlerIterator Iterator that loops through all global event handlers attached to context - * @param eventExecutor Strategy object that executes event handler method - */ - private static void callEventHandlers( - Iterator applicationEventHandlerIterator, - Iterator contextEventHandlerIterator, - EventHandlerMethodExecutor eventExecutor) - { - /** - * First loop through the event handlers configured at the app level - * in the properties file. - */ - iterateOverEventHandlers(applicationEventHandlerIterator, eventExecutor); - - /** - * Then loop through the event handlers attached to the context. - */ - iterateOverEventHandlers(contextEventHandlerIterator, eventExecutor); - } - - /** - * Loop through a given iterator of event handlers. - * - * @param handlerIterator Iterator that loops through event handlers - * @param eventExecutor Strategy object that executes event handler method - */ - private static void iterateOverEventHandlers( - Iterator handlerIterator, - EventHandlerMethodExecutor eventExecutor) - { - if (handlerIterator != null) - { - for (Iterator i = handlerIterator; i.hasNext();) - { - EventHandler eventHandler = (EventHandler) i.next(); - - if (!eventExecutor.isDone()) - { - eventExecutor.execute(eventHandler); - } - } - } - } - } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/IncludeEventHandler.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/IncludeEventHandler.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/IncludeEventHandler.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/IncludeEventHandler.java Sun Dec 11 08:27:14 2016 @@ -39,6 +39,7 @@ public interface IncludeEventHandler ex * registered IncludeEventHandlers are called unless null is returned. If * none are registered the template at the includeResourcePath is retrieved. * + * @param context current context * @param includeResourcePath the path as given in the include directive. * @param currentResourcePath the path of the currently rendering template that includes the * include directive. @@ -48,62 +49,5 @@ public interface IncludeEventHandler ex * @return a new resource path for the directive, or null to block the * include from occurring. */ - public String includeEvent( String includeResourcePath, String currentResourcePath, String directiveName ); - - - - /** - * Defines the execution strategy for includeEvent - */ - static class IncludeEventExecutor implements EventHandlerMethodExecutor - { - private Context context; - private String includeResourcePath; - private String currentResourcePath; - private String directiveName; - - private boolean executed = false; - - IncludeEventExecutor( - Context context, - String includeResourcePath, - String currentResourcePath, - String directiveName) - { - this.context = context; - this.includeResourcePath = includeResourcePath; - this.currentResourcePath = currentResourcePath; - this.directiveName = directiveName; - } - - /** - * Call the method includeEvent() - * - * @param handler call the appropriate method on this handler - */ - public void execute(EventHandler handler) - { - IncludeEventHandler eh = (IncludeEventHandler) handler; - - if (eh instanceof ContextAware) - ((ContextAware) eh).setContext(context); - - executed = true; - includeResourcePath = ((IncludeEventHandler) handler) - .includeEvent(includeResourcePath, currentResourcePath, directiveName); - } - - public Object getReturnValue() - { - return includeResourcePath; - } - - public boolean isDone() - { - return executed && (includeResourcePath == null); - } - - - } - + public String includeEvent(Context context, String includeResourcePath, String currentResourcePath, String directiveName); } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/InvalidReferenceEventHandler.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/InvalidReferenceEventHandler.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/InvalidReferenceEventHandler.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/InvalidReferenceEventHandler.java Sun Dec 11 08:27:14 2016 @@ -85,154 +85,4 @@ public interface InvalidReferenceEventHa */ public Object invalidMethod(Context context, String reference, Object object, String method, Info info); - - - /** - * Defines the execution strategy for invalidGetMethod - */ - static class InvalidGetMethodExecutor implements EventHandlerMethodExecutor - { - private Context context; - private String reference; - private Object object; - private String property; - private Info info; - - private Object result; - - InvalidGetMethodExecutor( - Context context, - String reference, - Object object, - String property, - Info info) - { - this.context = context; - this.reference = reference; - this.object = object; - this.property = property; - this.info = info; - } - - /** - * Call the method invalidGetMethod() - * - * @param handler call the appropriate method on this handler - */ - public void execute(EventHandler handler) - { - result = ((InvalidReferenceEventHandler) handler).invalidGetMethod( - context, reference, object, property, info); - } - - public Object getReturnValue() - { - return result; - } - - public boolean isDone() - { - return (result != null); - } - } - - /** - * Defines the execution strategy for invalidGetMethod - */ - static class InvalidSetMethodExecutor implements EventHandlerMethodExecutor - { - private Context context; - private String leftreference; - private String rightreference; - private Info info; - - private boolean result; - - InvalidSetMethodExecutor( - Context context, - String leftreference, - String rightreference, - Info info) - { - this.context = context; - this.leftreference = leftreference; - this.rightreference = rightreference; - this.info = info; - } - - /** - * Call the method invalidSetMethod() - * - * @param handler call the appropriate method on this handler - */ - public void execute(EventHandler handler) - { - result = ((InvalidReferenceEventHandler) handler).invalidSetMethod( - context, leftreference, rightreference, info); - } - - public Object getReturnValue() - { - return null; - } - - public boolean isDone() - { - return result; - } - - } - - /** - * Defines the execution strategy for invalidGetMethod - */ - static class InvalidMethodExecutor implements EventHandlerMethodExecutor - { - private Context context; - private String reference; - private Object object; - private String method; - private Info info; - - private Object result; - private boolean executed = false; - - InvalidMethodExecutor( - Context context, - String reference, - Object object, - String method, - Info info) - { - this.context = context; - this.reference = reference; - this.object = object; - this.method = method; - this.info = info; - } - - /** - * Call the method invalidMethod() - * - * @param handler call the appropriate method on this handler - */ - public void execute(EventHandler handler) - { - executed = true; - result = ((InvalidReferenceEventHandler) handler).invalidMethod( - context, reference, object, method, info); - } - - public Object getReturnValue() - { - return result; - } - - public boolean isDone() - { - return executed && (result != null); - } - - } - } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/MethodExceptionEventHandler.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/MethodExceptionEventHandler.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/MethodExceptionEventHandler.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/MethodExceptionEventHandler.java Sun Dec 11 08:27:14 2016 @@ -41,6 +41,7 @@ public interface MethodExceptionEventHan * Only the first registered MethodExceptionEventHandler is called. If * none are registered a MethodInvocationException is thrown. * + * @param context current context * @param claz the class of the object the method is being applied to * @param method the method * @param e the thrown exception @@ -48,70 +49,5 @@ public interface MethodExceptionEventHan * @return an object to insert in the page * @throws RuntimeException an exception to be thrown instead inserting an object */ - public Object methodException( Class claz, String method, Exception e, Info info ); - - /** - * Defines the execution strategy for methodException - * @since 1.5 - */ - static class MethodExceptionExecutor implements EventHandlerMethodExecutor - { - private Context context; - private Class claz; - private String method; - private Exception e; - private Info info; - - private Object result; - private boolean executed = false; - - MethodExceptionExecutor( - Context context, - Class claz, - String method, - Exception e, - Info info) - { - this.context = context; - this.claz = claz; - this.method = method; - this.e = e; - this.info = info; - } - - /** - * Call the method methodException() - * - * @param handler call the appropriate method on this handler - * @exception Exception generic exception thrown by methodException event handler method call - */ - public void execute(EventHandler handler) - { - MethodExceptionEventHandler eh = (MethodExceptionEventHandler) handler; - - if (eh instanceof ContextAware) - ((ContextAware) eh).setContext(context); - - executed = true; - result = ((MethodExceptionEventHandler) handler).methodException(claz, method, e, info); - } - - public Object getReturnValue() - { - return result; - } - - /** - * Only run the first MethodExceptionEventHandler - * - * @return true after this is executed once. - */ - public boolean isDone() - { - return executed; - } - - - } - + public Object methodException(Context context, Class claz, String method, Exception e, Info info); } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/ReferenceInsertionEventHandler.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/ReferenceInsertionEventHandler.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/ReferenceInsertionEventHandler.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/ReferenceInsertionEventHandler.java Sun Dec 11 08:27:14 2016 @@ -20,7 +20,6 @@ package org.apache.velocity.app.event; */ import org.apache.velocity.context.Context; -import org.apache.velocity.util.ContextAware; /** * Reference 'Stream insertion' event handler. Called with object @@ -41,66 +40,14 @@ public interface ReferenceInsertionEven * ReferenceInsertionEventHandlers are are registered then reference value * is inserted into the output stream as is. * + * + * @param context current context * @param reference Reference from template about to be inserted. * @param value Value about to be inserted (after its <code>toString()</code> * method is called). * @return Object on which <code>toString()</code> should be called for * output. */ - public Object referenceInsert( String reference, Object value ); - - /** - * Defines the execution strategy for referenceInsert - * @since 1.5 - */ - static class referenceInsertExecutor implements EventHandlerMethodExecutor - { - private Context context; - private String reference; - private Object value; - - referenceInsertExecutor( - Context context, - String reference, - Object value) - { - this.context = context; - this.reference = reference; - this.value = value; - } - - /** - * Call the method referenceInsert() - * - * @param handler call the appropriate method on this handler - */ - public void execute(EventHandler handler) - { - ReferenceInsertionEventHandler eh = (ReferenceInsertionEventHandler) handler; - - if (eh instanceof ContextAware) - ((ContextAware) eh).setContext(context); - - /** - * Every successive call will alter the same value - */ - value = ((ReferenceInsertionEventHandler) handler).referenceInsert(reference, value); - } - - public Object getReturnValue() - { - return value; - } - - /** - * Continue to end of event handler iteration - * - * @return always returns false - */ - public boolean isDone() - { - return false; - } - } + public Object referenceInsert( Context context, String reference, Object value ); } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/EscapeReference.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/EscapeReference.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/EscapeReference.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/EscapeReference.java Sun Dec 11 08:27:14 2016 @@ -20,6 +20,7 @@ package org.apache.velocity.app.event.im */ import org.apache.velocity.app.event.ReferenceInsertionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.RuntimeServices; import org.apache.velocity.util.RuntimeServicesAware; @@ -90,7 +91,7 @@ public abstract class EscapeReference im * @param value * @return Escaped text. */ - public Object referenceInsert(String reference, Object value) + public Object referenceInsert(Context context, String reference, Object value) { if(value == null) { Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeNotFound.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeNotFound.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeNotFound.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeNotFound.java Sun Dec 11 08:27:14 2016 @@ -74,6 +74,7 @@ public class IncludeNotFound implements * @return message. */ public String includeEvent( + Context context, String includeResourcePath, String currentResourcePath, String directiveName) Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/IncludeRelativePath.java Sun Dec 11 08:27:14 2016 @@ -20,6 +20,7 @@ package org.apache.velocity.app.event.im */ import org.apache.velocity.app.event.IncludeEventHandler; +import org.apache.velocity.context.Context; /** * <p>Event handler that looks for included files relative to the path of the @@ -44,6 +45,7 @@ public class IncludeRelativePath impleme * @return new path relative to the current template's path */ public String includeEvent( + Context context, String includeResourcePath, String currentResourcePath, String directiveName) Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/PrintExceptions.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/PrintExceptions.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/PrintExceptions.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/app/event/implement/PrintExceptions.java Sun Dec 11 08:27:14 2016 @@ -20,6 +20,7 @@ package org.apache.velocity.app.event.im */ import org.apache.velocity.app.event.MethodExceptionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeServices; import org.apache.velocity.util.RuntimeServicesAware; import org.apache.velocity.util.introspection.Info; @@ -57,14 +58,15 @@ public class PrintExceptions implements /** * Render the method exception, and optionally the exception message and stack trace. - * + * + * @param context current context * @param claz the class of the object the method is being applied to * @param method the method * @param e the thrown exception * @param info template name and line, column informations * @return an object to insert in the page */ - public Object methodException(Class claz, String method, Exception e, Info info) + public Object methodException(Context context, Class claz, String method, Exception e, Info info) { boolean showTemplateInfo = rs.getBoolean(SHOW_TEMPLATE_INFO, false); boolean showStackTrace = rs.getBoolean(SHOW_STACK_TRACE,false); Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/RuntimeInstance.java Sun Dec 11 08:27:14 2016 @@ -789,6 +789,7 @@ public class RuntimeInstance implements { eventCartridge = new EventCartridge(); + eventCartridge.setRuntimeServices(this); /** * For each type of event handler, get the class name, instantiate it, and store it. Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTIdentifier.java Sun Dec 11 08:27:14 2016 @@ -218,8 +218,7 @@ public class ASTIdentifier extends Simpl /** * If the event handler throws an exception, then wrap it - * in a MethodInvocationException. Don't pass through RuntimeExceptions like other - * similar catchall code blocks. + * in a MethodInvocationException. */ catch( Exception e ) { Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/BuiltInEventHandlerTestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/BuiltInEventHandlerTestCase.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/BuiltInEventHandlerTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/BuiltInEventHandlerTestCase.java Sun Dec 11 08:27:14 2016 @@ -175,9 +175,9 @@ public class BuiltInEventHandlerTestCase public void testEscapeHtml() throws Exception { EscapeReference esc = new EscapeHtmlReference(); - assertEquals("test string&another<b>bold</b>test",esc.referenceInsert("","test string&another<b>bold</b>test")); - assertEquals("<">",esc.referenceInsert("","<\">")); - assertEquals("test string",esc.referenceInsert("","test string")); + assertEquals("test string&another<b>bold</b>test",esc.referenceInsert(null,"","test string&another<b>bold</b>test")); + assertEquals("<">",esc.referenceInsert(null,"","<\">")); + assertEquals("test string",esc.referenceInsert(null,"","test string")); log("Correctly escaped HTML"); @@ -190,10 +190,10 @@ public class BuiltInEventHandlerTestCase public void testEscapeXml() throws Exception { EscapeReference esc = new EscapeXmlReference(); - assertEquals("test string&another<b>bold</b>test",esc.referenceInsert("","test string&another<b>bold</b>test")); - assertEquals("<">",esc.referenceInsert("","<\">")); - assertEquals("'",esc.referenceInsert("","'")); - assertEquals("test string",esc.referenceInsert("","test string")); + assertEquals("test string&another<b>bold</b>test",esc.referenceInsert(null,"","test string&another<b>bold</b>test")); + assertEquals("<">",esc.referenceInsert(null,"","<\">")); + assertEquals("'",esc.referenceInsert(null,"","'")); + assertEquals("test string",esc.referenceInsert(null,"","test string")); log("Correctly escaped XML"); @@ -206,8 +206,8 @@ public class BuiltInEventHandlerTestCase public void testEscapeSql() throws Exception { EscapeReference esc = new EscapeSqlReference(); - assertEquals("Jimmy''s Pizza",esc.referenceInsert("","Jimmy's Pizza")); - assertEquals("test string",esc.referenceInsert("","test string")); + assertEquals("Jimmy''s Pizza",esc.referenceInsert(null,"","Jimmy's Pizza")); + assertEquals("test string",esc.referenceInsert(null,"","test string")); log("Correctly escaped SQL"); @@ -220,8 +220,8 @@ public class BuiltInEventHandlerTestCase public void testEscapeJavaScript() throws Exception { EscapeReference esc = new EscapeJavaScriptReference(); - assertEquals("Jimmy\\'s Pizza",esc.referenceInsert("","Jimmy's Pizza")); - assertEquals("test string",esc.referenceInsert("","test string")); + assertEquals("Jimmy\\'s Pizza",esc.referenceInsert(null,"","Jimmy's Pizza")); + assertEquals("test string",esc.referenceInsert(null,"","test string")); log("Correctly escaped Javascript"); Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/EventHandlingTestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/EventHandlingTestCase.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/EventHandlingTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/EventHandlingTestCase.java Sun Dec 11 08:27:14 2016 @@ -199,7 +199,7 @@ public class EventHandlingTestCase exten /** * Event handler for when a reference is inserted into the output stream. */ - public Object referenceInsert( String reference, Object value ) + public Object referenceInsert( Context context, String reference, Object value ) { // as a test, make sure this EventHandler is initialized if (rs == null) @@ -233,7 +233,7 @@ public class EventHandlingTestCase exten /** * Handles exceptions thrown during in-template method access */ - public Object methodException( Class claz, String method, Exception e, Info info ) + public Object methodException( Context context, Class claz, String method, Exception e, Info info ) { // as a test, make sure this EventHandler is initialized if (rs == null) Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IncludeEventHandlingTestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IncludeEventHandlingTestCase.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IncludeEventHandlingTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/IncludeEventHandlingTestCase.java Sun Dec 11 08:27:14 2016 @@ -204,7 +204,7 @@ public class IncludeEventHandlingTestCas /** * Sample handler with different behaviors for the different tests. */ - public String includeEvent( String includeResourcePath, String currentResourcePath, String directiveName) + public String includeEvent( Context context, String includeResourcePath, String currentResourcePath, String directiveName) { if (EventHandlerBehavior == PASS_THROUGH) return includeResourcePath; Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler1.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler1.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler1.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler1.java Sun Dec 11 08:27:14 2016 @@ -22,6 +22,7 @@ package org.apache.velocity.test.eventha import org.apache.velocity.app.event.IncludeEventHandler; import org.apache.velocity.app.event.MethodExceptionEventHandler; import org.apache.velocity.app.event.ReferenceInsertionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.util.introspection.Info; /** @@ -36,7 +37,7 @@ public class Handler1 /** * display output twice, once uppercase and once lowercase */ - public Object referenceInsert(String reference, Object value) + public Object referenceInsert(Context context, String reference, Object value) { if (value == null) return null; @@ -47,7 +48,7 @@ public class Handler1 /** * throw the exception */ - public Object methodException(Class claz, String method, Exception e, Info info) + public Object methodException(Context context, Class claz, String method, Exception e, Info info) { throw new RuntimeException(e); } @@ -56,6 +57,7 @@ public class Handler1 * redirect all requests to a page "login.vm" (simulates access control). */ public String includeEvent( + Context context, String includeResourcePath, String currentResourcePath, String directiveName) Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler2.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler2.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler2.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/eventhandler/Handler2.java Sun Dec 11 08:27:14 2016 @@ -22,6 +22,7 @@ package org.apache.velocity.test.eventha import org.apache.velocity.app.event.IncludeEventHandler; import org.apache.velocity.app.event.MethodExceptionEventHandler; import org.apache.velocity.app.event.ReferenceInsertionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.util.introspection.Info; /** @@ -36,7 +37,7 @@ public class Handler2 /** * convert output to upper case */ - public Object referenceInsert(String reference, Object value) + public Object referenceInsert(Context context, String reference, Object value) { if (value == null) return null; @@ -47,7 +48,7 @@ public class Handler2 /** * print the exception */ - public Object methodException(Class claz, String method, Exception e, Info info) + public Object methodException(Context context, Class claz, String method, Exception e, Info info) { return "Exception: " + e; } @@ -56,6 +57,7 @@ public class Handler2 * redirect all requests to a new directory "subdir" (simulates localization). */ public String includeEvent( + Context context, String includeResourcePath, String currentResourcePath, String directiveName) Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity758TestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity758TestCase.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity758TestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity758TestCase.java Sun Dec 11 08:27:14 2016 @@ -21,6 +21,7 @@ package org.apache.velocity.test.issues; import org.apache.velocity.app.event.EventCartridge; import org.apache.velocity.app.event.IncludeEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.test.BaseTestCase; /** @@ -52,7 +53,7 @@ public class Velocity758TestCase extends public static class Handler implements IncludeEventHandler { - public String includeEvent(String parsePath, String parentPath, String directive) + public String includeEvent(Context context, String parsePath, String parentPath, String directive) { if (parsePath == null) { Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/ExceptionGeneratingEventHandler.java Sun Dec 11 08:27:14 2016 @@ -22,6 +22,7 @@ package org.apache.velocity.test.misc; import org.apache.velocity.app.event.IncludeEventHandler; import org.apache.velocity.app.event.MethodExceptionEventHandler; import org.apache.velocity.app.event.ReferenceInsertionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.util.introspection.Info; /** @@ -35,15 +36,15 @@ public class ExceptionGeneratingEventHan MethodExceptionEventHandler, ReferenceInsertionEventHandler { - public String includeEvent(String includeResourcePath, String currentResourcePath, + public String includeEvent(Context context, String includeResourcePath, String currentResourcePath, String directiveName) { throw new RuntimeException("exception"); } - public Object methodException(Class claz, String method, Exception e, Info info) { throw new RuntimeException("exception"); } + public Object methodException(Context context, Class claz, String method, Exception e, Info info) { throw new RuntimeException("exception"); } - public Object referenceInsert(String reference, Object value) + public Object referenceInsert(Context context, String reference, Object value) { throw new RuntimeException("exception"); } Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/util/introspection/ConversionHandlerTestCase.java Sun Dec 11 08:27:14 2016 @@ -24,6 +24,7 @@ import org.apache.velocity.VelocityConte import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.app.event.MethodExceptionEventHandler; +import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.RuntimeInstance; import org.apache.velocity.test.BaseTestCase; @@ -200,7 +201,8 @@ public class ConversionHandlerTestCase e public static class PrintException implements MethodExceptionEventHandler { - public Object methodException(Class claz, + public Object methodException(Context context, + Class claz, String method, Exception e, Info info) Modified: velocity/engine/trunk/velocity-engine-examples/src/main/java/org/apache/velocity/example/EventExample.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-examples/src/main/java/org/apache/velocity/example/EventExample.java?rev=1773548&r1=1773547&r2=1773548&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-examples/src/main/java/org/apache/velocity/example/EventExample.java (original) +++ velocity/engine/trunk/velocity-engine-examples/src/main/java/org/apache/velocity/example/EventExample.java Sun Dec 11 08:27:14 2016 @@ -20,6 +20,7 @@ package org.apache.velocity.example; import java.io.StringWriter; +import org.apache.velocity.context.Context; import org.apache.velocity.util.introspection.Info; import org.slf4j.helpers.FormattingTuple; import org.slf4j.helpers.MarkerIgnoringBase; @@ -240,7 +241,7 @@ public class EventExample extends Marker /** * Event handler for when a reference is inserted into the output stream. */ - public Object referenceInsert( String reference, Object value ) + public Object referenceInsert( Context context, String reference, Object value ) { /* * if we have a value @@ -281,7 +282,7 @@ public class EventExample extends Marker return true; } - public Object methodException( Class claz, String method, Exception e, Info info ) { + public Object methodException( Context context, Class claz, String method, Exception e, Info info ) { /* * only do processing if the switch is on */