Author: henrib
Date: Thu Dec 15 23:10:21 2011
New Revision: 1214986

URL: http://svn.apache.org/viewvc?rev=1214986&view=rev
Log:
Fix for JEXL-124

Modified:
    
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/main/java/org/apache/commons/jexl2/internal/MethodExecutor.java
    
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/test/java/org/apache/commons/jexl2/IssuesTest.java

Modified: 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/main/java/org/apache/commons/jexl2/internal/MethodExecutor.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/main/java/org/apache/commons/jexl2/internal/MethodExecutor.java?rev=1214986&r1=1214985&r2=1214986&view=diff
==============================================================================
--- 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/main/java/org/apache/commons/jexl2/internal/MethodExecutor.java
 (original)
+++ 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/main/java/org/apache/commons/jexl2/internal/MethodExecutor.java
 Thu Dec 15 23:10:21 2011
@@ -27,6 +27,7 @@ import org.apache.commons.jexl2.internal
 public final class MethodExecutor extends AbstractExecutor.Method {
     /** Whether this method handles varargs. */
     private final boolean isVarArgs;
+
     /**
      * Creates a new instance.
      * @param is the introspector used to discover the method
@@ -49,7 +50,7 @@ public final class MethodExecutor extend
      */
     @Override
     public Object execute(Object o, Object[] args)
-        throws IllegalAccessException, InvocationTargetException  {
+            throws IllegalAccessException, InvocationTargetException {
         if (isVarArgs) {
             Class<?>[] formal = method.getParameterTypes();
             int index = formal.length - 1;
@@ -83,7 +84,6 @@ public final class MethodExecutor extend
         return TRY_FAILED;
     }
 
-
     /**
      * Discovers a method for a {@link MethodExecutor}.
      * <p>
@@ -131,12 +131,16 @@ public final class MethodExecutor extend
         // if no values are being passed into the vararg, size == 0
         if (size == 1) {
             // if one non-null value is being passed into the vararg,
+            // and that arg is not the sole argument and not an array of the 
expected type,
             // make the last arg an array of the expected type
             if (actual[index] != null) {
-                // create a 1-length array to hold and replace the last 
argument
-                Object lastActual = Array.newInstance(type, 1);
-                Array.set(lastActual, 0, actual[index]);
-                actual[index] = lastActual;
+                Class<?> aclazz = actual[index].getClass();
+                if (!aclazz.isArray() || 
!aclazz.getComponentType().equals(type)) {
+                    // create a 1-length array to hold and replace the last 
argument
+                    Object lastActual = Array.newInstance(type, 1);
+                    Array.set(lastActual, 0, actual[index]);
+                    actual[index] = lastActual;
+                }
             }
             // else, the vararg is null and used as is, considered as T[]
         } else {
@@ -158,7 +162,7 @@ public final class MethodExecutor extend
         return actual;
     }
 
-   /**
+    /**
      * Determines if a method can accept a variable number of arguments.
      * @param m a the method to check
      * @return true if method is vararg, false otherwise
@@ -175,5 +179,3 @@ public final class MethodExecutor extend
         }
     }
 }
-
-

Modified: 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/test/java/org/apache/commons/jexl2/IssuesTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/test/java/org/apache/commons/jexl2/IssuesTest.java?rev=1214986&r1=1214985&r2=1214986&view=diff
==============================================================================
--- 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/test/java/org/apache/commons/jexl2/IssuesTest.java
 (original)
+++ 
commons/proper/jexl/tags/COMMONS_JEXL_2_1-RC3/src/test/java/org/apache/commons/jexl2/IssuesTest.java
 Thu Dec 15 23:10:21 2011
@@ -827,4 +827,27 @@ public class IssuesTest extends JexlTest
         result = get1.execute(null, quux);
         assertEquals(24, result);
     }
+    
+    public static class Jeff {
+        public String concat(String... strs) {
+            if (strs.length > 0) {
+                StringBuilder strb = new StringBuilder(strs[0]);
+                for(int s = 1; s < strs.length; ++s) {
+                    strb.append(", ");
+                    strb.append(strs[s]);
+                }
+                return strb.toString();
+            } else {
+                return "";
+            }
+            
+        }
+    }
+    
+    public void test124() throws Exception {
+        JexlEngine jexl = new JexlEngine();
+        Script script = jexl.createScript("jeff.concat(['1', '2', '3'])", 
"jeff");
+        Object res = script.execute(null, new Jeff());
+        assertEquals("1, 2, 3", res);
+    }
 }


Reply via email to