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