You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2008/08/13 01:38:16 UTC
svn commit: r685371 - in
/velocity/engine/trunk/src/java/org/apache/velocity/app/event:
EventCartridge.java EventHandlerUtil.java
Author: nbubna
Date: Tue Aug 12 16:38:15 2008
New Revision: 685371
URL: http://svn.apache.org/viewvc?rev=685371&view=rev
Log:
improve event handler performance (thx to Jarkko Viinamaki in patch for VELOCITY-607)
Modified:
velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventCartridge.java
velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventHandlerUtil.java
Modified: velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventCartridge.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventCartridge.java?rev=685371&r1=685370&r2=685371&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventCartridge.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventCartridge.java Tue Aug 12 16:38:15 2008
@@ -204,11 +204,11 @@
/**
* Iterate through all the stored ReferenceInsertionEventHandler objects
*
- * @return iterator of handler objects
+ * @return iterator of handler objects, null if there are not handlers
*/
public Iterator getReferenceInsertionEventHandlers()
{
- return referenceHandlers.iterator();
+ return referenceHandlers.size() == 0 ? null : referenceHandlers.iterator();
}
/**
Modified: velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventHandlerUtil.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventHandlerUtil.java?rev=685371&r1=685370&r2=685371&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventHandlerUtil.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/app/event/EventHandlerUtil.java Tue Aug 12 16:38:15 2008
@@ -43,6 +43,8 @@
/**
* Called before a reference is inserted. All event handlers are called in
* sequence. The default implementation inserts the reference as is.
+ *
+ * This is a major hotspot method called by ASTReference render.
*
* @param reference reference from template about to be inserted
* @param value value about to be inserted (after toString() )
@@ -54,6 +56,12 @@
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();
@@ -65,14 +73,31 @@
try
{
- EventHandlerMethodExecutor methodExecutor =
- new ReferenceInsertionEventHandler.referenceInsertExecutor(context, reference, value);
+ /*
+ * 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 )
+ {
+ if( methodExecutor == null )
+ methodExecutor =
+ new ReferenceInsertionEventHandler.referenceInsertExecutor(context, reference, value);
+
+ iterateOverEventHandlers(contextEventHandlerIterator, methodExecutor);
+ }
- callEventHandlers(
- applicationEventHandlerIterator,
- contextEventHandlerIterator, methodExecutor);
- return methodExecutor.getReturnValue();
+ return methodExecutor != null ? methodExecutor.getReturnValue() : value;
}
catch (RuntimeException e)
{
@@ -83,7 +108,7 @@
throw ExceptionUtils.createRuntimeException("Exception in event handler.",e);
}
}
-
+
/**
* Called when a null is evaluated during a #set. All event handlers are
* called in sequence until a false is returned. The default implementation