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.JexlContext;
20 import org.apache.commons.jexl.util.Coercion;
21
22 /***
23 * % (mod).
24 *
25 * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
26 * @version $Id: ASTModNode.java 398206 2006-04-29 16:51:38Z dion $
27 */
28 public class ASTModNode extends SimpleNode {
29 /***
30 * Create the node given an id.
31 *
32 * @param id node id.
33 */
34 public ASTModNode(int id) {
35 super(id);
36 }
37
38 /***
39 * Create a node with the given parser and id.
40 *
41 * @param p a parser.
42 * @param id node id.
43 */
44 public ASTModNode(Parser p, int id) {
45 super(p, id);
46 }
47
48 /*** {@inheritDoc} */
49 public Object jjtAccept(ParserVisitor visitor, Object data) {
50 return visitor.visit(this, data);
51 }
52
53 /*** {@inheritDoc} */
54 public Object value(JexlContext jc) throws Exception {
55 Object left = ((SimpleNode) jjtGetChild(0)).value(jc);
56 Object right = ((SimpleNode) jjtGetChild(1)).value(jc);
57
58
59
60
61 if (left == null && right == null) {
62 return new Byte((byte) 0);
63 }
64
65
66
67
68
69 if (left instanceof Float
70 || left instanceof Double
71 || right instanceof Float
72 || right instanceof Double
73 || (left instanceof String
74 && (((String) left).indexOf(".") != -1
75 || ((String) left).indexOf("e") != -1
76 || ((String) left).indexOf("E") != -1))
77 || (right instanceof String
78 && (((String) right).indexOf(".") != -1
79 || ((String) right).indexOf("e") != -1
80 || ((String) right).indexOf("E") != -1))) {
81 Double l = Coercion.coerceDouble(left);
82 Double r = Coercion.coerceDouble(right);
83
84
85
86
87 if (r.doubleValue() == 0.0) {
88 return new Double(0.0);
89 }
90
91 return new Double(l.doubleValue() % r.doubleValue());
92 }
93
94
95
96
97
98 Long l = Coercion.coerceLong(left);
99 Long r = Coercion.coerceLong(right);
100
101
102
103
104 if (r.longValue() == 0) {
105 return new Long(0);
106 }
107
108 return new Long(l.longValue() % r.longValue());
109 }
110
111 }