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