You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2016/07/22 07:32:50 UTC

svn commit: r1753755 - in /velocity/engine/trunk/velocity-engine-core/src: main/java/org/apache/velocity/runtime/parser/node/ main/java/org/apache/velocity/util/ main/java/org/apache/velocity/util/introspection/ test/java/org/apache/velocity/test/

Author: cbrisson
Date: Fri Jul 22 07:32:50 2016
New Revision: 1753755

URL: http://svn.apache.org/viewvc?rev=1753755&view=rev
Log:
[engine] support .empty; fixes VELOCITY-843

Modified:
    velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java
    velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java
    velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java
    velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
    velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java

Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java?rev=1753755&r1=1753754&r2=1753755&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java Fri Jul 22 07:32:50 2016
@@ -46,9 +46,23 @@ public class BooleanPropertyExecutor ext
      * @since 1.5
      */
     public BooleanPropertyExecutor(final Logger log, final Introspector introspector,
-            final Class clazz, final String property)
+                                   final Class clazz, final String property)
     {
-        super(log, introspector, clazz, property);
+        this(log, introspector, clazz, property, false);
+    }
+
+    /**
+     * @param log
+     * @param introspector
+     * @param clazz
+     * @param property
+     * @maram wrapArray
+     * @since 1.5
+     */
+    public BooleanPropertyExecutor(final Logger log, final Introspector introspector,
+            final Class clazz, final String property, final boolean wrapArray)
+    {
+        super(log, introspector, clazz, property, wrapArray);
     }
 
     protected void discover(final Class clazz, final String property)

Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java?rev=1753755&r1=1753754&r2=1753755&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java Fri Jul 22 07:32:50 2016
@@ -21,6 +21,7 @@ package org.apache.velocity.runtime.pars
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.velocity.exception.VelocityException;
+import org.apache.velocity.util.ArrayListWrapper;
 import org.apache.velocity.util.introspection.Introspector;
 import org.slf4j.Logger;
 
@@ -32,6 +33,7 @@ import java.lang.reflect.InvocationTarge
 public class PropertyExecutor extends AbstractExecutor
 {
     private final Introspector introspector;
+    private final boolean wrapArray;
 
     /**
      * @param log
@@ -41,10 +43,25 @@ public class PropertyExecutor extends Ab
      * @since 1.5
      */
     public PropertyExecutor(final Logger log, final Introspector introspector,
-            final Class clazz, final String property)
+                            final Class clazz, final String property)
+    {
+        this(log, introspector, clazz, property, false);
+    }
+
+    /**
+     * @param log
+     * @param introspector
+     * @param clazz
+     * @param property
+     * @param wrapArray
+     * @since 1.5
+     */
+    public PropertyExecutor(final Logger log, final Introspector introspector,
+            final Class clazz, final String property, final boolean wrapArray)
     {
         this.log = log;
         this.introspector = introspector;
+        this.wrapArray = wrapArray;
 
         // Don't allow passing in the empty string or null because
         // it will either fail with a StringIndexOutOfBounds error
@@ -124,6 +141,10 @@ public class PropertyExecutor extends Ab
     public Object execute(Object o)
         throws IllegalAccessException,  InvocationTargetException
     {
+        if (wrapArray)
+        {
+            o = new ArrayListWrapper(o);
+        }
         return isAlive() ? getMethod().invoke(o, ((Object []) null)) : null;
     }
 }

Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java?rev=1753755&r1=1753754&r2=1753755&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java Fri Jul 22 07:32:50 2016
@@ -55,4 +55,9 @@ public class ArrayListWrapper extends Ab
         return Array.getLength(array);
     }
 
+    public boolean isEmpty()
+    {
+        return Array.getLength(array) == 0;
+    }
+
 }

Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java?rev=1753755&r1=1753754&r2=1753755&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java Fri Jul 22 07:32:50 2016
@@ -292,6 +292,15 @@ public class UberspectImpl implements Ub
                                                    identifier);
         }
 
+        /*
+         * and idem on an array
+         */
+        if (!executor.isAlive() && obj.getClass().isArray())
+        {
+            executor = new BooleanPropertyExecutor(log, introspector, ArrayListWrapper.class,
+                    identifier, true);
+        }
+
         return (executor.isAlive()) ? new VelGetterImpl(executor) : null;
     }
 

Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java?rev=1753755&r1=1753754&r2=1753755&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java Fri Jul 22 07:32:50 2016
@@ -112,6 +112,8 @@ public class ArrayMethodsTestCase extend
         boolean isEmpty = (size == 0);
         checkResult("isEmpty()", String.valueOf(isEmpty), compareToList);
 
+        checkPropertyResult("empty", String.valueOf(isEmpty), compareToList);
+
         // check that the wrapping doesn't apply to java.lang.Object methods
         // such as toString() (for backwards compatibility).
         assertFalse(evaluate("$array").equals(evaluate("$list")));
@@ -175,13 +177,33 @@ public class ArrayMethodsTestCase extend
             assertEquals(result, listResult);
         }
 
-        info("    <$!array."+method+"> resolved to <"+result+">");
+        info("    <$!array." + method + "> resolved to <" + result + ">");
         if (compareToList)
         {
             info("    <$!list."+method+"> resolved to "+listResult+">");
         }
     }
 
+    private void checkPropertyResult(String property, String expected,
+                             boolean compareToList) throws Exception
+    {
+        String result = evaluate("$!array."+property);
+        assertEquals(expected, result);
+
+        String listResult = null;
+        if (compareToList)
+        {
+            listResult = evaluate("$!list."+property);
+            assertEquals(result, listResult);
+        }
+
+        info("    <$!array."+property+"> resolved to <"+result+">");
+        if (compareToList)
+        {
+            info("    <$!list."+property+"> resolved to "+listResult+">");
+        }
+    }
+
 }