KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > soto > util > matcher > CharSeq


1 package org.sapia.soto.util.matcher;
2
3 import java.util.ArrayList JavaDoc;
4 import java.util.List JavaDoc;
5 import java.util.Stack JavaDoc;
6
7
8 /**
9  * @author Yanick Duchesne
10  * <dl>
11  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
12  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
13  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
14  * </dl>
15  */

16 public class CharSeq implements PatternElement {
17   private static final char ASTERISK = '*';
18   private String JavaDoc[] _tokens;
19   private boolean _exactStart;
20   private boolean _exactEnd;
21   private PatternElement _next;
22
23   /**
24    * Constructor for CharSeq.
25    */

26   public CharSeq(String JavaDoc chars, boolean ignoreCase) {
27     _tokens = split(chars);
28
29     if (ignoreCase) {
30       for (int i = 0; i < _tokens.length; i++) {
31         _tokens[i] = _tokens[i].toLowerCase();
32       }
33     }
34   }
35
36   /**
37    * @see org.sapia.soto.util.matcher.PatternElement#setNext(PatternElement)
38    */

39   public void setNext(PatternElement elem) {
40     _next = elem;
41   }
42
43   /**
44    * @see org.sapia.soto.util.matcher.PatternElement#getNext()
45    */

46   public PatternElement getNext() {
47     return _next;
48   }
49
50   public boolean matches(Stack JavaDoc tokens) {
51     if (tokens.size() == 0) {
52       if (_tokens.length == 0) {
53         return true;
54       }
55
56       return false;
57     }
58
59     String JavaDoc token = (String JavaDoc) tokens.pop();
60     int idx = 0;
61
62     for (int i = 0; i < _tokens.length; i++) {
63       idx = token.indexOf(_tokens[i], idx);
64
65       if (idx < 0) {
66         return false;
67       }
68
69       if ((i == 0) && _exactStart && (idx != 0)) {
70         return false;
71       }
72
73       if ((i == (_tokens.length - 1)) && _exactEnd &&
74             ((idx + _tokens[i].length()) != token.length())) {
75         return false;
76       }
77
78       idx = idx + _tokens[i].length();
79
80       if ((idx >= token.length()) && (i < (_tokens.length - 1))) {
81         return false;
82       }
83     }
84
85     if (_next != null) {
86       return _next.matches(tokens);
87     }
88
89     return true;
90   }
91
92   private String JavaDoc[] split(String JavaDoc chars) {
93     _exactStart = ((chars.length() > 0) && (chars.charAt(0) != ASTERISK));
94     _exactEnd = ((chars.length() > 0) &&
95       (chars.charAt(chars.length() - 1) != ASTERISK));
96
97     List JavaDoc tokens = new ArrayList JavaDoc();
98
99     StringBuffer JavaDoc token = new StringBuffer JavaDoc();
100
101     for (int i = 0; i < chars.length(); i++) {
102       if (chars.charAt(i) == ASTERISK) {
103         tokens.add(token.toString());
104         token.delete(0, token.length());
105       } else {
106         token.append(chars.charAt(i));
107       }
108     }
109
110     if (token.length() > 0) {
111       tokens.add(token.toString());
112     }
113
114     return (String JavaDoc[]) tokens.toArray(new String JavaDoc[tokens.size()]);
115   }
116
117   // public static void main(String[] args) {
118
// CharSeq pattern = new CharSeq("*Str*Buf*er*");
119
//// System.out.println(pattern.matches("SomeStingBufffferSome"));
120
// }
121
}
122
Popular Tags