summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/parser/AaltoXMLParser.java')
-rw-r--r--src/com/isode/stroke/parser/AaltoXMLParser.java91
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;
+ }
+
+
+}