1 package org.exolab.castor.xml;
2
3 import java.util.Iterator;
4 import java.util.LinkedList;
5 import java.util.List;
6
7 import javax.xml.namespace.QName;
8 import javax.xml.stream.Location;
9 import javax.xml.stream.XMLEventReader;
10 import javax.xml.stream.XMLStreamException;
11 import javax.xml.stream.events.Attribute;
12 import javax.xml.stream.events.Characters;
13 import javax.xml.stream.events.Namespace;
14 import javax.xml.stream.events.StartElement;
15 import javax.xml.stream.events.XMLEvent;
16
17 import org.xml.sax.Attributes;
18 import org.xml.sax.SAXException;
19 import org.xml.sax.SAXParseException;
20 import org.xml.sax.helpers.AttributesImpl;
21
22 public class Sax2EventFromStaxEventProducer extends BaseSax2EventFromStaxProducer {
23
24
25
26
27 private XMLEventReader eventReader;
28
29
30
31
32 private XMLEvent event;
33
34 public Sax2EventFromStaxEventProducer(XMLEventReader eventReader) {
35 this.eventReader = eventReader;
36 }
37
38 public void start() throws SAXException {
39
40 int depth = 0;
41
42 try {
43 while (eventReader.hasNext()) {
44 event = eventReader.nextEvent();
45 depth = handleEventType(event.getEventType(), depth);
46
47 if (depth <= 0) {
48 break;
49 }
50 }
51
52 } catch (XMLStreamException e) {
53
54
55 getErrorHandler().warning(
56 new SAXParseException(e.getMessage(), getSAXLocator(e
57 .getLocation()), null));
58 }
59 }
60
61 @Override
62 QName getQName() {
63 if (event.isEndElement()) {
64 return event.asEndElement().getName();
65 } else if (event.isStartElement()) {
66 return event.asStartElement().getName();
67 }
68 return null;
69 }
70
71 @Override
72 char[] getCharacters() {
73 Characters characters = event.asCharacters();
74 return characters.getData().toCharArray();
75 }
76
77 @Override
78 void doStartPrefixMapping() throws SAXException {
79
80 StartElement startElement = event.asStartElement();
81 Iterator<Namespace> nsIt = startElement.getNamespaces();
82
83 List<String> prefixList = new LinkedList<String>();
84
85 while (nsIt.hasNext()) {
86 Namespace ns = nsIt.next();
87 String prefix = getNonEmpty(ns.getPrefix());
88 getContentHandler()
89 .startPrefixMapping(prefix, ns.getNamespaceURI());
90
91 prefixList.add(prefix);
92 }
93
94 getPrefixes().push(prefixList);
95
96 }
97
98 @Override
99 void doEndPrefixMapping() throws SAXException {
100
101 List<String> prefixList = getPrefixes().pop();
102
103 for (String prefix : prefixList) {
104 getContentHandler().endPrefixMapping(prefix);
105 }
106 }
107
108 @Override
109 Attributes getAttributes() {
110
111 StartElement startElement = event.asStartElement();
112 AttributesImpl atts = new AttributesImpl();
113 Iterator<Attribute> it = startElement.getAttributes();
114 while (it.hasNext()) {
115 Attribute attribute = it.next();
116
117 String uri = attribute.getName().getNamespaceURI();
118 String localName = attribute.getName().getLocalPart();
119 String prefix = attribute.getName().getPrefix();
120 String qName = getQName(prefix, localName);
121 String type = attribute.getDTDType();
122 String value = attribute.getValue();
123
124 atts.addAttribute(uri, localName, qName, type, value);
125 }
126 return atts;
127 }
128
129 @Override
130 Location getLocation() {
131 return event.getLocation();
132 }
133
134 }