Author: markt
Date: Tue Jan  4 14:22:52 2011
New Revision: 1055055

URL: http://svn.apache.org/viewvc?rev=1055055&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50500
Use correct coercions (as per the EL spec) for arithmetic operations involving 
string values containing '.', 'e' or 'E'. Based on a patch by Brian Weisleder.
Added:
    tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/el/lang/ELArithmetic.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/el/lang/ELArithmetic.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/lang/ELArithmetic.java?rev=1055055&r1=1055054&r2=1055055&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/lang/ELArithmetic.java (original)
+++ tomcat/trunk/java/org/apache/el/lang/ELArithmetic.java Tue Jan  4 14:22:52 
2011
@@ -257,9 +257,12 @@ public abstract class ELArithmetic {
         final ELArithmetic delegate;
         if (BIGDECIMAL.matches(obj0, obj1))
             delegate = BIGDECIMAL;
-        else if (DOUBLE.matches(obj0, obj1))
-            delegate = DOUBLE;
-        else if (BIGINTEGER.matches(obj0, obj1))
+        else if (DOUBLE.matches(obj0, obj1)) {
+            if (BIGINTEGER.matches(obj0, obj1))
+                delegate = BIGDECIMAL;
+            else
+                delegate = DOUBLE;
+        } else if (BIGINTEGER.matches(obj0, obj1))
             delegate = BIGINTEGER;
         else
             delegate = LONG;
@@ -277,7 +280,7 @@ public abstract class ELArithmetic {
 
         final ELArithmetic delegate;
         if (BIGDECIMAL.matches(obj0, obj1))
-            delegate = BIGDECIMAL;
+            delegate = DOUBLE;
         else if (DOUBLE.matches(obj0, obj1))
             delegate = DOUBLE;
         else if (BIGINTEGER.matches(obj0, obj1))
@@ -299,9 +302,12 @@ public abstract class ELArithmetic {
         final ELArithmetic delegate;
         if (BIGDECIMAL.matches(obj0, obj1))
             delegate = BIGDECIMAL;
-        else if (DOUBLE.matches(obj0, obj1))
-            delegate = DOUBLE;
-        else if (BIGINTEGER.matches(obj0, obj1))
+        else if (DOUBLE.matches(obj0, obj1)) {
+            if (BIGINTEGER.matches(obj0, obj1))
+                delegate = BIGDECIMAL;
+            else
+                delegate = DOUBLE;
+        } else if (BIGINTEGER.matches(obj0, obj1))
             delegate = BIGINTEGER;
         else
             delegate = LONG;
@@ -339,9 +345,12 @@ public abstract class ELArithmetic {
         final ELArithmetic delegate;
         if (BIGDECIMAL.matches(obj0, obj1))
             delegate = BIGDECIMAL;
-        else if (DOUBLE.matches(obj0, obj1))
-            delegate = DOUBLE;
-        else if (BIGINTEGER.matches(obj0, obj1))
+        else if (DOUBLE.matches(obj0, obj1)) {
+            if (BIGINTEGER.matches(obj0, obj1))
+                delegate = BIGDECIMAL;
+            else
+                delegate = DOUBLE;
+        } else if (BIGINTEGER.matches(obj0, obj1))
             delegate = BIGINTEGER;
         else
             delegate = LONG;

Added: tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java?rev=1055055&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java (added)
+++ tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java Tue Jan  4 
14:22:52 2011
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.el.lang;
+
+import java.math.BigInteger;
+
+import junit.framework.TestCase;
+
+public class TestELArithmetic extends TestCase {
+    private final String a = "1.1";
+    private final BigInteger b = new BigInteger("1000000000000000000000");
+
+    public void testAdd() throws Exception {
+        assertEquals("1000000000000000000001.1",
+                String.valueOf(ELArithmetic.add(a, b)));
+    }
+
+    public void testSubtract() throws Exception {
+        assertEquals("-999999999999999999998.9",
+                String.valueOf(ELArithmetic.subtract(a, b)));
+    }
+
+    public void testMultiply() throws Exception {
+        assertEquals("1100000000000000000000.0",
+                String.valueOf(ELArithmetic.multiply(a, b)));
+    }
+
+    public void testDivide() throws Exception {
+        assertEquals("0.0",
+                String.valueOf(ELArithmetic.divide(a, b)));
+    }
+
+    public void testMod() throws Exception {
+        assertEquals("1.1",
+                String.valueOf(ELArithmetic.mod(a, b)));
+    }
+}

Propchange: tomcat/trunk/test/org/apache/el/lang/TestELArithmetic.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1055055&r1=1055054&r2=1055055&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Jan  4 14:22:52 2011
@@ -196,6 +196,12 @@
         instance in <code>JspDocumentParser</code> and
         <code>ProxyDirContext</code>. (kkolinko)
       </fix>
+      <fix>
+        <bug>50500</bug>: Use correct coercions (as per the EL spec) for
+        arithmetic operations involving string values containing &apos;.&apos;,
+        &apos;e&apos; or &apos;E&apos;. Based on a patch by Brian Weisleder.
+        (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

Reply via email to