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 '.', + 'e' or 'E'. 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