KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > el > lang > ELArithmetic


1 /*
2  * The contents of this file are subject to the terms
3  * of the Common Development and Distribution License
4  * (the "License"). You may not use this file except
5  * in compliance with the License.
6  *
7  * You can obtain a copy of the license at
8  * glassfish/bootstrap/legal/CDDLv1.0.txt or
9  * https://glassfish.dev.java.net/public/CDDLv1.0.html.
10  * See the License for the specific language governing
11  * permissions and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL
14  * HEADER in each file and include the License file at
15  * glassfish/bootstrap/legal/CDDLv1.0.txt. If applicable,
16  * add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your
18  * own identifying information: Portions Copyright [yyyy]
19  * [name of copyright owner]
20  *
21  * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
22  *
23  * Portions Copyright Apache Software Foundation.
24  */

25 package com.sun.el.lang;
26
27 import java.math.BigDecimal JavaDoc;
28 import java.math.BigInteger JavaDoc;
29
30 import com.sun.el.util.MessageFactory;
31
32 /**
33  * A helper class of Arithmetic defined by the EL Specification
34  * @author Jacob Hookom [jacob@hookom.net]
35  * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: kchung $
36  */

37 public abstract class ELArithmetic {
38
39     public final static class BigDecimalDelegate extends ELArithmetic {
40
41         protected Number JavaDoc add(Number JavaDoc num0, Number JavaDoc num1) {
42             return ((BigDecimal JavaDoc) num0).add((BigDecimal JavaDoc) num1);
43         }
44
45         protected Number JavaDoc coerce(Number JavaDoc num) {
46             if (num instanceof BigDecimal JavaDoc)
47                 return num;
48             if (num instanceof BigInteger JavaDoc)
49                 return new BigDecimal JavaDoc((BigInteger JavaDoc) num);
50             return new BigDecimal JavaDoc(num.doubleValue());
51         }
52
53         protected Number JavaDoc coerce(String JavaDoc str) {
54             return new BigDecimal JavaDoc(str);
55         }
56
57         protected Number JavaDoc divide(Number JavaDoc num0, Number JavaDoc num1) {
58             return ((BigDecimal JavaDoc) num0).divide((BigDecimal JavaDoc) num1,
59                     BigDecimal.ROUND_HALF_UP);
60         }
61
62         protected Number JavaDoc subtract(Number JavaDoc num0, Number JavaDoc num1) {
63             return ((BigDecimal JavaDoc) num0).subtract((BigDecimal JavaDoc) num1);
64         }
65
66         protected Number JavaDoc mod(Number JavaDoc num0, Number JavaDoc num1) {
67             return new Double JavaDoc(num0.doubleValue() % num1.doubleValue());
68         }
69
70         protected Number JavaDoc multiply(Number JavaDoc num0, Number JavaDoc num1) {
71             return ((BigDecimal JavaDoc) num0).multiply((BigDecimal JavaDoc) num1);
72         }
73
74         public boolean matches(Object JavaDoc obj0, Object JavaDoc obj1) {
75             return (obj0 instanceof BigDecimal JavaDoc || obj1 instanceof BigDecimal JavaDoc);
76         }
77     }
78
79     public final static class BigIntegerDelegate extends ELArithmetic {
80
81         protected Number JavaDoc add(Number JavaDoc num0, Number JavaDoc num1) {
82             return ((BigInteger JavaDoc) num0).add((BigInteger JavaDoc) num1);
83         }
84
85         protected Number JavaDoc coerce(Number JavaDoc num) {
86             if (num instanceof BigInteger JavaDoc)
87                 return num;
88             return new BigInteger JavaDoc(num.toString());
89         }
90
91         protected Number JavaDoc coerce(String JavaDoc str) {
92             return new BigInteger JavaDoc(str);
93         }
94
95         protected Number JavaDoc divide(Number JavaDoc num0, Number JavaDoc num1) {
96             return (new BigDecimal JavaDoc((BigInteger JavaDoc) num0)).divide(new BigDecimal JavaDoc((BigInteger JavaDoc) num1), BigDecimal.ROUND_HALF_UP);
97         }
98
99         protected Number JavaDoc multiply(Number JavaDoc num0, Number JavaDoc num1) {
100             return ((BigInteger JavaDoc) num0).multiply((BigInteger JavaDoc) num1);
101         }
102
103         protected Number JavaDoc mod(Number JavaDoc num0, Number JavaDoc num1) {
104             return ((BigInteger JavaDoc) num0).mod((BigInteger JavaDoc) num1);
105         }
106
107         protected Number JavaDoc subtract(Number JavaDoc num0, Number JavaDoc num1) {
108             return ((BigInteger JavaDoc) num0).subtract((BigInteger JavaDoc) num1);
109         }
110
111         public boolean matches(Object JavaDoc obj0, Object JavaDoc obj1) {
112             return (obj0 instanceof BigInteger JavaDoc || obj1 instanceof BigInteger JavaDoc);
113         }
114     }
115
116     public final static class DoubleDelegate extends ELArithmetic {
117
118         protected Number JavaDoc add(Number JavaDoc num0, Number JavaDoc num1) {
119             // could only be one of these
120
if (num0 instanceof BigDecimal JavaDoc) {
121                 return ((BigDecimal JavaDoc) num0).add(new BigDecimal JavaDoc(num1.doubleValue()));
122             } else if (num1 instanceof BigDecimal JavaDoc) {
123                 return ((new BigDecimal JavaDoc(num0.doubleValue()).add((BigDecimal JavaDoc) num1)));
124             }
125             return new Double JavaDoc(num0.doubleValue() + num1.doubleValue());
126         }
127
128         protected Number JavaDoc coerce(Number JavaDoc num) {
129             if (num instanceof Double JavaDoc)
130                 return num;
131             if (num instanceof BigInteger JavaDoc)
132                 return new BigDecimal JavaDoc((BigInteger JavaDoc) num);
133             return new Double JavaDoc(num.doubleValue());
134         }
135
136         protected Number JavaDoc coerce(String JavaDoc str) {
137             return new Double JavaDoc(str);
138         }
139
140         protected Number JavaDoc divide(Number JavaDoc num0, Number JavaDoc num1) {
141             return new Double JavaDoc(num0.doubleValue() / num1.doubleValue());
142         }
143
144         protected Number JavaDoc mod(Number JavaDoc num0, Number JavaDoc num1) {
145             return new Double JavaDoc(num0.doubleValue() % num1.doubleValue());
146         }
147
148         protected Number JavaDoc subtract(Number JavaDoc num0, Number JavaDoc num1) {
149             // could only be one of these
150
if (num0 instanceof BigDecimal JavaDoc) {
151                 return ((BigDecimal JavaDoc) num0).subtract(new BigDecimal JavaDoc(num1.doubleValue()));
152             } else if (num1 instanceof BigDecimal JavaDoc) {
153                 return ((new BigDecimal JavaDoc(num0.doubleValue()).subtract((BigDecimal JavaDoc) num1)));
154             }
155             return new Double JavaDoc(num0.doubleValue() - num1.doubleValue());
156         }
157
158         protected Number JavaDoc multiply(Number JavaDoc num0, Number JavaDoc num1) {
159             // could only be one of these
160
if (num0 instanceof BigDecimal JavaDoc) {
161                 return ((BigDecimal JavaDoc) num0).multiply(new BigDecimal JavaDoc(num1.doubleValue()));
162             } else if (num1 instanceof BigDecimal JavaDoc) {
163                 return ((new BigDecimal JavaDoc(num0.doubleValue()).multiply((BigDecimal JavaDoc) num1)));
164             }
165             return new Double JavaDoc(num0.doubleValue() * num1.doubleValue());
166         }
167
168         public boolean matches(Object JavaDoc obj0, Object JavaDoc obj1) {
169             return (obj0 instanceof Double JavaDoc
170                     || obj1 instanceof Double JavaDoc
171                     || obj0 instanceof Float JavaDoc
172                     || obj1 instanceof Float JavaDoc
173                     || (obj0 != null && (Double.TYPE == obj0.getClass() || Float.TYPE == obj0.getClass()))
174                     || (obj1 != null && (Double.TYPE == obj1.getClass() || Float.TYPE == obj1.getClass()))
175                     || (obj0 instanceof String JavaDoc && ELSupport
176                             .isStringFloat((String JavaDoc) obj0)) || (obj1 instanceof String JavaDoc && ELSupport
177                     .isStringFloat((String JavaDoc) obj1)));
178         }
179     }
180
181     public final static class LongDelegate extends ELArithmetic {
182
183         protected Number JavaDoc add(Number JavaDoc num0, Number JavaDoc num1) {
184             return new Long JavaDoc(num0.longValue() + num1.longValue());
185         }
186
187         protected Number JavaDoc coerce(Number JavaDoc num) {
188             if (num instanceof Long JavaDoc)
189                 return num;
190             return new Long JavaDoc(num.longValue());
191         }
192
193         protected Number JavaDoc coerce(String JavaDoc str) {
194             return new Long JavaDoc(str);
195         }
196
197         protected Number JavaDoc divide(Number JavaDoc num0, Number JavaDoc num1) {
198             return new Long JavaDoc(num0.longValue() / num1.longValue());
199         }
200
201         protected Number JavaDoc mod(Number JavaDoc num0, Number JavaDoc num1) {
202             return new Long JavaDoc(num0.longValue() % num1.longValue());
203         }
204
205         protected Number JavaDoc subtract(Number JavaDoc num0, Number JavaDoc num1) {
206             return new Long JavaDoc(num0.longValue() - num1.longValue());
207         }
208
209         protected Number JavaDoc multiply(Number JavaDoc num0, Number JavaDoc num1) {
210             return new Long JavaDoc(num0.longValue() * num1.longValue());
211         }
212
213         public boolean matches(Object JavaDoc obj0, Object JavaDoc obj1) {
214             return (obj0 instanceof Long JavaDoc || obj1 instanceof Long JavaDoc);
215         }
216     }
217
218     public final static BigDecimalDelegate BIGDECIMAL = new BigDecimalDelegate();
219
220     public final static BigIntegerDelegate BIGINTEGER = new BigIntegerDelegate();
221
222     public final static DoubleDelegate DOUBLE = new DoubleDelegate();
223
224     public final static LongDelegate LONG = new LongDelegate();
225
226     private final static Long JavaDoc ZERO = new Long JavaDoc(0);
227
228     public final static Number JavaDoc add(final Object JavaDoc obj0, final Object JavaDoc obj1) {
229         if (obj0 == null && obj1 == null) {
230             return new Long JavaDoc(0);
231         }
232
233         final ELArithmetic delegate;
234         if (BIGDECIMAL.matches(obj0, obj1))
235             delegate = BIGDECIMAL;
236         else if (DOUBLE.matches(obj0, obj1))
237             delegate = DOUBLE;
238         else if (BIGINTEGER.matches(obj0, obj1))
239             delegate = BIGINTEGER;
240         else
241             delegate = LONG;
242
243         Number JavaDoc num0 = delegate.coerce(obj0);
244         Number JavaDoc num1 = delegate.coerce(obj1);
245
246         return delegate.add(num0, num1);
247     }
248
249     public final static Number JavaDoc mod(final Object JavaDoc obj0, final Object JavaDoc obj1) {
250         if (obj0 == null && obj1 == null) {
251             return new Long JavaDoc(0);
252         }
253
254         final ELArithmetic delegate;
255         if (BIGDECIMAL.matches(obj0, obj1))
256             delegate = BIGDECIMAL;
257         else if (DOUBLE.matches(obj0, obj1))
258             delegate = DOUBLE;
259         else if (BIGINTEGER.matches(obj0, obj1))
260             delegate = BIGINTEGER;
261         else
262             delegate = LONG;
263
264         Number JavaDoc num0 = delegate.coerce(obj0);
265         Number JavaDoc num1 = delegate.coerce(obj1);
266
267         return delegate.mod(num0, num1);
268     }
269
270     public final static Number JavaDoc subtract(final Object JavaDoc obj0, final Object JavaDoc obj1) {
271         if (obj0 == null && obj1 == null) {
272             return new Long JavaDoc(0);
273         }
274
275         final ELArithmetic delegate;
276         if (BIGDECIMAL.matches(obj0, obj1))
277             delegate = BIGDECIMAL;
278         else if (DOUBLE.matches(obj0, obj1))
279             delegate = DOUBLE;
280         else if (BIGINTEGER.matches(obj0, obj1))
281             delegate = BIGINTEGER;
282         else
283             delegate = LONG;
284
285         Number JavaDoc num0 = delegate.coerce(obj0);
286         Number JavaDoc num1 = delegate.coerce(obj1);
287
288         return delegate.subtract(num0, num1);
289     }
290
291     public final static Number JavaDoc divide(final Object JavaDoc obj0, final Object JavaDoc obj1) {
292         if (obj0 == null && obj1 == null) {
293             return ZERO;
294         }
295
296         final ELArithmetic delegate;
297         if (BIGDECIMAL.matches(obj0, obj1))
298             delegate = BIGDECIMAL;
299         else if (BIGINTEGER.matches(obj0, obj1))
300             delegate = BIGDECIMAL;
301         else
302             delegate = DOUBLE;
303
304         Number JavaDoc num0 = delegate.coerce(obj0);
305         Number JavaDoc num1 = delegate.coerce(obj1);
306
307         return delegate.divide(num0, num1);
308     }
309
310     public final static Number JavaDoc multiply(final Object JavaDoc obj0, final Object JavaDoc obj1) {
311         if (obj0 == null && obj1 == null) {
312             return new Long JavaDoc(0);
313         }
314
315         final ELArithmetic delegate;
316         if (BIGDECIMAL.matches(obj0, obj1))
317             delegate = BIGDECIMAL;
318         else if (DOUBLE.matches(obj0, obj1))
319             delegate = DOUBLE;
320         else if (BIGINTEGER.matches(obj0, obj1))
321             delegate = BIGINTEGER;
322         else
323             delegate = LONG;
324
325         Number JavaDoc num0 = delegate.coerce(obj0);
326         Number JavaDoc num1 = delegate.coerce(obj1);
327
328         return delegate.multiply(num0, num1);
329     }
330
331     public final static boolean isNumber(final Object JavaDoc obj) {
332         return (obj != null && isNumberType(obj.getClass()));
333     }
334
335     public final static boolean isNumberType(final Class JavaDoc type) {
336         return type == (java.lang.Long JavaDoc.class) || type == Long.TYPE || type == (java.lang.Double JavaDoc.class) || type == Double.TYPE || type == (java.lang.Byte JavaDoc.class) || type == Byte.TYPE || type == (java.lang.Short JavaDoc.class) || type == Short.TYPE || type == (java.lang.Integer JavaDoc.class) || type == Integer.TYPE || type == (java.lang.Float JavaDoc.class) || type == Float.TYPE || type == (java.math.BigInteger JavaDoc.class) || type == (java.math.BigDecimal JavaDoc.class);
337     }
338
339     /**
340      *
341      */

342     protected ELArithmetic() {
343         super();
344     }
345
346     protected abstract Number JavaDoc add(final Number JavaDoc num0, final Number JavaDoc num1);
347
348     protected abstract Number JavaDoc multiply(final Number JavaDoc num0, final Number JavaDoc num1);
349
350     protected abstract Number JavaDoc subtract(final Number JavaDoc num0, final Number JavaDoc num1);
351
352     protected abstract Number JavaDoc mod(final Number JavaDoc num0, final Number JavaDoc num1);
353
354     protected abstract Number JavaDoc coerce(final Number JavaDoc num);
355
356     protected final Number JavaDoc coerce(final Object JavaDoc obj) {
357         
358         if (isNumber(obj)) {
359             return coerce((Number JavaDoc) obj);
360         }
361         if (obj instanceof String JavaDoc) {
362             return coerce((String JavaDoc) obj);
363         }
364         if (obj == null || "".equals(obj)) {
365             return coerce(ZERO);
366         }
367
368         Class JavaDoc objType = obj.getClass();
369         if (Character JavaDoc.class.equals(objType) || Character.TYPE == objType) {
370             return coerce(new Short JavaDoc((short) ((Character JavaDoc) obj).charValue()));
371         }
372
373         throw new IllegalArgumentException JavaDoc(MessageFactory.get("el.convert", obj,
374                 objType));
375     }
376
377     protected abstract Number JavaDoc coerce(final String JavaDoc str);
378
379     protected abstract Number JavaDoc divide(final Number JavaDoc num0, final Number JavaDoc num1);
380
381     protected abstract boolean matches(final Object JavaDoc obj0, final Object JavaDoc obj1);
382
383 }
384
Popular Tags