1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 package org.mule.module.xml.stax;
36
37 import javanet.staxutils.DummyLocator;
38 import javanet.staxutils.StAXReaderToContentHandler;
39 import javanet.staxutils.helpers.XMLFilterImplEx;
40
41 import javax.xml.namespace.QName;
42 import javax.xml.stream.Location;
43 import javax.xml.stream.XMLStreamConstants;
44 import javax.xml.stream.XMLStreamException;
45 import javax.xml.stream.XMLStreamReader;
46
47 import org.xml.sax.Attributes;
48 import org.xml.sax.Locator;
49 import org.xml.sax.SAXException;
50 import org.xml.sax.helpers.AttributesImpl;
51
52
53
54
55
56
57
58
59
60 public class XMLStreamReaderToContentHandler implements StAXReaderToContentHandler
61 {
62
63
64 private final XMLStreamReader staxStreamReader;
65
66
67 private XMLFilterImplEx filter;
68
69
70
71
72
73
74
75
76 public XMLStreamReaderToContentHandler(XMLStreamReader staxCore, XMLFilterImplEx filter)
77 {
78 staxStreamReader = staxCore;
79
80 this.filter = filter;
81 }
82
83 public void bridge() throws XMLStreamException
84 {
85 try
86 {
87
88 int depth = 0;
89 boolean isDocument = false;
90
91 handleStartDocument();
92
93
94 int event = staxStreamReader.getEventType();
95 if (event == XMLStreamConstants.START_DOCUMENT)
96 {
97 isDocument = true;
98 event = staxStreamReader.next();
99 while (event != XMLStreamConstants.START_ELEMENT)
100 {
101 switch (event)
102 {
103 case XMLStreamConstants.COMMENT :
104 handleComment();
105 break;
106 case XMLStreamConstants.PROCESSING_INSTRUCTION :
107 handlePI();
108 break;
109 }
110 event = staxStreamReader.next();
111 }
112 }
113
114 if (event != XMLStreamConstants.START_ELEMENT)
115 throw new IllegalStateException("The current event is not START_ELEMENT\n but" + event);
116
117 do
118 {
119
120
121
122 switch (event)
123 {
124 case XMLStreamConstants.START_ELEMENT :
125 depth++;
126 handleStartElement();
127 break;
128 case XMLStreamConstants.END_ELEMENT :
129 handleEndElement();
130 depth--;
131 break;
132 case XMLStreamConstants.CHARACTERS :
133 handleCharacters();
134 break;
135 case XMLStreamConstants.ENTITY_REFERENCE :
136 handleEntityReference();
137 break;
138 case XMLStreamConstants.PROCESSING_INSTRUCTION :
139 handlePI();
140 break;
141 case XMLStreamConstants.COMMENT :
142 handleComment();
143 break;
144 case XMLStreamConstants.DTD :
145 handleDTD();
146 break;
147 case XMLStreamConstants.ATTRIBUTE :
148 handleAttribute();
149 break;
150 case XMLStreamConstants.NAMESPACE :
151 handleNamespace();
152 break;
153 case XMLStreamConstants.CDATA :
154 handleCDATA();
155 break;
156 case XMLStreamConstants.ENTITY_DECLARATION :
157 handleEntityDecl();
158 break;
159 case XMLStreamConstants.NOTATION_DECLARATION :
160 handleNotationDecl();
161 break;
162 case XMLStreamConstants.SPACE :
163 handleSpace();
164 break;
165 default :
166 throw new InternalError("processing event: " + event);
167 }
168
169 event = staxStreamReader.next();
170 }
171 while (depth != 0);
172
173
174 if (isDocument)
175 {
176 while (event != XMLStreamConstants.END_DOCUMENT)
177 {
178 switch (event)
179 {
180 case XMLStreamConstants.COMMENT :
181 handleComment();
182 break;
183 case XMLStreamConstants.PROCESSING_INSTRUCTION :
184 handlePI();
185 break;
186 }
187 event = staxStreamReader.next();
188 }
189 }
190
191 handleEndDocument();
192 }
193 catch (SAXException e)
194 {
195 throw new XMLStreamException(e);
196 }
197 }
198
199 protected void handleEndDocument() throws SAXException
200 {
201 filter.endDocument();
202 }
203
204 protected void handleStartDocument() throws SAXException
205 {
206 final Location location = staxStreamReader.getLocation();
207 if (location != null)
208 {
209 filter.setDocumentLocator(new Locator()
210 {
211 public int getColumnNumber()
212 {
213 return location.getColumnNumber();
214 }
215
216 public int getLineNumber()
217 {
218 return location.getLineNumber();
219 }
220
221 public String getPublicId()
222 {
223 return location.getPublicId();
224 }
225
226 public String getSystemId()
227 {
228 return location.getSystemId();
229 }
230 });
231 }
232 else
233 {
234 filter.setDocumentLocator(new DummyLocator());
235 }
236 filter.startDocument();
237 }
238
239 protected void handlePI() throws XMLStreamException
240 {
241 try
242 {
243 filter.processingInstruction(staxStreamReader.getPITarget(), staxStreamReader.getPIData());
244 }
245 catch (SAXException e)
246 {
247 throw new XMLStreamException(e);
248 }
249 }
250
251 protected void handleCharacters() throws XMLStreamException
252 {
253 char[] chars = staxStreamReader.getText().toCharArray();
254
255 try
256 {
257 filter.characters(chars, 0, chars.length);
258 }
259 catch (SAXException e)
260 {
261 throw new XMLStreamException(e);
262 }
263 }
264
265 protected void handleEndElement() throws XMLStreamException
266 {
267 QName qName = staxStreamReader.getName();
268
269 try
270 {
271
272 String prefix = qName.getPrefix();
273 String rawname;
274 if (prefix == null || prefix.length() == 0)
275 rawname = qName.getLocalPart();
276 else
277 rawname = prefix + ':' + qName.getLocalPart();
278
279 filter.endElement(qName.getNamespaceURI(), qName.getLocalPart(), rawname);
280
281
282 int nsCount = staxStreamReader.getNamespaceCount();
283 for (int i = nsCount - 1; i >= 0; i--)
284 {
285 String nsprefix = staxStreamReader.getNamespacePrefix(i);
286 if (nsprefix == null)
287 {
288 nsprefix = "";
289 }
290 filter.endPrefixMapping(nsprefix);
291 }
292 }
293 catch (SAXException e)
294 {
295 throw new XMLStreamException(e);
296 }
297 }
298
299 protected void handleStartElement() throws XMLStreamException
300 {
301
302 try
303 {
304
305 int nsCount = staxStreamReader.getNamespaceCount();
306 for (int i = 0; i < nsCount; i++)
307 {
308 String uri = staxStreamReader.getNamespaceURI(i);
309 if (uri == null)
310 {
311 uri = "";
312 }
313 String prefix = staxStreamReader.getNamespacePrefix(i);
314 if (prefix == null)
315 {
316 prefix = "";
317 }
318 filter.startPrefixMapping(prefix, uri);
319 }
320
321
322 QName qName = staxStreamReader.getName();
323 String prefix = qName.getPrefix();
324 String rawname;
325 if (prefix == null || prefix.length() == 0)
326 rawname = qName.getLocalPart();
327 else
328 rawname = prefix + ':' + qName.getLocalPart();
329 Attributes attrs = getAttributes();
330 filter.startElement(qName.getNamespaceURI(), qName.getLocalPart(), rawname, attrs);
331 }
332 catch (SAXException e)
333 {
334 throw new XMLStreamException(e);
335 }
336 }
337
338
339
340
341
342
343
344 protected Attributes getAttributes()
345 {
346 AttributesImpl attrs = new AttributesImpl();
347
348 int eventType = staxStreamReader.getEventType();
349 if (eventType != XMLStreamConstants.ATTRIBUTE && eventType != XMLStreamConstants.START_ELEMENT)
350 {
351 throw new InternalError("getAttributes() attempting to process: " + eventType);
352 }
353
354
355 if (filter.getNamespacePrefixes())
356 {
357 for (int i = 0; i < staxStreamReader.getNamespaceCount(); i++)
358 {
359 String uri = staxStreamReader.getNamespaceURI(i);
360 if (uri == null) uri = "";
361
362 String prefix = staxStreamReader.getNamespacePrefix(i);
363 if (prefix == null) prefix = "";
364
365 String qName = "xmlns";
366 if (prefix.length() == 0)
367 {
368 prefix = qName;
369 }
370 else
371 {
372 qName = qName + ':' + prefix;
373 }
374 attrs.addAttribute("http://www.w3.org/2000/xmlns/", prefix, qName, "CDATA", uri);
375 }
376 }
377
378
379 for (int i = 0; i < staxStreamReader.getAttributeCount(); i++)
380 {
381 String uri = staxStreamReader.getAttributeNamespace(i);
382 if (uri == null) uri = "";
383 String localName = staxStreamReader.getAttributeLocalName(i);
384 String prefix = staxStreamReader.getAttributePrefix(i);
385 String qName;
386 if (prefix == null || prefix.length() == 0)
387 qName = localName;
388 else
389 qName = prefix + ':' + localName;
390 String type = staxStreamReader.getAttributeType(i);
391 String value = staxStreamReader.getAttributeValue(i);
392
393 attrs.addAttribute(uri, localName, qName, type, value);
394 }
395
396 return attrs;
397 }
398
399 protected void handleNamespace()
400 {
401
402
403
404 }
405
406 protected void handleAttribute()
407 {
408
409
410
411 }
412
413 protected void handleDTD()
414 {
415
416
417 }
418
419 protected void handleComment() throws XMLStreamException
420 {
421 char[] chars = staxStreamReader.getText().toCharArray();
422
423 try
424 {
425 filter.comment(chars, 0, chars.length);
426 }
427 catch (SAXException e)
428 {
429 throw new XMLStreamException(e);
430 }
431 }
432
433 protected void handleEntityReference()
434 {
435
436 }
437
438 protected void handleSpace()
439 {
440
441
442 }
443
444 protected void handleNotationDecl()
445 {
446
447
448 }
449
450 protected void handleEntityDecl()
451 {
452
453
454 }
455
456 protected void handleCDATA()
457 {
458
459
460 }
461 }