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().warning(
56                      new SAXParseException(e.getMessage(), getSAXLocator(e
57                              .getLocation()), null));
58          }
59      }
60  
61      @Override
62      QName getQName() {
63          if (event.isEndElement()) {
64              return event.asEndElement().getName();
65          } else if (event.isStartElement()) {
66              return event.asStartElement().getName();
67          }
68          return null;
69      }
70  
71      @Override
72      char[] getCharacters() {
73          Characters characters = event.asCharacters();
74          return characters.getData().toCharArray();
75      }
76  
77      @Override
78      void doStartPrefixMapping() throws SAXException {
79  
80          StartElement startElement = event.asStartElement();
81          Iterator<Namespace> nsIt = startElement.getNamespaces();
82  
83          List<String> prefixList = new LinkedList<String>();
84  
85          while (nsIt.hasNext()) {
86              Namespace ns = nsIt.next();
87              String prefix = getNonEmpty(ns.getPrefix());
88              getContentHandler()
89                      .startPrefixMapping(prefix, ns.getNamespaceURI());
90  
91              prefixList.add(prefix);
92          }
93  
94          getPrefixes().push(prefixList);
95  
96      }
97  
98      @Override
99      void doEndPrefixMapping() throws SAXException {
100 
101         List<String> prefixList = getPrefixes().pop();
102 
103         for (String prefix : prefixList) {
104             getContentHandler().endPrefixMapping(prefix);
105         }
106     }
107 
108     @Override
109     Attributes getAttributes() {
110 
111         StartElement startElement = event.asStartElement();
112         AttributesImpl atts = new AttributesImpl();
113         Iterator<Attribute> it = startElement.getAttributes();
114         while (it.hasNext()) {
115             Attribute attribute = it.next();
116 
117             String uri = attribute.getName().getNamespaceURI();
118             String localName = attribute.getName().getLocalPart();
119             String prefix = attribute.getName().getPrefix();
120             String qName = getQName(prefix, localName);
121             String type = attribute.getDTDType();
122             String value = attribute.getValue();
123 
124             atts.addAttribute(uri, localName, qName, type, value);
125         }
126         return atts;
127     }
128 
129     @Override
130     Location getLocation() {
131         return event.getLocation();
132     }
133 
134 }