From: markt Date: Tue, 4 Jan 2011 14:22:52 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50500 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=7626a312292576386ad3d1a69f497daeeccea2ba;p=tomcat7.0 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. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1055055 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/el/lang/ELArithmetic.java b/java/org/apache/el/lang/ELArithmetic.java index 81424f815..7ae39f015 100644 --- a/java/org/apache/el/lang/ELArithmetic.java +++ b/java/org/apache/el/lang/ELArithmetic.java @@ -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 index 000000000..f891836d9 --- /dev/null +++ b/test/org/apache/el/lang/TestELArithmetic.java @@ -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))); + } +} diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 64abb7efa..cbdb4418b 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -196,6 +196,12 @@ instance in JspDocumentParser and ProxyDirContext. (kkolinko) + + 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. + (markt) +