1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.dsmlv2;
21
22
23 import java.io.FileNotFoundException;
24 import java.io.FileReader;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.Reader;
28 import java.io.StringReader;
29
30 import org.apache.directory.api.dsmlv2.request.BatchRequestDsml;
31 import org.apache.directory.api.dsmlv2.request.Dsmlv2Grammar;
32 import org.apache.directory.api.i18n.I18n;
33 import org.apache.directory.api.ldap.model.message.Request;
34 import org.apache.directory.api.util.Strings;
35 import org.xmlpull.v1.XmlPullParser;
36 import org.xmlpull.v1.XmlPullParserException;
37 import org.xmlpull.v1.XmlPullParserFactory;
38
39
40
41
42
43
44
45
46 public class Dsmlv2Parser
47 {
48
49 private Dsmlv2Container container;
50
51
52
53
54
55 private boolean storeMsgInBatchReq = true;
56
57
58 private Dsmlv2Grammar grammar;
59
60
61
62
63
64
65
66 public Dsmlv2Parser() throws XmlPullParserException
67 {
68 this( true );
69 }
70
71
72
73
74
75
76
77
78 public Dsmlv2Parser( boolean storeMsgInBatchReq ) throws XmlPullParserException
79 {
80 this.storeMsgInBatchReq = storeMsgInBatchReq;
81
82 this.grammar = new Dsmlv2Grammar();
83 this.container = new Dsmlv2Container( grammar.getLdapCodecService() );
84
85 this.container.setGrammar( grammar );
86
87 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
88 factory.setNamespaceAware( true );
89 XmlPullParser xpp = factory.newPullParser();
90
91 container.setParser( xpp );
92 }
93
94
95
96
97
98
99
100 public Dsmlv2Parser( Dsmlv2Grammar grammar ) throws XmlPullParserException
101 {
102 this.container = new Dsmlv2Container( grammar.getLdapCodecService() );
103 this.container.setGrammar( grammar );
104 this.grammar = grammar;
105
106 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
107 factory.setNamespaceAware( true );
108 XmlPullParser xpp = factory.newPullParser();
109
110 container.setParser( xpp );
111 }
112
113
114
115
116
117
118
119
120
121 public void setInputFile( String fileName ) throws FileNotFoundException, XmlPullParserException
122 {
123 Reader reader = new FileReader( fileName );
124 container.getParser().setInput( reader );
125 }
126
127
128
129
130
131
132
133
134
135 public void setInput( InputStream inputStream, String inputEncoding ) throws XmlPullParserException
136 {
137 container.getParser().setInput( inputStream, inputEncoding );
138 }
139
140
141
142
143
144
145
146
147 public void setInput( String str ) throws XmlPullParserException
148 {
149 container.getParser().setInput( new StringReader( str ) );
150 }
151
152
153
154
155
156
157
158
159 public void parse() throws XmlPullParserException, IOException
160 {
161 grammar.executeAction( container );
162 }
163
164
165
166
167
168
169
170 public void parseBatchRequest() throws XmlPullParserException
171 {
172 XmlPullParser xpp = container.getParser();
173
174 int eventType = xpp.getEventType();
175
176 do
177 {
178 switch ( eventType )
179 {
180 case XmlPullParser.START_DOCUMENT:
181 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
182 break;
183
184 case XmlPullParser.END_DOCUMENT:
185 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
186 break;
187
188 case XmlPullParser.START_TAG:
189 processTag( container, Tag.START );
190 break;
191
192 case XmlPullParser.END_TAG:
193 processTag( container, Tag.END );
194 break;
195 }
196
197 try
198 {
199 eventType = xpp.next();
200 }
201 catch ( IOException e )
202 {
203 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, e.getLocalizedMessage() ), xpp, null );
204 }
205 }
206 while ( container.getState() != Dsmlv2StatesEnum.BATCHREQUEST_START_TAG );
207
208 BatchRequestDsml br = container.getBatchRequest();
209
210 if ( br != null )
211 {
212 br.setStoreReq( storeMsgInBatchReq );
213 }
214 }
215
216
217
218
219
220
221
222
223
224 private static void processTag( Dsmlv2Container container, int tagType ) throws XmlPullParserException
225 {
226 XmlPullParser xpp = container.getParser();
227
228 String tagName = Strings.toLowerCase( xpp.getName() );
229
230 GrammarTransition transition = container.getTransition( container.getState(), new Tag( tagName, tagType ) );
231
232 if ( transition != null )
233 {
234 container.setState( transition.getNextState() );
235
236 if ( transition.hasAction() )
237 {
238 transition.getAction().action( container );
239 }
240 }
241 else
242 {
243 throw new XmlPullParserException( I18n.err( I18n.ERR_03036, new Tag( tagName, tagType ) ), xpp, null );
244 }
245 }
246
247
248
249
250
251
252
253 public BatchRequestDsml getBatchRequest()
254 {
255 return container.getBatchRequest();
256 }
257
258
259
260
261
262
263
264 public DsmlDecorator<? extends Request> getNextRequest() throws XmlPullParserException
265 {
266 if ( container.getBatchRequest() == null )
267 {
268 parseBatchRequest();
269 }
270
271 XmlPullParser xpp = container.getParser();
272
273 int eventType = xpp.getEventType();
274 do
275 {
276 while ( eventType == XmlPullParser.TEXT )
277 {
278 try
279 {
280 xpp.next();
281 }
282 catch ( IOException e )
283 {
284 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, e.getLocalizedMessage() ), xpp, null );
285 }
286 eventType = xpp.getEventType();
287 }
288
289 switch ( eventType )
290 {
291 case XmlPullParser.START_DOCUMENT:
292 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
293 break;
294
295 case XmlPullParser.END_DOCUMENT:
296 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
297 return null;
298
299 case XmlPullParser.START_TAG:
300 processTag( container, Tag.START );
301 break;
302
303 case XmlPullParser.END_TAG:
304 processTag( container, Tag.END );
305 break;
306 }
307
308 try
309 {
310 eventType = xpp.next();
311 }
312 catch ( IOException e )
313 {
314 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, e.getLocalizedMessage() ), xpp, null );
315 }
316 }
317 while ( container.getState() != Dsmlv2StatesEnum.BATCHREQUEST_LOOP );
318
319 return container.getBatchRequest().getCurrentRequest();
320 }
321
322
323
324
325
326
327
328 public void parseAllRequests() throws XmlPullParserException
329 {
330 while ( getNextRequest() != null )
331 {
332 continue;
333 }
334 }
335 }