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.IOException;
24 import java.io.InputStream;
25 import java.io.InputStreamReader;
26 import java.io.Reader;
27 import java.io.StringReader;
28 import java.nio.charset.Charset;
29 import java.nio.file.Files;
30 import java.nio.file.Paths;
31
32 import org.apache.directory.api.dsmlv2.response.BatchResponseDsml;
33 import org.apache.directory.api.dsmlv2.response.Dsmlv2ResponseGrammar;
34 import org.apache.directory.api.i18n.I18n;
35 import org.apache.directory.api.ldap.codec.api.LdapApiService;
36 import org.apache.directory.api.ldap.model.message.Response;
37 import org.apache.directory.api.util.Strings;
38 import org.xmlpull.v1.XmlPullParser;
39 import org.xmlpull.v1.XmlPullParserException;
40 import org.xmlpull.v1.XmlPullParserFactory;
41
42
43
44
45
46
47
48
49 public class Dsmlv2ResponseParser
50 {
51
52 private Dsmlv2Container container;
53
54
55
56
57
58
59
60
61 public Dsmlv2ResponseParser( LdapApiService codec ) throws XmlPullParserException
62 {
63 this.container = new Dsmlv2Container( codec );
64
65 this.container.setGrammar( Dsmlv2ResponseGrammar.getInstance() );
66
67 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
68 factory.setNamespaceAware( true );
69 XmlPullParser xpp = factory.newPullParser();
70
71 container.setParser( xpp );
72 }
73
74
75
76
77
78
79
80
81 public void setInput( String str ) throws XmlPullParserException
82 {
83 container.getParser().setInput( new StringReader( str ) );
84 }
85
86
87
88
89
90
91
92
93
94 public void setInputFile( String fileName ) throws IOException, XmlPullParserException
95 {
96 try ( Reader reader = new InputStreamReader( Files.newInputStream( Paths.get( fileName ) ),
97 Charset.defaultCharset() ) )
98 {
99 container.getParser().setInput( reader );
100 }
101 }
102
103
104
105
106
107
108
109
110
111 public void setInput( InputStream inputStream, String inputEncoding ) throws XmlPullParserException
112 {
113 container.getParser().setInput( inputStream, inputEncoding );
114 }
115
116
117
118
119
120
121
122
123 public void parse() throws XmlPullParserException, IOException
124 {
125 Dsmlv2ResponseGrammar grammar = Dsmlv2ResponseGrammar.getInstance();
126
127 grammar.executeAction( container );
128 }
129
130
131
132
133
134
135
136 public void parseBatchResponse() throws XmlPullParserException
137 {
138 XmlPullParser xpp = container.getParser();
139
140 int eventType = xpp.getEventType();
141
142 do
143 {
144 switch ( eventType )
145 {
146 case XmlPullParser.START_DOCUMENT :
147 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
148 break;
149
150 case XmlPullParser.END_DOCUMENT :
151 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
152 break;
153
154 case XmlPullParser.START_TAG :
155 processTag( container, Tag.START );
156 break;
157
158 case XmlPullParser.END_TAG :
159 processTag( container, Tag.END );
160 break;
161
162 default:
163 break;
164 }
165
166 try
167 {
168 eventType = xpp.next();
169 }
170 catch ( IOException ioe )
171 {
172 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, ioe.getLocalizedMessage() ), xpp, ioe );
173 }
174 }
175 while ( container.getState() != Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP );
176 }
177
178
179
180
181
182
183
184
185
186 private static void processTag( Dsmlv2Container container, int tagType ) throws XmlPullParserException
187 {
188 XmlPullParser xpp = container.getParser();
189
190 String tagName = Strings.lowerCase( xpp.getName() );
191
192 GrammarTransition transition = container.getTransition( container.getState(), new Tag( tagName, tagType ) );
193
194 if ( transition != null )
195 {
196 container.setState( transition.getNextState() );
197
198 if ( transition.hasAction() )
199 {
200 transition.getAction().action( container );
201 }
202 }
203 else
204 {
205 throw new XmlPullParserException( I18n.err( I18n.ERR_03036, new Tag( tagName, tagType ) ), xpp, null );
206 }
207 }
208
209
210
211
212
213
214
215 public BatchResponseDsml getBatchResponse()
216 {
217 return container.getBatchResponse();
218 }
219
220
221
222
223
224
225
226 public DsmlDecorator<? extends Response> getNextResponse() throws XmlPullParserException
227 {
228 if ( container.getBatchResponse() == null )
229 {
230 parseBatchResponse();
231 }
232
233 XmlPullParser xpp = container.getParser();
234
235 int eventType = xpp.getEventType();
236 do
237 {
238 while ( eventType == XmlPullParser.TEXT )
239 {
240 try
241 {
242 xpp.next();
243 }
244 catch ( IOException ioe )
245 {
246 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, ioe.getLocalizedMessage() ), xpp, ioe );
247 }
248 eventType = xpp.getEventType();
249 }
250
251 switch ( eventType )
252 {
253 case XmlPullParser.START_DOCUMENT :
254 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
255 break;
256
257 case XmlPullParser.END_DOCUMENT :
258 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
259 return null;
260
261 case XmlPullParser.START_TAG :
262 processTag( container, Tag.START );
263 break;
264
265 case XmlPullParser.END_TAG :
266 processTag( container, Tag.END );
267 break;
268
269 default:
270 break;
271 }
272
273 try
274 {
275 eventType = xpp.next();
276 }
277 catch ( IOException ioe )
278 {
279 throw new XmlPullParserException( I18n.err( I18n.ERR_03037, ioe.getLocalizedMessage() ), xpp, ioe );
280 }
281 }
282 while ( container.getState() != Dsmlv2StatesEnum.BATCH_RESPONSE_LOOP );
283
284 return container.getBatchResponse().getCurrentResponse();
285 }
286
287
288
289
290
291
292
293 public void parseAllResponses() throws XmlPullParserException
294 {
295 while ( getNextResponse() != null )
296 {
297 continue;
298 }
299 }
300 }