1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.jexl.parser;
17
18 import org.apache.commons.jexl.JexlContext;
19 import org.apache.commons.jexl.util.Coercion;
20
21 /***
22 * GT : a > b.
23 *
24 * Follows A.3.6.1 of the JSTL 1.0 specification
25 *
26 * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
27 * @author <a href="mailto:proyal@apache.org">Peter Royal</a>
28 * @version $Id: ASTGTNode.java 398197 2006-04-29 16:18:04Z dion $
29 */
30 public class ASTGTNode extends SimpleNode {
31 /***
32 * Create the node given an id.
33 *
34 * @param id node id.
35 */
36 public ASTGTNode(int id) {
37 super(id);
38 }
39
40 /***
41 * Create a node with the given parser and id.
42 *
43 * @param p a parser.
44 * @param id node id.
45 */
46 public ASTGTNode(Parser p, int id) {
47 super(p, id);
48 }
49
50 /*** {@inheritDoc} */
51 public Object jjtAccept(ParserVisitor visitor, Object data) {
52 return visitor.visit(this, data);
53 }
54
55 /*** {@inheritDoc} */
56 public Object value(JexlContext jc) throws Exception {
57
58
59
60
61 Object left = ((SimpleNode) jjtGetChild(0)).value(jc);
62 Object right = ((SimpleNode) jjtGetChild(1)).value(jc);
63
64 if ((left == right) || (left == null) || (right == null)) {
65 return Boolean.FALSE;
66 } else if (Coercion.isFloatingPoint(left)
67 || Coercion.isFloatingPoint(right)) {
68 double leftDouble = Coercion.coerceDouble(left).doubleValue();
69 double rightDouble = Coercion.coerceDouble(right).doubleValue();
70
71 return leftDouble > rightDouble ? Boolean.TRUE : Boolean.FALSE;
72 } else if (Coercion.isNumberable(left) || Coercion.isNumberable(right)) {
73 long leftLong = Coercion.coerceLong(left).longValue();
74 long rightLong = Coercion.coerceLong(right).longValue();
75
76 return leftLong > rightLong ? Boolean.TRUE : Boolean.FALSE;
77 } else if (left instanceof String || right instanceof String) {
78 String leftString = left.toString();
79 String rightString = right.toString();
80
81 return leftString.compareTo(rightString) > 0 ? Boolean.TRUE
82 : Boolean.FALSE;
83 } else if (left instanceof Comparable) {
84 return ((Comparable) left).compareTo(right) > 0 ? Boolean.TRUE
85 : Boolean.FALSE;
86 } else if (right instanceof Comparable) {
87 return ((Comparable) right).compareTo(left) < 0 ? Boolean.TRUE
88 : Boolean.FALSE;
89 }
90
91 throw new Exception("Invalid comparison : GT ");
92 }
93 }