1 package com.teamkonzept.lib.templates; 2 3 import java.io.*; 4 import java.util.*; 5 6 import com.oroinc.text.regex.*; 7 8 import com.teamkonzept.lib.*; 9 import com.teamkonzept.lib.math.*; 10 import org.apache.log4j.Category; 11 12 16 public class TKIfTag extends TKTag 17 { 18 private static final Category CAT = Category.getInstance(TKIfTag.class); 19 20 public static final int TAG_TYPE = TKNameTag.TAG_TYPE+1; 21 public TKVector subSyntaxes; 22 public TKVector subDefs; 23 public String name = null; 24 25 private final static double THRESHOLD = 0.00001; 26 27 35 public TKIfTag( TKTemplateSyntax parent, String def, PatternMatcherInput matcherInput, boolean hasSubTags ) throws TKTemplateSyntaxException 36 { 37 super( parent ); 38 39 subSyntaxes = new TKVector(); 40 subDefs = new TKVector(); 41 42 TKTemplateSyntax subSyntax; 43 TKEndTag endTag; 44 45 if( !hasSubTags ) { 46 name = def.substring( 0, def.indexOf('=') ); 47 } 48 else { 49 int nameEnd = def.indexOf('='); 50 if( (nameEnd > 0) && (def.indexOf('<') > nameEnd) ) { 51 name = def.substring( 0, nameEnd ); 52 } 53 } 54 55 do { 56 subDefs.addElement( 57 ( hasSubTags 58 ? (Object ) parent.newChild( def, parent.getSource(), hasSubTags ) 59 : (Object ) getValue( def ) 60 ) 61 ); 62 try { 63 subSyntax = parent.newChild( matcherInput, parent.getSource() ); 64 } 65 catch (TKTemplateSyntaxException se) { 66 throw se; 67 } 68 catch (Exception e) { throw new TKTemplateSyntaxException(parent.getSource(),"NOEND","IF", def); 70 } 71 if (subSyntax.tags.size() == 0 || 72 !(subSyntax.tags.lastElement() instanceof TKEndTag)) { 73 throw new TKTemplateSyntaxException(parent.getSource(),"NOEND","IF", def); 74 } 75 subSyntaxes.addElement( subSyntax ); 76 endTag = (TKEndTag) subSyntax.tags.lastElement(); 77 def = endTag.info; 78 hasSubTags = endTag.hasSubTags; 79 } while( !endTag.type.equals("IF") ); 80 } 81 82 84 85 public String getName( TKTemplateData td ) throws TKTemplateSyntaxException 86 { 87 if( name != null ) return name; 88 String def = ((TKTemplateSyntax)subDefs.get(0)).apply( td ); 89 return def.substring( 0, def.indexOf('=') ); 90 } 91 92 public String getValue( String def ) 93 { 94 return def.substring( def.indexOf('=')+1 ); 95 } 96 97 public String getValue( int i, TKTemplateData td ) throws TKTemplateSyntaxException 98 { 99 Object def = subDefs.get(i); 100 if( def instanceof String ) return (String ) def; 101 102 return getValue( ((TKTemplateSyntax)def).apply(td) ); 103 } 104 105 110 public String apply( TKTemplateData td ) throws TKTemplateSyntaxException 111 { 112 String name = getName( td ); 113 114 if( name.equals("EVAL") ) { 115 int size = subDefs.size(); 116 for( int i=0; i<size; i++ ) { 117 String expression = getValue( i, td ); 118 StringBuffer buf = new StringBuffer (); 119 for (int j = 0; j < expression.length(); j++) { 120 121 char chr = expression.charAt(j); 122 if (chr == '\\') 123 { 124 if (++j >= expression.length()) break; 125 else chr = expression.charAt(j); 126 } 127 buf.append(chr); 128 } 129 130 Eval ev = new Eval(); 131 double result = 0; 132 try { 133 result = ev.eval( buf.toString() ); 134 } 135 catch( Exception e ) { 136 CAT.error( "error in if-eval-tag: ",e ); 138 } 139 if( Math.abs(result) > THRESHOLD ) { 140 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 141 return s.apply( td ); 142 } 143 if( i == size-2 ) { 144 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 145 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 146 if( endTag.type.equals( "ELSE" ) ) { 147 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 148 return s.apply(td); 149 } 150 } 151 } 152 } else if( name.equals("EXPRESSION") ) { 153 int size = subDefs.size(); 154 for( int i=0; i<size; i++ ) { 155 String expression = getValue( i, td ); 156 StringBuffer buf = new StringBuffer (); 157 for (int j = 0; j < expression.length(); j++) { 158 159 char chr = expression.charAt(j); 160 if (chr == '\\') 161 { 162 if (++j >= expression.length()) break; 163 else chr = expression.charAt(j); 164 } 165 buf.append(chr); 166 } 167 168 String result = ""; 169 try { 170 result = TKExpressionTag.eval (buf.toString()); 171 } 172 catch( Exception e ) { 173 CAT.error( "error in if-expression-tag: ", e ); 174 } 175 176 if (result.length() > 0 && !result.equals ("0")) { 177 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 178 return s.apply( td ); 179 } 180 if( i == size-2 ) { 181 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 182 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 183 if( endTag.type.equals( "ELSE" ) ) { 184 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 185 return s.apply(td); 186 } 187 } 188 } 189 } 190 Object value = td.getVariable( name ); 191 if( value == null ) { 192 int size = subSyntaxes.size(); 193 if( size < 2 ) return null; 194 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(size-2); 195 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 196 if( !endTag.type.equals( "ELSE" ) ) return null; 197 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 198 return s.apply( td ); 199 } 200 201 if( value instanceof Vector ) { 202 int size = subDefs.size(); 203 for( int i=0; i<size; i++ ) { 204 String val = getValue( i, td ); 205 Enumeration e = ((TKVector) value).elements(); 206 while( e.hasMoreElements() ) { 207 String svalue = e.nextElement().toString(); 208 if( val.equalsIgnoreCase( svalue ) ){ 209 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 210 return s.apply( td ); 211 } 212 } 213 if( i == size-2 ) { 214 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 215 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 216 if( endTag.type.equals( "ELSE" ) ) { 217 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 218 return s.apply(td); 219 } 220 } 221 } 222 } 223 else { 224 String svalue = value.toString(); 225 226 int size = subDefs.size(); 227 for( int i=0; i<size; i++ ) { 228 String val = getValue( i, td ); 229 if( val.equalsIgnoreCase( svalue ) ){ 230 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 231 return s.apply( td ); 232 } 233 if( i == size-2 ) { 234 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 235 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 236 if( endTag.type.equals( "ELSE" ) ) { 237 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 238 return s.apply(td); 239 } 240 } 241 } 242 } 243 return null; 244 } 245 246 247 public void apply(TKTemplateData td, Writer writer) 248 throws TKTemplateSyntaxException, IOException 249 { 250 String name = getName( td ); 251 if( name.equals("EVAL") ) { 252 int size = subDefs.size(); 253 for( int i=0; i<size; i++ ) { 254 String expression = getValue( i, td ); 255 StringBuffer buf = new StringBuffer (); 256 for (int j = 0; j < expression.length(); j++) { 257 258 char chr = expression.charAt(j); 259 if (chr == '\\') 260 { 261 if (++j >= expression.length()) break; 262 else chr = expression.charAt(j); 263 } 264 buf.append(chr); 265 } 266 267 Eval ev = new Eval(); 268 double result = 0; 269 try { 270 result = ev.eval( buf.toString() ); 271 } 272 catch( Exception e ) { 273 CAT.error( "error in if-eval-tag: ", e ); 274 } 275 if( Math.abs(result) > THRESHOLD ) { 276 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 277 s.apply( td, writer ); 278 return; 279 } 280 if( i == size-2 ) { 281 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 282 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 283 if( endTag.type.equals( "ELSE" ) ) { 284 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 285 s.apply(td, writer); 286 return; 287 } 288 } 289 } 290 } else if( name.equals("EXPRESSION") ) { 291 int size = subDefs.size(); 292 for( int i=0; i<size; i++ ) { 293 String expression = getValue( i, td ); 294 StringBuffer buf = new StringBuffer (); 295 for (int j = 0; j < expression.length(); j++) { 296 297 char chr = expression.charAt(j); 298 if (chr == '\\') 299 { 300 if (++j >= expression.length()) break; 301 else chr = expression.charAt(j); 302 } 303 buf.append(chr); 304 } 305 306 String result = ""; 307 try { 308 result = TKExpressionTag.eval (buf.toString()); 309 } 310 catch( Exception e ) { 311 CAT.error( "error in if-expression-tag: ", e); 312 } 313 314 if (result.length() > 0 && !result.equals ("0")) { 315 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 316 s.apply( td, writer ); 317 return; 318 } 319 if( i == size-2 ) { 320 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 321 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 322 if( endTag.type.equals( "ELSE" ) ) { 323 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 324 s.apply(td, writer); 325 return; 326 } 327 } 328 } 329 } 330 Object value = td.getVariable( name ); 331 if( value == null ) { 332 int size = subSyntaxes.size(); 333 if(size < 2 ) 334 return; 335 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(size-2); 336 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 337 if( !endTag.type.equals( "ELSE" ) ) 338 return; 339 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 340 s.apply( td, writer ); 341 return; 342 } 343 344 if( value instanceof Vector ) { 345 int size = subDefs.size(); 346 for( int i=0; i<size; i++ ) { 347 String val = getValue( i, td ); 348 Enumeration e = ((TKVector) value).elements(); 349 while( e.hasMoreElements() ) { 350 String svalue = e.nextElement().toString(); 351 if( val.equalsIgnoreCase( svalue ) ){ 352 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 353 s.apply( td, writer ); 354 return; 355 } 356 } 357 if( i == size-2 ) { 358 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 359 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 360 if( endTag.type.equals( "ELSE" ) ) { 361 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 362 s.apply(td, writer); 363 return; 364 } 365 } 366 } 367 } 368 else { 369 String svalue = value.toString(); 370 371 int size = subDefs.size(); 372 for( int i=0; i<size; i++ ) { 373 String val = getValue( i, td ); 374 if( val.equalsIgnoreCase( svalue ) ){ 375 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 376 s.apply( td, writer ); 377 return; 378 } 379 if( i == size-2 ) { 380 TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes.get(i); 381 TKEndTag endTag = (TKEndTag) s.tags.lastElement(); 382 if( endTag.type.equals( "ELSE" ) ) { 383 s = (TKTemplateSyntax) subSyntaxes.get(size-1); 384 s.apply(td, writer); 385 return; 386 } 387 } 388 } 389 } 390 } 391 } 392 393 | Popular Tags |