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.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        // there is no implementation difference between UnmarshallHandler info, warning and error.
47        // that's why simple warning is called
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 }