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); + } }