1 20 21 package org.apache.directory.ldapstudio.browser.core.model.filter.parser; 22 23 24 public class LdapFilterScanner 25 { 26 27 75 private String filter; 76 77 private int pos; 78 79 private int lastTokenType; 80 81 82 public LdapFilterScanner() 83 { 84 super(); 85 this.filter = ""; 86 } 87 88 89 public void setFilter( String filter ) 90 { 91 this.filter = filter; 92 this.pos = -1; 93 this.lastTokenType = LdapFilterToken.NEW; 94 } 95 96 97 private char currentChar() 98 { 99 return 0 <= pos && pos < filter.length() ? filter.charAt( pos ) : '\u0000'; 100 } 101 102 103 private char nextChar() 104 { 105 pos++; 106 return currentChar(); 107 } 108 109 110 private char prevChar() 111 { 112 pos--; 113 return currentChar(); 114 } 115 116 117 private char nextNonLinebreakChar() 118 { 119 while ( nextChar() == '\n' ); 120 return currentChar(); 121 } 122 123 124 private char prevNonLinebreakChar() 125 { 126 while ( prevChar() == '\n' ); 127 return currentChar(); 128 } 129 130 131 140 public LdapFilterToken nextToken() 141 { 142 char c; 143 144 c = nextChar(); 146 if ( c == '\u0000' ) 147 { 148 return new LdapFilterToken( LdapFilterToken.EOF, "", pos ); 149 } 150 else 151 { 152 prevChar(); 153 } 154 155 c = nextChar(); 157 if ( Character.isWhitespace( c ) 158 && ( lastTokenType == LdapFilterToken.RPAR || lastTokenType == LdapFilterToken.AND 159 || lastTokenType == LdapFilterToken.OR || lastTokenType == LdapFilterToken.NOT ) ) 160 { 161 StringBuffer sb = new StringBuffer (); 162 while ( Character.isWhitespace( c ) ) 163 { 164 sb.append( c ); 165 c = nextChar(); 166 } 167 prevChar(); 168 return new LdapFilterToken( LdapFilterToken.WHITESPACE, sb.toString(), pos - sb.length() + 1 ); 169 } 170 else 171 { 172 prevChar(); 173 } 174 175 c = nextChar(); 177 switch ( c ) 178 { 179 case '(': 180 this.lastTokenType = LdapFilterToken.LPAR; 181 return new LdapFilterToken( this.lastTokenType, "(", pos ); 182 case ')': 183 this.lastTokenType = LdapFilterToken.RPAR; 184 return new LdapFilterToken( this.lastTokenType, ")", pos ); 185 case '&': 186 if ( lastTokenType == LdapFilterToken.LPAR ) 187 { 188 this.lastTokenType = LdapFilterToken.AND; 191 return new LdapFilterToken( this.lastTokenType, "&", pos ); 192 } 197 break; 198 case '|': 199 if ( lastTokenType == LdapFilterToken.LPAR ) 200 { 201 this.lastTokenType = LdapFilterToken.OR; 204 return new LdapFilterToken( this.lastTokenType, "|", pos ); 205 } 210 break; 211 case '!': 212 if ( lastTokenType == LdapFilterToken.LPAR ) 213 { 214 this.lastTokenType = LdapFilterToken.NOT; 217 return new LdapFilterToken( this.lastTokenType, "!", pos ); 218 } 223 break; 224 case '=': 225 if ( lastTokenType == LdapFilterToken.ATTRIBUTE ) 226 { 227 if ( nextChar() == '*' ) 228 { 229 char t = nextChar(); 230 if ( t == ')' || t == '\u0000' ) 231 { 232 prevChar(); 233 this.lastTokenType = LdapFilterToken.PRESENT; 234 return new LdapFilterToken( this.lastTokenType, "=*", pos - 1 ); 235 } 236 else 237 { 238 prevChar(); 239 prevChar(); 240 this.lastTokenType = LdapFilterToken.EQUAL; 241 return new LdapFilterToken( this.lastTokenType, "=", pos ); 242 } 243 } 244 else 245 { 246 prevChar(); 247 this.lastTokenType = LdapFilterToken.EQUAL; 248 return new LdapFilterToken( this.lastTokenType, "=", pos ); 249 } 250 } 251 break; 252 case '>': 253 if ( lastTokenType == LdapFilterToken.ATTRIBUTE ) 254 { 255 if ( nextChar() == '=' ) 256 { 257 this.lastTokenType = LdapFilterToken.GREATER; 258 return new LdapFilterToken( this.lastTokenType, ">=", pos - 1 ); 259 } 260 else 261 { 262 prevChar(); 263 } 264 } 265 break; 266 case '<': 267 if ( lastTokenType == LdapFilterToken.ATTRIBUTE ) 268 { 269 if ( nextChar() == '=' ) 270 { 271 this.lastTokenType = LdapFilterToken.LESS; 272 return new LdapFilterToken( this.lastTokenType, "<=", pos - 1 ); 273 } 274 else 275 { 276 prevChar(); 277 } 278 } 279 break; 280 case '~': 281 if ( lastTokenType == LdapFilterToken.ATTRIBUTE ) 282 { 283 if ( nextChar() == '=' ) 284 { 285 this.lastTokenType = LdapFilterToken.APROX; 286 return new LdapFilterToken( this.lastTokenType, "~=", pos - 1 ); 287 } 288 else 289 { 290 prevChar(); 291 } 292 } 293 break; 294 } prevChar(); 296 297 if ( this.lastTokenType == LdapFilterToken.LPAR ) 299 { 300 StringBuffer sb = new StringBuffer (); 301 302 c = nextChar(); 304 while ( c != '=' && c != '<' && c != '>' && c != '~' && c != '(' && c != ')' && c != '\u0000' 305 && !Character.isWhitespace( c ) ) 306 { 307 sb.append( c ); 308 c = nextChar(); 309 } 310 prevChar(); 311 312 if ( sb.length() > 0 ) 313 { 314 this.lastTokenType = LdapFilterToken.ATTRIBUTE; 315 return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 ); 316 } 317 } 318 319 if ( lastTokenType == LdapFilterToken.EQUAL || lastTokenType == LdapFilterToken.GREATER 321 || lastTokenType == LdapFilterToken.LESS || lastTokenType == LdapFilterToken.APROX ) 322 { 323 324 StringBuffer sb = new StringBuffer (); 325 c = nextNonLinebreakChar(); 326 while ( c != '(' && c != ')' && c != '\u0000' ) 327 { 328 sb.append( c ); 329 c = nextNonLinebreakChar(); 330 } 331 prevNonLinebreakChar(); 332 333 if ( sb.length() > 0 ) 334 { 335 this.lastTokenType = LdapFilterToken.VALUE; 336 return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 ); 337 } 338 } 339 340 StringBuffer sb = new StringBuffer (); 342 c = nextChar(); 343 while ( c != '(' && c != ')' && c != '\u0000' ) 344 { 345 sb.append( c ); 346 c = nextChar(); 347 } 348 prevChar(); 349 return new LdapFilterToken( LdapFilterToken.UNKNOWN, sb.toString(), pos - sb.length() + 1 ); 353 } 354 355 } 356 | Popular Tags |