package org.exolab.castor.xml; import java.util.LinkedList; import java.util.List; import javax.xml.namespace.QName; import javax.xml.stream.Location; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.AttributesImpl; public class Sax2EventFromStaxStreamProducer extends BaseSax2EventFromStaxProducer { /** * Logger from commons-logging. */ private static final Log LOG = LogFactory .getLog(BaseSax2EventFromStaxProducer.class); private XMLStreamReader streamReader; public Sax2EventFromStaxStreamProducer(XMLStreamReader streamReader) { this.streamReader = streamReader; } public void start() throws SAXException { int depth = 0; try { do { depth = handleEventType(streamReader.getEventType(),depth); if (depth != 0) { streamReader.next(); } } while (depth != 0); } catch (XMLStreamException e) { // there is no implementation difference between UnmarshallHandler info, warning and error. // that's why simple warning is called getErrorHandler().warning(new SAXParseException(e.getMessage(), getSAXLocator(e.getLocation()), null)); } } @Override QName getQName() { return streamReader.getName(); } @Override char[] getCharacters() { return streamReader.getText().toCharArray(); } @Override void handleSpace() throws SAXException { LOG.info("< handleSpace >"); String string = streamReader.getText(); char[] chars; chars = new char[string.length()]; chars = string.toCharArray(); getContentHandler().ignorableWhitespace(chars, 0, chars.length); } @Override void doStartPrefixMapping() throws SAXException { LOG.info("< doStartPrefixMapping >"); Integer nsCounter = streamReader.getNamespaceCount(); List<String> prefixList = new LinkedList<String>(); for (int i = 0; i < nsCounter; i++) { String prefix = getNonEmpty(streamReader.getNamespacePrefix(i)); getContentHandler().startPrefixMapping(prefix, streamReader.getNamespaceURI(i)); prefixList.add(prefix); } getPrefixes().push(prefixList); } @Override void doEndPrefixMapping() throws SAXException { List<String> prefixList = getPrefixes().pop(); for (String prefix : prefixList) { getContentHandler().endPrefixMapping(prefix); } } @Override Attributes getAttributes() { Integer attCounter = streamReader.getAttributeCount(); AttributesImpl atts = new AttributesImpl(); for (int i = 0; i < attCounter; i++) { QName qName = streamReader.getAttributeName(i); String uri = qName.getNamespaceURI(); String localName = qName.getLocalPart(); String prefix = qName.getPrefix(); String qNameString = getQName(prefix, localName); String type = streamReader.getAttributeType(i); String value = streamReader.getAttributeValue(i); atts.addAttribute(uri, localName, qNameString, type, value); } return atts; } @Override Location getLocation() { return streamReader.getLocation(); } }