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
24 .getLog(BaseSax2EventFromStaxProducer.class);
25
26 private XMLStreamReader streamReader;
27
28 public Sax2EventFromStaxStreamProducer(XMLStreamReader streamReader) {
29 this.streamReader = streamReader;
30 }
31
32 public void start() throws SAXException {
33
34 int depth = 0;
35
36 try {
37 do {
38 depth = handleEventType(streamReader.getEventType(),depth);
39
40 if (depth != 0) {
41 streamReader.next();
42 }
43
44 } while (depth != 0);
45
46 } catch (XMLStreamException e) {
47
48
49 getErrorHandler().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,
84 streamReader.getNamespaceURI(i));
85 prefixList.add(prefix);
86 }
87
88 getPrefixes().push(prefixList);
89 }
90
91 @Override
92 void doEndPrefixMapping() throws SAXException {
93
94 List<String> prefixList = getPrefixes().pop();
95
96 for (String prefix : prefixList) {
97 getContentHandler().endPrefixMapping(prefix);
98 }
99
100 }
101
102 @Override
103 Attributes getAttributes() {
104
105 Integer attCounter = streamReader.getAttributeCount();
106 AttributesImpl atts = new AttributesImpl();
107 for (int i = 0; i < attCounter; i++) {
108 QName qName = streamReader.getAttributeName(i);
109 String uri = qName.getNamespaceURI();
110 String localName = qName.getLocalPart();
111 String prefix = qName.getPrefix();
112 String qNameString = getQName(prefix, localName);
113 String type = streamReader.getAttributeType(i);
114 String value = streamReader.getAttributeValue(i);
115 atts.addAttribute(uri, localName, qNameString, type, value);
116 }
117
118 return atts;
119 }
120
121 @Override
122 Location getLocation() {
123 return streamReader.getLocation();
124 }
125
126 }