KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > teamkonzept > lib > templates > TKExpressionTag


1 package com.teamkonzept.lib.templates;
2
3 import java.io.*;
4
5 import org.apache.log4j.Category;
6 import com.teamkonzept.lib.*;
7
8 public class TKExpressionTag extends TKLabelTag
9 {
10     private static final Category CAT = Category.getInstance(TKExpressionTag.class);
11     
12     public static final int TAG_TYPE = TKEvalTag.TAG_TYPE+1;
13
14     public TKExpressionTag( TKTemplateSyntax parent, String JavaDoc name, boolean hasSubTags ) throws TKTemplateSyntaxException
15     {
16         super( parent, name, hasSubTags );
17     }
18     
19     public static void operate ( String JavaDoc expression, TKVector vals, StringBuffer JavaDoc op ) throws TKTemplateSyntaxException
20     {
21         String JavaDoc opVal = op.toString();
22         int top = vals.size()-1;
23
24         if (Character.isDigit(op.charAt(0))) vals.addElement (new Integer JavaDoc (opVal));
25             
26         else if (opVal.equals ("<")) {
27
28             if (top < 1) {
29                 CAT.error ("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
30                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
31             }
32                 
33             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
34             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
35             vals.setSize(top-1);
36             
37             vals.addElement (new Integer JavaDoc (val1 < val2 ? 1 : 0));
38         }
39         
40         else if (opVal.equals (">")) {
41
42             if (top < 1) {
43                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
44                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
45             }
46                 
47             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
48             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
49             vals.setSize(top-1);
50             
51             vals.addElement (new Integer JavaDoc (val1 > val2 ? 1 : 0));
52         }
53         
54         else if (opVal.equals ("=")) {
55
56             if (top < 1) {
57                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
58                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
59             }
60                 
61             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
62             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
63             vals.setSize(top-1);
64             
65             vals.addElement (new Integer JavaDoc (val1 == val2 ? 1 : 0));
66         }
67         
68         else if (opVal.equals ("!=")) {
69
70             if (top < 1) {
71                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
72                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
73             }
74                 
75             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
76             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
77             vals.setSize(top-1);
78             
79             vals.addElement (new Integer JavaDoc (val1 != val2 ? 1 : 0));
80         }
81         
82         else if (opVal.equals ("<=")) {
83
84             if (top < 1) {
85                 CAT.error ("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
86                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
87             }
88                 
89             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
90             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
91             vals.setSize(top-1);
92             
93             vals.addElement (new Integer JavaDoc (val1 <= val2 ? 1 : 0));
94         }
95         
96         else if (opVal.equals (">=")) {
97
98             if (top < 1) {
99                 CAT.error ("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
100                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
101             }
102                 
103             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
104             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
105             vals.setSize(top-1);
106             
107             vals.addElement (new Integer JavaDoc (val1 >= val2 ? 1 : 0));
108         }
109         
110         else if (opVal.equals ("+")) {
111
112             if (top < 1) {
113                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
114                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
115             }
116                 
117             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
118             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
119             vals.setSize(top-1);
120             
121             vals.addElement (new Integer JavaDoc (val1 + val2));
122         }
123         
124         else if (opVal.equals ("-")) {
125
126             if (top < 1) {
127                 CAT.error ("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
128                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
129             }
130                 
131             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
132             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
133             vals.setSize(top-1);
134             
135             vals.addElement (new Integer JavaDoc (val1 - val2));
136         }
137         
138         else if (opVal.equals ("*")) {
139
140             if (top < 1) {
141                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
142                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
143             }
144                 
145             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
146             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
147             vals.setSize(top-1);
148             
149             vals.addElement (new Integer JavaDoc (val1 * val2));
150         }
151         
152         else if (opVal.equals ("/")) {
153
154             if (top < 1) {
155                 CAT.error("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
156                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
157             }
158                 
159             float val1 = ((Integer JavaDoc) vals.elementAt(top-1)).floatValue();
160             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
161             vals.setSize(top-1);
162             
163             vals.addElement (new Float JavaDoc (val1 / val2));
164         }
165         
166         else if (opVal.equals ("%")) {
167
168             if (top < 1) {
169                 CAT.error ("*** TK_EXPRESSION: Zuwenig Operanden für '"+opVal+"' in '"+expression+"'");
170                 throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
171             }
172                 
173             int val1 = ((Integer JavaDoc) vals.elementAt(top-1)).intValue();
174             int val2 = ((Integer JavaDoc) vals.elementAt(top)).intValue();
175             vals.setSize(top-1);
176             
177             vals.addElement (new Integer JavaDoc (val1 % val2));
178         }
179         
180         else {
181             CAT.error ("*** TK_EXPRESSION: Unbekannter Operator '"+opVal+"' in '"+expression+"'");
182             throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", opVal);
183         }
184                 
185         op.setLength(0);
186     }
187     
188     public static String JavaDoc eval ( String JavaDoc expression ) throws TKTemplateSyntaxException
189     {
190         TKVector vals = new TKVector();
191         StringBuffer JavaDoc op = new StringBuffer JavaDoc();
192         boolean isInt = false;
193
194         int i = 0;
195         while (i < expression.length()) {
196 // for (int i = 0; i < expression.length(); i++) {
197

198             char chr = expression.charAt(i);
199             if (chr == '\\')
200             {
201                 if (++i >= expression.length())
202                 {
203                     break;
204                 }
205                 else
206                 {
207                      chr = expression.charAt(i);
208                 }
209             }
210                 
211             if (Character.isWhitespace(chr)) {
212             
213                 if (op.length() != 0)
214                     operate (expression,vals,op);
215                 isInt = false;
216
217             } else if (Character.isDigit(chr)) {
218             
219                 if (op.length() != 0 && !isInt)
220                     operate (expression,vals,op);
221                 op.append (chr);
222                 isInt = true;
223             
224             } else {
225
226                 if (op.length() != 0 && isInt)
227                     operate (expression,vals,op);
228                 op.append (chr);
229                 isInt = false;
230             }
231             
232             i++;
233         }
234
235         if (op.length() != 0) operate (expression,vals,op);
236         
237         if (vals.size() > 1) {
238             CAT.error("*** TK_EXPRESSION: Zuviele Operanden für '"+expression+"'");
239             throw new TKTemplateSyntaxException("","WRONGEND","EXPRESSION", expression);
240         }
241             
242         return vals.size() == 0 ? "" : vals.lastElement().toString();
243     }
244     
245     public String JavaDoc apply( TKTemplateData td ) throws TKTemplateSyntaxException
246     {
247         return eval (getLabel( td ));
248     }
249     
250     public void apply(TKTemplateData td, Writer writer)
251         throws TKTemplateSyntaxException, IOException
252     {
253         writer.write(eval (getLabel( td )));
254     }
255
256 }
257
Popular Tags