View Javadoc
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  	 * Logger from commons-logging.
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  			// there is no implementation difference between UnmarshallHandler info, warning and error.
48  			// that's why simple warning is called
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 }