diff options
Diffstat (limited to 'src/com/isode/stroke/parser/AaltoXMLParser.java')
-rw-r--r-- | src/com/isode/stroke/parser/AaltoXMLParser.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/com/isode/stroke/parser/AaltoXMLParser.java b/src/com/isode/stroke/parser/AaltoXMLParser.java new file mode 100644 index 0000000..041dc1e --- /dev/null +++ b/src/com/isode/stroke/parser/AaltoXMLParser.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2010-2012, Isode Limited, London, England. + * All rights reserved. + */ +package com.isode.stroke.parser; + +import com.fasterxml.aalto.AsyncInputFeeder; +import com.fasterxml.aalto.AsyncXMLStreamReader; +import com.fasterxml.aalto.stax.InputFactoryImpl; +import com.isode.stroke.base.ByteArray; +import com.isode.stroke.eventloop.EventLoop; +import java.util.logging.Logger; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; + +/** + * Parser based around the Aalto XML parser + */ +class AaltoXMLParser extends XMLParser { + + private final Logger logger_ = Logger.getLogger(this.getClass().getName()); + private boolean error_ = false; + private final EventLoop eventLoop_; + private final AsyncXMLStreamReader xmlReader_ = new InputFactoryImpl().createAsyncXMLStreamReader(); + + public AaltoXMLParser(XMLParserClient client, EventLoop eventLoop) { + super(client); + eventLoop_ = eventLoop; + } + + + /** + * Cause the parser thread to parse these data. + */ + @Override + public boolean parse(String data) { + if (data.isEmpty()) { + return false; + } + final AsyncInputFeeder inputFeeder = xmlReader_.getInputFeeder(); + final byte[] xmlBytes = new ByteArray(data).getData(); + int type = 0; + boolean error = false; + + try { + inputFeeder.feedInput(xmlBytes, 0, xmlBytes.length); + } catch (XMLStreamException ex) { + error = true; + throw new IllegalStateException(ex); + } + + try { + while ((type = xmlReader_.next()) != XMLStreamConstants.END_DOCUMENT && type != AsyncXMLStreamReader.EVENT_INCOMPLETE) { + QName name; + switch (type) { + case XMLStreamConstants.START_ELEMENT: + name = xmlReader_.getName(); + AttributeMap attributes = new AttributeMap(); + for (int i = 0; i < xmlReader_.getAttributeCount(); i++) { + QName attributeName = xmlReader_.getAttributeName(i); + attributes.addAttribute(attributeName.getLocalPart(), attributeName.getNamespaceURI(), xmlReader_.getAttributeValue(i)); + } + getClient().handleStartElement(name.getLocalPart(), name.getNamespaceURI(), attributes); + break; + case XMLStreamConstants.END_ELEMENT: + name = xmlReader_.getName(); + getClient().handleEndElement(name.getLocalPart(), name.getNamespaceURI()); + break; + case XMLStreamConstants.CHARACTERS: + getClient().handleCharacterData(xmlReader_.getText()); + break; + } + + } + } catch (XMLStreamException e) { + error = true; + throw new IllegalStateException(e); + } + if (type == XMLStreamConstants.END_DOCUMENT) { + try { + xmlReader_.close(); + } catch (XMLStreamException ex) { + /* If the parser errors while we're shutting down, it's not much of an error.*/ + } + } + return !error; + } + + +} |