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 name, boolean hasSubTags ) throws TKTemplateSyntaxException 15 { 16 super( parent, name, hasSubTags ); 17 } 18 19 public static void operate ( String expression, TKVector vals, StringBuffer op ) throws TKTemplateSyntaxException 20 { 21 String opVal = op.toString(); 22 int top = vals.size()-1; 23 24 if (Character.isDigit(op.charAt(0))) vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 34 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 35 vals.setSize(top-1); 36 37 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 48 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 49 vals.setSize(top-1); 50 51 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 62 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 63 vals.setSize(top-1); 64 65 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 76 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 77 vals.setSize(top-1); 78 79 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 90 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 91 vals.setSize(top-1); 92 93 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 104 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 105 vals.setSize(top-1); 106 107 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 118 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 119 vals.setSize(top-1); 120 121 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 132 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 133 vals.setSize(top-1); 134 135 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).intValue(); 146 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 147 vals.setSize(top-1); 148 149 vals.addElement (new Integer (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 ) vals.elementAt(top-1)).floatValue(); 160 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 161 vals.setSize(top-1); 162 163 vals.addElement (new Float (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 ) vals.elementAt(top-1)).intValue(); 174 int val2 = ((Integer ) vals.elementAt(top)).intValue(); 175 vals.setSize(top-1); 176 177 vals.addElement (new Integer (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 eval ( String expression ) throws TKTemplateSyntaxException 189 { 190 TKVector vals = new TKVector(); 191 StringBuffer op = new StringBuffer (); 192 boolean isInt = false; 193 194 int i = 0; 195 while (i < expression.length()) { 196 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 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 |