View Javadoc
1   package org.exolab.castor.xml;
2   
3   import java.util.Iterator;
4   import java.util.LinkedList;
5   import java.util.List;
6   
7   import javax.xml.namespace.QName;
8   import javax.xml.stream.Location;
9   import javax.xml.stream.XMLEventReader;
10  import javax.xml.stream.XMLStreamException;
11  import javax.xml.stream.events.Attribute;
12  import javax.xml.stream.events.Characters;
13  import javax.xml.stream.events.Namespace;
14  import javax.xml.stream.events.StartElement;
15  import javax.xml.stream.events.XMLEvent;
16  
17  import org.xml.sax.Attributes;
18  import org.xml.sax.SAXException;
19  import org.xml.sax.SAXParseException;
20  import org.xml.sax.helpers.AttributesImpl;
21  
22  public class Sax2EventFromStaxEventProducer extends BaseSax2EventFromStaxProducer {
23  
24    /**
25     * from here we stream
26     */
27    private XMLEventReader eventReader;
28  
29    /**
30     * this represents the current event
31     */
32    private XMLEvent event;
33  
34    public Sax2EventFromStaxEventProducer(XMLEventReader eventReader) {
35      this.eventReader = eventReader;
36    }
37  
38    public void start() throws SAXException {
39  
40      int depth = 0;
41  
42      try {
43        while (eventReader.hasNext()) {
44          event = eventReader.nextEvent();
45          depth = handleEventType(event.getEventType(), depth);
46  
47          if (depth <= 0) {
48            break;
49          }
50        }
51  
52      } catch (XMLStreamException e) {
53        // there is no implementation difference between UnmarshallHandler
54        // info, warning and error.
55        getErrorHandler()
56            .warning(new SAXParseException(e.getMessage(), getSAXLocator(e.getLocation()), null));
57      }
58    }
59  
60    @Override
61    QName getQName() {
62      if (event.isEndElement()) {
63        return event.asEndElement().getName();
64      } else if (event.isStartElement()) {
65        return event.asStartElement().getName();
66      }
67      return null;
68    }
69  
70    @Override
71    char[] getCharacters() {
72      Characters characters = event.asCharacters();
73      return characters.getData().toCharArray();
74    }
75  
76    @Override
77    void doStartPrefixMapping() throws SAXException {
78  
79      StartElement startElement = event.asStartElement();
80      Iterator<Namespace> nsIt = startElement.getNamespaces();
81  
82      List<String> prefixList = new LinkedList<String>();
83  
84      while (nsIt.hasNext()) {
85        Namespace ns = nsIt.next();
86        String prefix = getNonEmpty(ns.getPrefix());
87        getContentHandler().startPrefixMapping(prefix, ns.getNamespaceURI());
88  
89        prefixList.add(prefix);
90      }
91  
92      getPrefixes().push(prefixList);
93  
94    }
95  
96    @Override
97    void doEndPrefixMapping() throws SAXException {
98  
99      List<String> prefixList = getPrefixes().pop();
100 
101     for (String prefix : prefixList) {
102       getContentHandler().endPrefixMapping(prefix);
103     }
104   }
105 
106   @Override
107   Attributes getAttributes() {
108 
109     StartElement startElement = event.asStartElement();
110     AttributesImpl atts = new AttributesImpl();
111     Iterator<Attribute> it = startElement.getAttributes();
112     while (it.hasNext()) {
113       Attribute attribute = it.next();
114 
115       String uri = attribute.getName().getNamespaceURI();
116       String localName = attribute.getName().getLocalPart();
117       String prefix = attribute.getName().getPrefix();
118       String qName = getQName(prefix, localName);
119       String type = attribute.getDTDType();
120       String value = attribute.getValue();
121 
122       atts.addAttribute(uri, localName, qName, type, value);
123     }
124     return atts;
125   }
126 
127   @Override
128   Location getLocation() {
129     return event.getLocation();
130   }
131 
132 }