Author: markt Date: Sun Oct 3 19:16:32 2010 New Revision: 1004027 URL: http://svn.apache.org/viewvc?rev=1004027&view=rev Log: Improve handling of setting primitive values on beans.
Modified: tomcat/trunk/java/org/apache/el/util/ReflectionUtil.java tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java tomcat/trunk/test/org/apache/el/TesterBeanA.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/el/util/ReflectionUtil.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/util/ReflectionUtil.java?rev=1004027&r1=1004026&r2=1004027&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/util/ReflectionUtil.java (original) +++ tomcat/trunk/java/org/apache/el/util/ReflectionUtil.java Sun Oct 3 19:16:32 2010 @@ -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(); Modified: tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java?rev=1004027&r1=1004026&r2=1004027&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java (original) +++ tomcat/trunk/test/org/apache/el/TestMethodExpressionImpl.java Sun Oct 3 19:16:32 2010 @@ -326,4 +326,13 @@ public class TestMethodExpressionImpl ex "#{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)); + } } Modified: tomcat/trunk/test/org/apache/el/TesterBeanA.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/TesterBeanA.java?rev=1004027&r1=1004026&r2=1004027&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/TesterBeanA.java (original) +++ tomcat/trunk/test/org/apache/el/TesterBeanA.java Sun Oct 3 19:16:32 2010 @@ -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; + } } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1004027&r1=1004026&r2=1004027&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Sun Oct 3 19:16:32 2010 @@ -282,6 +282,10 @@ <fix> <bug>49985</bug>: Fix thread safety issue in EL parser. (markt) </fix> + <fix> + Correctly handle the setting of primitve bean values via expression + language. (markt) + </fix> </changelog> </subsection> <subsection name="Cluster"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org