Improve handling of setting primitive values on beans.
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Sun, 3 Oct 2010 19:16:32 +0000 (19:16 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Sun, 3 Oct 2010 19:16:32 +0000 (19:16 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1004027 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/el/util/ReflectionUtil.java
test/org/apache/el/TestMethodExpressionImpl.java
test/org/apache/el/TesterBeanA.java
webapps/docs/changelog.xml

index 83331f4..37356f7 100644 (file)
@@ -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();
index 7e48873..ff28ccb 100644 (file)
@@ -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));
+    }
 }
index 258145f..11d24c4 100644 (file)
@@ -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;
+    }
 }
index 3b5cb2f..de12cd2 100644 (file)
       <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">