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