1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl.parser;
18
19 import org.apache.commons.jexl.util.Coercion;
20 import org.apache.commons.jexl.JexlContext;
21
22 /***
23 * Subtraction.
24 *
25 * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
26 * @author <a href="mailto:mhw@kremvax.net">Mark H. Wilkinson</a>
27 * @version $Id: ASTSubtractNode.java 398325 2006-04-30 12:34:29Z dion $
28 */
29 public class ASTSubtractNode extends SimpleNode {
30 /***
31 * Create the node given an id.
32 *
33 * @param id node id.
34 */
35 public ASTSubtractNode(int id) {
36 super(id);
37 }
38
39 /***
40 * Create a node with the given parser and id.
41 *
42 * @param p a parser.
43 * @param id node id.
44 */
45 public ASTSubtractNode(Parser p, int id) {
46 super(p, id);
47 }
48
49 /*** {@inheritDoc} */
50 public Object value(JexlContext context) throws Exception {
51 Object left = ((SimpleNode) jjtGetChild(0)).value(context);
52 Object right = ((SimpleNode) jjtGetChild(1)).value(context);
53
54
55
56
57 if (left == null && right == null) {
58 return new Byte((byte) 0);
59 }
60
61
62
63
64
65 if (left instanceof Float
66 || left instanceof Double
67 || right instanceof Float
68 || right instanceof Double
69 || (left instanceof String
70 && (((String) left).indexOf(".") != -1
71 || ((String) left).indexOf("e") != -1
72 || ((String) left).indexOf("E") != -1))
73 || (right instanceof String
74 && (((String) right).indexOf(".") != -1
75 || ((String) right).indexOf("e") != -1
76 || ((String) right).indexOf("E") != -1))) {
77 Double l = Coercion.coerceDouble(left);
78 Double r = Coercion.coerceDouble(right);
79
80 return new Double(l.doubleValue() - r.doubleValue());
81 }
82
83
84
85
86
87 Long l = Coercion.coerceLong(left);
88 Long r = Coercion.coerceLong(right);
89
90 return new Long(l.longValue() - r.longValue());
91
92 }
93
94 /*** {@inheritDoc} */
95 public Object jjtAccept(ParserVisitor visitor, Object data) {
96 return visitor.visit(this, data);
97 }
98 }