You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/10/03 21:16:33 UTC
svn commit: r1004027 - in /tomcat/trunk:
java/org/apache/el/util/ReflectionUtil.java
test/org/apache/el/TestMethodExpressionImpl.java
test/org/apache/el/TesterBeanA.java webapps/docs/changelog.xml
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org