KickJava   Java API By Example, From Geeks To Geeks.

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


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 /**
13  * @author $Author: alex $
14  * @version $Revision: 1.17 $
15 */

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 JavaDoc name = null;
24
25     private final static double THRESHOLD = 0.00001;
26     
27     /**
28      * Konstruktor 1
29      * Ein Syntaxbaum fuer ein Template wird erzeugt.
30      *
31      * @param String def, Name des Tags
32      * @param PatternMatcherInput matcherInput
33      * @param boolean hasSubTags
34      */

35     public TKIfTag( TKTemplateSyntax parent, String JavaDoc 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 JavaDoc) parent.newChild( def, parent.getSource(), hasSubTags )
59                 : (Object JavaDoc) 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 JavaDoc e) { //thrown by TKTemplateSyntax.newTag()
69
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     /**
83      */

84      
85     public String JavaDoc getName( TKTemplateData td ) throws TKTemplateSyntaxException
86     {
87         if( name != null ) return name;
88         String JavaDoc def = ((TKTemplateSyntax)subDefs.get(0)).apply( td );
89         return def.substring( 0, def.indexOf('=') );
90     }
91     
92     public String JavaDoc getValue( String JavaDoc def )
93     {
94         return def.substring( def.indexOf('=')+1 );
95     }
96          
97     public String JavaDoc getValue( int i, TKTemplateData td ) throws TKTemplateSyntaxException
98     {
99         Object JavaDoc def = subDefs.get(i);
100         if( def instanceof String JavaDoc ) return (String JavaDoc) def;
101         
102         return getValue( ((TKTemplateSyntax)def).apply(td) );
103     }
104     
105     /**
106      *
107      * @param TKTemplateData td
108      * @return den String, der den bearbeiteten Part enthaelt
109      */

110     public String JavaDoc apply( TKTemplateData td ) throws TKTemplateSyntaxException
111     {
112         String JavaDoc name = getName( td );
113         
114         if( name.equals("EVAL") ) {
115             int size = subDefs.size();
116             for( int i=0; i<size; i++ ) {
117                 String JavaDoc expression = getValue( i, td );
118                 StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
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 JavaDoc e ) {
136                     // e.printStackTrace(System.out);
137
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 JavaDoc expression = getValue( i, td );
156                 StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
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 JavaDoc result = "";
169                 try {
170                     result = TKExpressionTag.eval (buf.toString());
171                 }
172                 catch( Exception JavaDoc 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 JavaDoc 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 JavaDoc val = getValue( i, td );
205                 Enumeration e = ((TKVector) value).elements();
206                 while( e.hasMoreElements() ) {
207                     String JavaDoc 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 JavaDoc svalue = value.toString();
225                 
226             int size = subDefs.size();
227             for( int i=0; i<size; i++ ) {
228                 String JavaDoc 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 JavaDoc name = getName( td );
251         if( name.equals("EVAL") ) {
252             int size = subDefs.size();
253             for( int i=0; i<size; i++ ) {
254                 String JavaDoc expression = getValue( i, td );
255                 StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
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 JavaDoc 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 JavaDoc expression = getValue( i, td );
294                 StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
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 JavaDoc result = "";
307                 try {
308                     result = TKExpressionTag.eval (buf.toString());
309                 }
310                 catch( Exception JavaDoc 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 JavaDoc 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 JavaDoc val = getValue( i, td );
348                 Enumeration e = ((TKVector) value).elements();
349                 while( e.hasMoreElements() ) {
350                     String JavaDoc 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 JavaDoc svalue = value.toString();
370                 
371             int size = subDefs.size();
372             for( int i=0; i<size; i++ ) {
373                 String JavaDoc 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