1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.el;
18
19 import java.math.BigDecimal;
20
21 import javax.servlet.jsp.el.ELException;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25
26 /**
27 *
28 * <p>The implementation of the divide operator
29 *
30 * @author Nathan Abramson - Art Technology Group
31 * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: bayard $
32 **/
33
34 public class DivideOperator
35 extends BinaryOperator
36 {
37 //-------------------------------------
38 // Constants
39 //-------------------------------------
40 private static Log log = LogFactory.getLog(DivideOperator.class);
41
42 //-------------------------------------
43 // Singleton
44 //-------------------------------------
45
46 public static final DivideOperator SINGLETON =
47 new DivideOperator ();
48
49 //-------------------------------------
50 /**
51 *
52 * Constructor
53 **/
54 public DivideOperator ()
55 {
56 }
57
58 //-------------------------------------
59 // Expression methods
60 //-------------------------------------
61 /**
62 *
63 * Returns the symbol representing the operator
64 **/
65 public String getOperatorSymbol ()
66 {
67 return "/";
68 }
69
70 //-------------------------------------
71 /**
72 *
73 * Applies the operator to the given value
74 **/
75 public Object apply (Object pLeft,
76 Object pRight)
77 throws ELException
78 {
79 if (pLeft == null &&
80 pRight == null) {
81 if (log.isWarnEnabled()) {
82 log.warn(
83 MessageUtil.getMessageWithArgs(
84 Constants.ARITH_OP_NULL,
85 getOperatorSymbol()));
86 }
87 return PrimitiveObjects.getInteger (0);
88 }
89
90 if (Coercions.isBigDecimal(pLeft) ||
91 Coercions.isBigInteger(pLeft) ||
92 Coercions.isBigDecimal(pRight) ||
93 Coercions.isBigInteger(pRight)) {
94
95 BigDecimal left = (BigDecimal)
96 Coercions.coerceToPrimitiveNumber(pLeft, BigDecimal.class);
97 BigDecimal right = (BigDecimal)
98 Coercions.coerceToPrimitiveNumber(pRight, BigDecimal.class);
99
100 try {
101 return left.divide(right, BigDecimal.ROUND_HALF_UP);
102 } catch (Exception exc) {
103 if (log.isErrorEnabled()) {
104 String message = MessageUtil.getMessageWithArgs(
105 Constants.ARITH_ERROR,
106 getOperatorSymbol(),
107 "" + left,
108 "" + right);
109 log.error(message);
110 throw new ELException(message);
111 }
112 return PrimitiveObjects.getInteger(0);
113 }
114 } else {
115
116 double left =
117 Coercions.coerceToPrimitiveNumber(pLeft, Double.class).
118 doubleValue();
119 double right =
120 Coercions.coerceToPrimitiveNumber(pRight, Double.class).
121 doubleValue();
122
123 try {
124 return PrimitiveObjects.getDouble(left / right);
125 } catch (Exception exc) {
126 if (log.isErrorEnabled()) {
127 String message = MessageUtil.getMessageWithArgs(
128 Constants.ARITH_ERROR,
129 getOperatorSymbol(),
130 "" + left,
131 "" + right);
132 log.error(message);
133 throw new ELException(message);
134 }
135 return PrimitiveObjects.getInteger(0);
136 }
137 }
138 }
139
140 //-------------------------------------
141 }