Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50500
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 4 Jan 2011 14:22:52 +0000 (14:22 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 4 Jan 2011 14:22:52 +0000 (14:22 +0000)
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.

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1055055 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/el/lang/ELArithmetic.java
test/org/apache/el/lang/TestELArithmetic.java [new file with mode: 0644]
webapps/docs/changelog.xml

index 81424f8..7ae39f0 100644 (file)
@@ -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;
diff --git a/test/org/apache/el/lang/TestELArithmetic.java b/test/org/apache/el/lang/TestELArithmetic.java
new file mode 100644 (file)
index 0000000..f891836
--- /dev/null
@@ -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)));
+    }
+}
index 64abb7e..cbdb441 100644 (file)
         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">