From b06426278226a3da8cb02a92ee9197465102cf85 Mon Sep 17 00:00:00 2001 From: markt Date: Sun, 3 Oct 2010 19:16:32 +0000 Subject: [PATCH] Improve handling of setting primitive values on beans. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1004027 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/el/util/ReflectionUtil.java | 31 ++++++++++++++++++++++-- test/org/apache/el/TestMethodExpressionImpl.java | 9 +++++++ test/org/apache/el/TesterBeanA.java | 9 +++++++ webapps/docs/changelog.xml | 4 +++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/java/org/apache/el/util/ReflectionUtil.java b/java/org/apache/el/util/ReflectionUtil.java index 83331f463..37356f73e 100644 --- a/java/org/apache/el/util/ReflectionUtil.java +++ b/java/org/apache/el/util/ReflectionUtil.java @@ -171,14 +171,14 @@ public class ReflectionUtil { } else if (i == (mParamCount - 1) && m.isVarArgs()) { Class varType = mParamTypes[i].getComponentType(); for (int j = i; j < paramCount; j++) { - if (!varType.isAssignableFrom(paramTypes[j])) { + if (!isAssignableFrom(paramTypes[j], varType)) { break; } // Don't treat a varArgs match as an exact match, it can // lead to a varArgs method matching when the result // should be ambiguous } - } else if (!mParamTypes[i].isAssignableFrom(paramTypes[i])) { + } else if (!isAssignableFrom(paramTypes[i], mParamTypes[i])) { noMatch = true; break; } @@ -281,6 +281,33 @@ public class ReflectionUtil { return null; } + // src will always be an object + private static boolean isAssignableFrom(Class src, Class target) { + Class targetClass; + if (target.isPrimitive()) { + if (target == Boolean.TYPE) { + targetClass = Boolean.class; + } else if (target == Character.TYPE) { + targetClass = Character.class; + } else if (target == Byte.TYPE) { + targetClass = Byte.class; + } else if (target == Short.TYPE) { + targetClass = Short.class; + } else if (target == Integer.TYPE) { + targetClass = Integer.class; + } else if (target == Long.TYPE) { + targetClass = Long.class; + } else if (target == Float.TYPE) { + targetClass = Float.class; + } else { + targetClass = Double.class; + } + } else { + targetClass = target; + } + return targetClass.isAssignableFrom(src); + } + protected static final String paramString(Class[] types) { if (types != null) { StringBuilder sb = new StringBuilder(); diff --git a/test/org/apache/el/TestMethodExpressionImpl.java b/test/org/apache/el/TestMethodExpressionImpl.java index 7e4887308..ff28ccb97 100644 --- a/test/org/apache/el/TestMethodExpressionImpl.java +++ b/test/org/apache/el/TestMethodExpressionImpl.java @@ -326,4 +326,13 @@ public class TestMethodExpressionImpl extends TestCase { "#{beanA.name}", java.lang.String.class); assertEquals("New value", ve.getValue(context)); } + + public void testBugPrimitives() throws Exception { + MethodExpression me = factory.createMethodExpression(context, + "${beanA.setValLong(5)}", null, null); + me.invoke(context, null); + ValueExpression ve = factory.createValueExpression(context, + "#{beanA.valLong}", java.lang.String.class); + assertEquals("5", ve.getValue(context)); + } } diff --git a/test/org/apache/el/TesterBeanA.java b/test/org/apache/el/TesterBeanA.java index 258145ff6..11d24c4d4 100644 --- a/test/org/apache/el/TesterBeanA.java +++ b/test/org/apache/el/TesterBeanA.java @@ -20,6 +20,7 @@ package org.apache.el; public class TesterBeanA { private TesterBeanB bean; private String name; + private long valLong; public TesterBeanB getBean() { return bean; @@ -36,4 +37,12 @@ public class TesterBeanA { public void setName(String name) { this.name = name; } + + public long getValLong() { + return valLong; + } + + public void setValLong(long valLong) { + this.valLong = valLong; + } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 3b5cb2f8f..de12cd205 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -282,6 +282,10 @@ 49985: Fix thread safety issue in EL parser. (markt) + + Correctly handle the setting of primitve bean values via expression + language. (markt) + -- 2.11.0