001: package com.teamkonzept.lib.templates;
002:
003: import java.io.*;
004: import java.util.*;
005:
006: import com.oroinc.text.regex.*;
007:
008: import com.teamkonzept.lib.*;
009: import com.teamkonzept.lib.math.*;
010: import org.apache.log4j.Category;
011:
012: /**
013: * @author $Author: alex $
014: * @version $Revision: 1.17 $
015: */
016: public class TKIfTag extends TKTag {
017: private static final Category CAT = Category
018: .getInstance(TKIfTag.class);
019:
020: public static final int TAG_TYPE = TKNameTag.TAG_TYPE + 1;
021: public TKVector subSyntaxes;
022: public TKVector subDefs;
023: public String name = null;
024:
025: private final static double THRESHOLD = 0.00001;
026:
027: /**
028: * Konstruktor 1
029: * Ein Syntaxbaum fuer ein Template wird erzeugt.
030: *
031: * @param String def, Name des Tags
032: * @param PatternMatcherInput matcherInput
033: * @param boolean hasSubTags
034: */
035: public TKIfTag(TKTemplateSyntax parent, String def,
036: PatternMatcherInput matcherInput, boolean hasSubTags)
037: throws TKTemplateSyntaxException {
038: super (parent);
039:
040: subSyntaxes = new TKVector();
041: subDefs = new TKVector();
042:
043: TKTemplateSyntax subSyntax;
044: TKEndTag endTag;
045:
046: if (!hasSubTags) {
047: name = def.substring(0, def.indexOf('='));
048: } else {
049: int nameEnd = def.indexOf('=');
050: if ((nameEnd > 0) && (def.indexOf('<') > nameEnd)) {
051: name = def.substring(0, nameEnd);
052: }
053: }
054:
055: do {
056: subDefs.addElement((hasSubTags ? (Object) parent.newChild(
057: def, parent.getSource(), hasSubTags)
058: : (Object) getValue(def)));
059: try {
060: subSyntax = parent.newChild(matcherInput, parent
061: .getSource());
062: } catch (TKTemplateSyntaxException se) {
063: throw se;
064: } catch (Exception e) { //thrown by TKTemplateSyntax.newTag()
065: throw new TKTemplateSyntaxException(parent.getSource(),
066: "NOEND", "IF", def);
067: }
068: if (subSyntax.tags.size() == 0
069: || !(subSyntax.tags.lastElement() instanceof TKEndTag)) {
070: throw new TKTemplateSyntaxException(parent.getSource(),
071: "NOEND", "IF", def);
072: }
073: subSyntaxes.addElement(subSyntax);
074: endTag = (TKEndTag) subSyntax.tags.lastElement();
075: def = endTag.info;
076: hasSubTags = endTag.hasSubTags;
077: } while (!endTag.type.equals("IF"));
078: }
079:
080: /**
081: */
082:
083: public String getName(TKTemplateData td)
084: throws TKTemplateSyntaxException {
085: if (name != null)
086: return name;
087: String def = ((TKTemplateSyntax) subDefs.get(0)).apply(td);
088: return def.substring(0, def.indexOf('='));
089: }
090:
091: public String getValue(String def) {
092: return def.substring(def.indexOf('=') + 1);
093: }
094:
095: public String getValue(int i, TKTemplateData td)
096: throws TKTemplateSyntaxException {
097: Object def = subDefs.get(i);
098: if (def instanceof String)
099: return (String) def;
100:
101: return getValue(((TKTemplateSyntax) def).apply(td));
102: }
103:
104: /**
105: *
106: * @param TKTemplateData td
107: * @return den String, der den bearbeiteten Part enthaelt
108: */
109: public String apply(TKTemplateData td)
110: throws TKTemplateSyntaxException {
111: String name = getName(td);
112:
113: if (name.equals("EVAL")) {
114: int size = subDefs.size();
115: for (int i = 0; i < size; i++) {
116: String expression = getValue(i, td);
117: StringBuffer buf = new StringBuffer();
118: for (int j = 0; j < expression.length(); j++) {
119:
120: char chr = expression.charAt(j);
121: if (chr == '\\') {
122: if (++j >= expression.length())
123: break;
124: else
125: 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: } catch (Exception e) {
135: // e.printStackTrace(System.out);
136: CAT.error("error in if-eval-tag: ", e);
137: }
138: if (Math.abs(result) > THRESHOLD) {
139: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
140: .get(i);
141: return s.apply(td);
142: }
143: if (i == size - 2) {
144: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
145: .get(i);
146: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
147: if (endTag.type.equals("ELSE")) {
148: s = (TKTemplateSyntax) subSyntaxes
149: .get(size - 1);
150: return s.apply(td);
151: }
152: }
153: }
154: } else if (name.equals("EXPRESSION")) {
155: int size = subDefs.size();
156: for (int i = 0; i < size; i++) {
157: String expression = getValue(i, td);
158: StringBuffer buf = new StringBuffer();
159: for (int j = 0; j < expression.length(); j++) {
160:
161: char chr = expression.charAt(j);
162: if (chr == '\\') {
163: if (++j >= expression.length())
164: break;
165: else
166: chr = expression.charAt(j);
167: }
168: buf.append(chr);
169: }
170:
171: String result = "";
172: try {
173: result = TKExpressionTag.eval(buf.toString());
174: } catch (Exception e) {
175: CAT.error("error in if-expression-tag: ", e);
176: }
177:
178: if (result.length() > 0 && !result.equals("0")) {
179: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
180: .get(i);
181: return s.apply(td);
182: }
183: if (i == size - 2) {
184: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
185: .get(i);
186: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
187: if (endTag.type.equals("ELSE")) {
188: s = (TKTemplateSyntax) subSyntaxes
189: .get(size - 1);
190: return s.apply(td);
191: }
192: }
193: }
194: }
195: Object value = td.getVariable(name);
196: if (value == null) {
197: int size = subSyntaxes.size();
198: if (size < 2)
199: return null;
200: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
201: .get(size - 2);
202: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
203: if (!endTag.type.equals("ELSE"))
204: return null;
205: s = (TKTemplateSyntax) subSyntaxes.get(size - 1);
206: return s.apply(td);
207: }
208:
209: if (value instanceof Vector) {
210: int size = subDefs.size();
211: for (int i = 0; i < size; i++) {
212: String val = getValue(i, td);
213: Enumeration e = ((TKVector) value).elements();
214: while (e.hasMoreElements()) {
215: String svalue = e.nextElement().toString();
216: if (val.equalsIgnoreCase(svalue)) {
217: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
218: .get(i);
219: return s.apply(td);
220: }
221: }
222: if (i == size - 2) {
223: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
224: .get(i);
225: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
226: if (endTag.type.equals("ELSE")) {
227: s = (TKTemplateSyntax) subSyntaxes
228: .get(size - 1);
229: return s.apply(td);
230: }
231: }
232: }
233: } else {
234: String svalue = value.toString();
235:
236: int size = subDefs.size();
237: for (int i = 0; i < size; i++) {
238: String val = getValue(i, td);
239: if (val.equalsIgnoreCase(svalue)) {
240: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
241: .get(i);
242: return s.apply(td);
243: }
244: if (i == size - 2) {
245: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
246: .get(i);
247: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
248: if (endTag.type.equals("ELSE")) {
249: s = (TKTemplateSyntax) subSyntaxes
250: .get(size - 1);
251: return s.apply(td);
252: }
253: }
254: }
255: }
256: return null;
257: }
258:
259: public void apply(TKTemplateData td, Writer writer)
260: throws TKTemplateSyntaxException, IOException {
261: String name = getName(td);
262: if (name.equals("EVAL")) {
263: int size = subDefs.size();
264: for (int i = 0; i < size; i++) {
265: String expression = getValue(i, td);
266: StringBuffer buf = new StringBuffer();
267: for (int j = 0; j < expression.length(); j++) {
268:
269: char chr = expression.charAt(j);
270: if (chr == '\\') {
271: if (++j >= expression.length())
272: break;
273: else
274: chr = expression.charAt(j);
275: }
276: buf.append(chr);
277: }
278:
279: Eval ev = new Eval();
280: double result = 0;
281: try {
282: result = ev.eval(buf.toString());
283: } catch (Exception e) {
284: CAT.error("error in if-eval-tag: ", e);
285: }
286: if (Math.abs(result) > THRESHOLD) {
287: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
288: .get(i);
289: s.apply(td, writer);
290: return;
291: }
292: if (i == size - 2) {
293: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
294: .get(i);
295: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
296: if (endTag.type.equals("ELSE")) {
297: s = (TKTemplateSyntax) subSyntaxes
298: .get(size - 1);
299: s.apply(td, writer);
300: return;
301: }
302: }
303: }
304: } else if (name.equals("EXPRESSION")) {
305: int size = subDefs.size();
306: for (int i = 0; i < size; i++) {
307: String expression = getValue(i, td);
308: StringBuffer buf = new StringBuffer();
309: for (int j = 0; j < expression.length(); j++) {
310:
311: char chr = expression.charAt(j);
312: if (chr == '\\') {
313: if (++j >= expression.length())
314: break;
315: else
316: chr = expression.charAt(j);
317: }
318: buf.append(chr);
319: }
320:
321: String result = "";
322: try {
323: result = TKExpressionTag.eval(buf.toString());
324: } catch (Exception e) {
325: CAT.error("error in if-expression-tag: ", e);
326: }
327:
328: if (result.length() > 0 && !result.equals("0")) {
329: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
330: .get(i);
331: s.apply(td, writer);
332: return;
333: }
334: if (i == size - 2) {
335: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
336: .get(i);
337: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
338: if (endTag.type.equals("ELSE")) {
339: s = (TKTemplateSyntax) subSyntaxes
340: .get(size - 1);
341: s.apply(td, writer);
342: return;
343: }
344: }
345: }
346: }
347: Object value = td.getVariable(name);
348: if (value == null) {
349: int size = subSyntaxes.size();
350: if (size < 2)
351: return;
352: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
353: .get(size - 2);
354: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
355: if (!endTag.type.equals("ELSE"))
356: return;
357: s = (TKTemplateSyntax) subSyntaxes.get(size - 1);
358: s.apply(td, writer);
359: return;
360: }
361:
362: if (value instanceof Vector) {
363: int size = subDefs.size();
364: for (int i = 0; i < size; i++) {
365: String val = getValue(i, td);
366: Enumeration e = ((TKVector) value).elements();
367: while (e.hasMoreElements()) {
368: String svalue = e.nextElement().toString();
369: if (val.equalsIgnoreCase(svalue)) {
370: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
371: .get(i);
372: s.apply(td, writer);
373: return;
374: }
375: }
376: if (i == size - 2) {
377: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
378: .get(i);
379: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
380: if (endTag.type.equals("ELSE")) {
381: s = (TKTemplateSyntax) subSyntaxes
382: .get(size - 1);
383: s.apply(td, writer);
384: return;
385: }
386: }
387: }
388: } else {
389: String svalue = value.toString();
390:
391: int size = subDefs.size();
392: for (int i = 0; i < size; i++) {
393: String val = getValue(i, td);
394: if (val.equalsIgnoreCase(svalue)) {
395: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
396: .get(i);
397: s.apply(td, writer);
398: return;
399: }
400: if (i == size - 2) {
401: TKTemplateSyntax s = (TKTemplateSyntax) subSyntaxes
402: .get(i);
403: TKEndTag endTag = (TKEndTag) s.tags.lastElement();
404: if (endTag.type.equals("ELSE")) {
405: s = (TKTemplateSyntax) subSyntaxes
406: .get(size - 1);
407: s.apply(td, writer);
408: return;
409: }
410: }
411: }
412: }
413: }
414: }
|