Author: musachy
Date: Mon Aug 10 23:30:03 2009
New Revision: 802956

URL: http://svn.apache.org/viewvc?rev=802956&view=rev
Log:
WW-2807  Improve Velocity tag syntax and performance

thanks to Christopher Schultz for patch

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java?rev=802956&r1=802955&r2=802956&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/velocity/components/AbstractDirective.java
 Mon Aug 10 23:30:03 2009
@@ -94,15 +94,34 @@
      *          if the was an error in the format of the property
      */
     protected Map createPropertyMap(InternalContextAdapter contextAdapter, 
Node node) throws ParseErrorException, MethodInvocationException {
-        Map propertyMap = new HashMap();
+        Map propertyMap;
 
         int children = node.jjtGetNumChildren();
         if (getType() == BLOCK) {
             children--;
         }
 
-        for (int index = 0, length = children; index < length; index++) {
-            this.putProperty(propertyMap, contextAdapter, 
node.jjtGetChild(index));
+        // Velocity supports an on-the-fly Map-definition syntax that leads
+        // to more readable and faster code:
+        //
+        //    #url({'id':'url', 'action':'MyAction'})
+        //
+        // We support this syntax by checking for a single Map argument
+        // to any directive and using that as the property map instead
+        // of building one from individual name-value pair strings.
+        Node firstChild = null;
+        Object firstValue = null;
+        if(children == 1
+           && null != (firstChild = node.jjtGetChild(0))
+           && null != (firstValue = firstChild.value(contextAdapter))
+           && firstValue instanceof Map) {
+            propertyMap = (Map)firstValue;
+        } else {
+            propertyMap = new HashMap();
+
+            for (int index = 0, length = children; index < length; index++) {
+                this.putProperty(propertyMap, contextAdapter, 
node.jjtGetChild(index));
+            }
         }
 
         return propertyMap;


Reply via email to