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 ASTMulNode extends SimpleNode
41 {
42
43
44
45 public ASTMulNode(int id)
46 {
47 super(id);
48 }
49
50
51
52
53
54 public ASTMulNode(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 multiplication operation has null value."
93 + " Operation not possible. "
94 + context.getCurrentTemplateName() + " [line " + getLine()
95 + ", column " + getColumn() + "]");
96 return null;
97 }
98
99
100
101
102 if (left instanceof TemplateNumber)
103 {
104 left = ( (TemplateNumber) left).getAsNumber();
105 }
106 if (right instanceof TemplateNumber)
107 {
108 right = ( (TemplateNumber) right).getAsNumber();
109 }
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 multiplication operation is not a Number. "
119 + context.getCurrentTemplateName() + " [line " + getLine()
120 + ", column " + getColumn() + "]");
121
122 return null;
123 }
124
125 return MathUtils.multiply( (Number)left, (Number)right);
126 }
127 }
128
129
130
131