1 package org.exolab.castor.xml;
2
3 import java.util.LinkedList;
4 import java.util.List;
5
6 import javax.xml.namespace.QName;
7 import javax.xml.stream.Location;
8 import javax.xml.stream.XMLStreamException;
9 import javax.xml.stream.XMLStreamReader;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13 import org.xml.sax.Attributes;
14 import org.xml.sax.SAXException;
15 import org.xml.sax.SAXParseException;
16 import org.xml.sax.helpers.AttributesImpl;
17
18 public class Sax2EventFromStaxStreamProducer extends BaseSax2EventFromStaxProducer {
19
20
21
22
23 private static final Log LOG = LogFactory.getLog(BaseSax2EventFromStaxProducer.class);
24
25 private XMLStreamReader streamReader;
26
27 public Sax2EventFromStaxStreamProducer(XMLStreamReader streamReader) {
28 this.streamReader = streamReader;
29 }
30
31 public void start() throws SAXException {
32
33 int depth = 0;
34
35 try {
36 do {
37 depth = handleEventType(streamReader.getEventType(), depth);
38
39 if (depth != 0) {
40 streamReader.next();
41 }
42
43 } while (depth != 0);
44
45 } catch (XMLStreamException e) {
46
47
48 getErrorHandler()
49 .warning(new SAXParseException(e.getMessage(), getSAXLocator(e.getLocation()), null));
50 }
51 }
52
53 @Override
54 QName getQName() {
55 return streamReader.getName();
56 }
57
58 @Override
59 char[] getCharacters() {
60 return streamReader.getText().toCharArray();
61 }
62
63 @Override
64 void handleSpace() throws SAXException {
65 LOG.info("< handleSpace >");
66 String string = streamReader.getText();
67
68 char[] chars;
69 chars = new char[string.length()];
70 chars = string.toCharArray();
71 getContentHandler().ignorableWhitespace(chars, 0, chars.length);
72 }
73
74 @Override
75 void doStartPrefixMapping() throws SAXException {
76 LOG.info("< doStartPrefixMapping >");
77 Integer nsCounter = streamReader.getNamespaceCount();
78
79 List<String> prefixList = new LinkedList<String>();
80
81 for (int i = 0; i < nsCounter; i++) {
82 String prefix = getNonEmpty(streamReader.getNamespacePrefix(i));
83 getContentHandler().startPrefixMapping(prefix, streamReader.getNamespaceURI(i));
84 prefixList.add(prefix);
85 }
86
87 getPrefixes().push(prefixList);
88 }
89
90 @Override
91 void doEndPrefixMapping() throws SAXException {
92
93 List<String> prefixList = getPrefixes().pop();
94
95 for (String prefix : prefixList) {
96 getContentHandler().endPrefixMapping(prefix);
97 }
98
99 }
100
101 @Override
102 Attributes getAttributes() {
103
104 Integer attCounter = streamReader.getAttributeCount();
105 AttributesImpl atts = new AttributesImpl();
106 for (int i = 0; i < attCounter; i++) {
107 QName qName = streamReader.getAttributeName(i);
108 String uri = qName.getNamespaceURI();
109 String localName = qName.getLocalPart();
110 String prefix = qName.getPrefix();
111 String qNameString = getQName(prefix, localName);
112 String type = streamReader.getAttributeType(i);
113 String value = streamReader.getAttributeValue(i);
114 atts.addAttribute(uri, localName, qNameString, type, value);
115 }
116
117 return atts;
118 }
119
120 @Override
121 Location getLocation() {
122 return streamReader.getLocation();
123 }
124
125 }