From 7830fe25b88fb1afb10339241a6e46150ea3c2d2 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 17 Nov 2019 09:51:49 +0100 Subject: [PATCH] Resolves problem with setting varargs parameter --- src/main/java/ognl/OgnlRuntime.java | 8 +++-- src/test/java/ognl/OgnlRuntimeTest.java | 48 +++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/main/java/ognl/OgnlRuntime.java b/src/main/java/ognl/OgnlRuntime.java index f30357fa..870fb997 100644 --- a/src/main/java/ognl/OgnlRuntime.java +++ b/src/main/java/ognl/OgnlRuntime.java @@ -1913,8 +1913,12 @@ public static Object callAppropriateMethod(OgnlContext context, Object source, O { varArgs = new Object[0]; } - - convertedArgs[i] = varArgs; + // If this is the only parameter, explode the array + if (actualArgs.length == 1) { + convertedArgs = varArgs; + } else { // there are more parameters, varargs is the last one + convertedArgs[i] = varArgs; + } break; } } diff --git a/src/test/java/ognl/OgnlRuntimeTest.java b/src/test/java/ognl/OgnlRuntimeTest.java index 3f76af79..4c12dcf4 100644 --- a/src/test/java/ognl/OgnlRuntimeTest.java +++ b/src/test/java/ognl/OgnlRuntimeTest.java @@ -1,5 +1,6 @@ package ognl; +import org.hamcrest.core.IsEqual; import org.junit.Assert; import org.junit.Test; @@ -7,6 +8,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -500,4 +502,50 @@ public void testUseFirstMatchGetSetStateFlag() { optionDefinedInEnvironment ? flagValueFromEnvironment : defaultValue, OgnlRuntime.getUseFirstMatchGetSetLookupValue()); } + private Map defaultContext = Ognl.createDefaultContext(null, new DefaultMemberAccess(false)); + + @Test // Success + public void testForArray() throws Exception { + Bean bean = new Bean(); + Ognl.setValue("chars", defaultContext, bean, new Character[]{'%', '_'}); + Assert.assertThat(bean.chars.length, IsEqual.equalTo(2)); + Assert.assertThat(bean.chars[0], IsEqual.equalTo('%')); + Assert.assertThat(bean.chars[1], IsEqual.equalTo('_')); + } + + @Test // Fail + public void testForVarArgs() throws Exception { + Bean bean = new Bean(); + Ognl.setValue("strings", defaultContext, bean, new String[]{"%", "_"}); + Assert.assertThat(bean.strings.length, IsEqual.equalTo(2)); + Assert.assertThat(bean.strings[0], IsEqual.equalTo("%")); + Assert.assertThat(bean.strings[1], IsEqual.equalTo("_")); + } + + static class Bean { + private Character[] chars; + private Integer index; + private String[] strings; + + public void setChars(Character[] chars) { + this.chars = chars; + } + public Character[] getChars() { + return chars; + } + public void setStrings(String... strings) { + this.strings = strings; + } + public String[] getStrings() { + return strings; + } + public void setMix(Integer index, String... strings) { + this.index = index; + this.strings = strings; + } + public Integer getIndex() { + return index; + } + } + }