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()
56 .warning(new SAXParseException(e.getMessage(), getSAXLocator(e.getLocation()), null));
57 }
58 }
59
60 @Override
61 QName getQName() {
62 if (event.isEndElement()) {
63 return event.asEndElement().getName();
64 } else if (event.isStartElement()) {
65 return event.asStartElement().getName();
66 }
67 return null;
68 }
69
70 @Override
71 char[] getCharacters() {
72 Characters characters = event.asCharacters();
73 return characters.getData().toCharArray();
74 }
75
76 @Override
77 void doStartPrefixMapping() throws SAXException {
78
79 StartElement startElement = event.asStartElement();
80 Iterator<Namespace> nsIt = startElement.getNamespaces();
81
82 List<String> prefixList = new LinkedList<String>();
83
84 while (nsIt.hasNext()) {
85 Namespace ns = nsIt.next();
86 String prefix = getNonEmpty(ns.getPrefix());
87 getContentHandler().startPrefixMapping(prefix, ns.getNamespaceURI());
88
89 prefixList.add(prefix);
90 }
91
92 getPrefixes().push(prefixList);
93
94 }
95
96 @Override
97 void doEndPrefixMapping() throws SAXException {
98
99 List<String> prefixList = getPrefixes().pop();
100
101 for (String prefix : prefixList) {
102 getContentHandler().endPrefixMapping(prefix);
103 }
104 }
105
106 @Override
107 Attributes getAttributes() {
108
109 StartElement startElement = event.asStartElement();
110 AttributesImpl atts = new AttributesImpl();
111 Iterator<Attribute> it = startElement.getAttributes();
112 while (it.hasNext()) {
113 Attribute attribute = it.next();
114
115 String uri = attribute.getName().getNamespaceURI();
116 String localName = attribute.getName().getLocalPart();
117 String prefix = attribute.getName().getPrefix();
118 String qName = getQName(prefix, localName);
119 String type = attribute.getDTDType();
120 String value = attribute.getValue();
121
122 atts.addAttribute(uri, localName, qName, type, value);
123 }
124 return atts;
125 }
126
127 @Override
128 Location getLocation() {
129 return event.getLocation();
130 }
131
132 }