1 package org.sapia.soto.util.matcher; 2 3 import java.util.ArrayList ; 4 import java.util.List ; 5 import java.util.Stack ; 6 7 8 16 public class CharSeq implements PatternElement { 17 private static final char ASTERISK = '*'; 18 private String [] _tokens; 19 private boolean _exactStart; 20 private boolean _exactEnd; 21 private PatternElement _next; 22 23 26 public CharSeq(String 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 39 public void setNext(PatternElement elem) { 40 _next = elem; 41 } 42 43 46 public PatternElement getNext() { 47 return _next; 48 } 49 50 public boolean matches(Stack tokens) { 51 if (tokens.size() == 0) { 52 if (_tokens.length == 0) { 53 return true; 54 } 55 56 return false; 57 } 58 59 String token = (String ) 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 [] split(String 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 tokens = new ArrayList (); 98 99 StringBuffer token = new StringBuffer (); 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 []) tokens.toArray(new String [tokens.size()]); 115 } 116 117 } 122 | Popular Tags |