KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > directory > ldapstudio > browser > core > model > filter > parser > LdapFilterParser


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  *
19  */

20
21 package org.apache.directory.ldapstudio.browser.core.model.filter.parser;
22
23
24 import java.util.Stack JavaDoc;
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 JavaDoc 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 JavaDoc ldapFilter )
58     {
59
60         // reset state
61
this.filterStack = new Stack JavaDoc();
62         this.scanner.setFilter( ldapFilter );
63         this.model = new LdapFilter();
64
65         // handle error tokens before filter
66
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         // check filter start
74
if ( token.getType() == LdapFilterToken.LPAR )
75         {
76
77             // start top level filter
78
this.model.setStartToken( token );
79             filterStack.push( this.model );
80
81             // loop till filter end or EOF
82
do
83             {
84
85                 // next token
86
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                         /*
113                          * if(!filterStack.isEmpty()) { LdapFilter parentFilter =
114                          * (LdapFilter) filterStack.peek(); LdapFilterComponent
115                          * filterComponent = parentFilter.getFilterComponent();
116                          * filterComponent.addFilter(currentFilter); }
117                          */

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         // handle error token after filter
197
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 JavaDoc[] args )
217     {
218         LdapFilterParser parser = new LdapFilterParser();
219         parser.parse( "(sn" );
220
221     }
222
223 }
224
Popular Tags