from xml.dom import pulldom
import sys

class XMLStreamReader():
    """
XMLStreamReader: simplified interface to DOMEventStream
so that it looks similar to the Java XMLStreamReader with similar methods
It concatenates all successive text nodes

"""
    def __init__(self, file):
        self.events = pulldom.parse(file)
        self.event = None
        self.node  = None
        self.look_ahead=None

    # get next token 
    def next(self):
        if self.look_ahead == None:
            (self.event,self.node)=self.events.getEvent()
        else:
            (self.event,self.node)=self.look_ahead
            self.look_ahead=None
        # concatenate consecutive character nodes 
        while self.event == pulldom.CHARACTERS:
            self.look_ahead=self.events.__next__()
            while self.look_ahead[0] == pulldom.CHARACTERS:
                self.look_ahead=self.events.getEvent()
            break
                                        
    def isWhiteSpace(self):
        return (self.event == pulldom.CHARACTERS and 
                len(self.node.data.strip())==0)

    def isStartElement(self):
        return self.event == pulldom.START_ELEMENT

    def isEndElement(self):
        return self.event == pulldom.END_ELEMENT

    def isCharacters(self):
        return self.event == pulldom.CHARACTERS

    def checkStartElement(self,method):
        if not self.isStartElement():
            raise ValueError("%s called for an event of type: %s"%
                              (method,self.event))
    
    def getLocalName(self):
        self.checkStartElement("getLocalName")
        return self.node.localName

    def getAttributeCount(self):
        self.checkStartElement("getAttributeCount")
        return self.node.attributes.length

    def getAttributeLocalName(self,i):
        self.checkStartElement("getAttributeLocalName")
        return self.node.attributes.item(i).localName

    def getAttributeValue(self,i):
        self.checkStartElement("getAttributeValue")
        return self.node.attributes.item(i).value

    def getText(self):
        if not self.isCharacters():
            raise ValueError("getText called for an event of type %s"%
                              self.event)
        return self.node.data