1 20 21 package org.apache.directory.ldapstudio.browser.core.model.filter.parser; 22 23 24 import java.util.Stack ; 25 26 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapAndFilterComponent; 27 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapFilter; 28 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapFilterComponent; 29 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapFilterItemComponent; 30 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapNotFilterComponent; 31 import org.apache.directory.ldapstudio.browser.core.model.filter.LdapOrFilterComponent; 32 33 34 public class LdapFilterParser 35 { 36 37 private LdapFilterScanner scanner; 38 39 private Stack filterStack; 40 41 private LdapFilter model; 42 43 44 public LdapFilterParser() 45 { 46 this.scanner = new LdapFilterScanner(); 47 this.model = new LdapFilter(); 48 } 49 50 51 public LdapFilter getModel() 52 { 53 return this.model; 54 } 55 56 57 public void parse( String ldapFilter ) 58 { 59 60 this.filterStack = new Stack (); 62 this.scanner.setFilter( ldapFilter ); 63 this.model = new LdapFilter(); 64 65 LdapFilterToken token = this.scanner.nextToken(); 67 while ( token.getType() != LdapFilterToken.LPAR && token.getType() != LdapFilterToken.EOF ) 68 { 69 this.handleError( false, token, this.model ); 70 token = scanner.nextToken(); 71 } 72 73 if ( token.getType() == LdapFilterToken.LPAR ) 75 { 76 77 this.model.setStartToken( token ); 79 filterStack.push( this.model ); 80 81 do 83 { 84 85 token = this.scanner.nextToken(); 87 88 switch ( token.getType() ) 89 { 90 case LdapFilterToken.LPAR: 91 { 92 LdapFilter newFilter = new LdapFilter(); 93 newFilter.setStartToken( token ); 94 95 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 96 LdapFilterComponent filterComponent = currentFilter.getFilterComponent(); 97 if ( filterComponent != null && filterComponent.addFilter( newFilter ) ) 98 { 99 filterStack.push( newFilter ); 100 } 101 else 102 { 103 currentFilter.addOtherToken( token ); 104 } 105 106 break; 107 } 108 case LdapFilterToken.RPAR: 109 { 110 LdapFilter currentFilter = ( LdapFilter ) filterStack.pop(); 111 this.handleError( currentFilter.setStopToken( token ), token, currentFilter ); 112 118 break; 119 } 120 case LdapFilterToken.AND: 121 { 122 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 123 LdapAndFilterComponent filterComponent = new LdapAndFilterComponent( currentFilter ); 124 filterComponent.setStartToken( token ); 125 this.handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter ); 126 break; 127 } 128 case LdapFilterToken.OR: 129 { 130 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 131 LdapOrFilterComponent filterComponent = new LdapOrFilterComponent( currentFilter ); 132 filterComponent.setStartToken( token ); 133 this.handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter ); 134 break; 135 } 136 case LdapFilterToken.NOT: 137 { 138 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 139 LdapNotFilterComponent filterComponent = new LdapNotFilterComponent( currentFilter ); 140 filterComponent.setStartToken( token ); 141 this.handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter ); 142 break; 143 } 144 case LdapFilterToken.ATTRIBUTE: 145 { 146 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 147 LdapFilterItemComponent filterComponent = new LdapFilterItemComponent( currentFilter ); 148 filterComponent.setAttributeToken( token ); 149 this.handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter ); 150 break; 151 } 152 case LdapFilterToken.VALUE: 153 { 154 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 155 LdapFilterComponent filterComponent = currentFilter.getFilterComponent(); 156 this.handleError( ( filterComponent instanceof LdapFilterItemComponent ) 157 && ( ( LdapFilterItemComponent ) filterComponent ).setValueToken( token ), token, 158 currentFilter ); 159 break; 160 } 161 case LdapFilterToken.EQUAL: 162 case LdapFilterToken.GREATER: 163 case LdapFilterToken.LESS: 164 case LdapFilterToken.APROX: 165 case LdapFilterToken.PRESENT: 166 { 167 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 168 LdapFilterComponent filterComponent = currentFilter.getFilterComponent(); 169 this.handleError( ( filterComponent instanceof LdapFilterItemComponent ) 170 && ( ( LdapFilterItemComponent ) filterComponent ).setFiltertypeToken( token ), token, 171 currentFilter ); 172 break; 173 } 174 case LdapFilterToken.WHITESPACE: 175 { 176 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 177 currentFilter.addOtherToken( token ); 178 break; 179 } 180 case LdapFilterToken.EOF: 181 { 182 this.model.addOtherToken( token ); 183 break; 184 } 185 default: 186 { 187 LdapFilter currentFilter = ( LdapFilter ) filterStack.peek(); 188 this.handleError( false, token, currentFilter ); 189 } 190 } 191 } 192 while ( !filterStack.isEmpty() && token.getType() != LdapFilterToken.EOF ); 193 194 } 195 196 token = scanner.nextToken(); 198 while ( token.getType() != LdapFilterToken.EOF ) 199 { 200 this.handleError( false, token, this.model ); 201 token = scanner.nextToken(); 202 } 203 204 } 205 206 207 private void handleError( boolean success, LdapFilterToken token, LdapFilter filter ) 208 { 209 if ( !success ) 210 { 211 filter.addOtherToken( new LdapFilterToken( LdapFilterToken.ERROR, token.getValue(), token.getOffset() ) ); 212 } 213 } 214 215 216 public static void main( String [] args ) 217 { 218 LdapFilterParser parser = new LdapFilterParser(); 219 parser.parse( "(sn" ); 220 221 } 222 223 } 224 | Popular Tags |