1 package org.apache.velocity.runtime.parser.node;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.velocity.context.InternalContextAdapter;
23 import org.apache.velocity.exception.MethodInvocationException;
24 import org.apache.velocity.runtime.parser.Parser;
25 import org.apache.velocity.runtime.parser.ParserVisitor;
26 import org.apache.velocity.util.TemplateNumber;
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class ASTDivNode extends SimpleNode
41 {
42
43
44
45 public ASTDivNode(int id)
46 {
47 super(id);
48 }
49
50
51
52
53
54 public ASTDivNode(Parser p, int id)
55 {
56 super(p, id);
57 }
58
59
60
61
62 public Object jjtAccept(ParserVisitor visitor, Object data)
63 {
64 return visitor.visit(this, data);
65 }
66
67
68
69
70
71
72
73 public Object value( InternalContextAdapter context)
74 throws MethodInvocationException
75 {
76
77
78
79
80 Object left = jjtGetChild(0).value( context );
81 Object right = jjtGetChild(1).value( context );
82
83
84
85
86
87 if (left == null || right == null)
88 {
89 log.error((left == null ? "Left" : "Right")
90 + " side ("
91 + jjtGetChild( (left == null? 0 : 1) ).literal()
92 + ") of division operation has null value."
93 + " Operation not possible. "
94 + context.getCurrentTemplateName()
95 + " [line " + getLine()
96 + ", column " + getColumn() + "]");
97 return null;
98 }
99
100
101
102
103 if (left instanceof TemplateNumber)
104 {
105 left = ( (TemplateNumber) left).getAsNumber();
106 }
107 if (right instanceof TemplateNumber)
108 {
109 right = ( (TemplateNumber) right).getAsNumber();
110 }
111
112
113
114
115 if ( !( left instanceof Number ) || !( right instanceof Number ))
116 {
117 log.error((!(left instanceof Number) ? "Left" : "Right")
118 + " side of division operation is not a number. "
119 + context.getCurrentTemplateName() + " [line " + getLine()
120 + ", column " + getColumn() + "]");
121
122 return null;
123 }
124
125
126
127
128 if ( MathUtils.isZero ( (Number)right ) )
129 {
130 log.error("Right side of division operation is zero. Must be non-zero. "
131 + context.getCurrentTemplateName() + " [line " + getLine()
132 + ", column " + getColumn() + "]");
133
134 return null;
135 }
136
137 return MathUtils.divide( (Number)left, (Number)right );
138 }
139 }