summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/parser/GenericPayloadTreeParser.java')
-rw-r--r--src/com/isode/stroke/parser/GenericPayloadTreeParser.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/com/isode/stroke/parser/GenericPayloadTreeParser.java b/src/com/isode/stroke/parser/GenericPayloadTreeParser.java
new file mode 100644
index 0000000..e414ac5
--- /dev/null
+++ b/src/com/isode/stroke/parser/GenericPayloadTreeParser.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012, Isode Limited, London, England.
+ * All rights reserved.
+ */
+/*
+ * Copyright (c) 2011, Kevin Smith
+ * All rights reserved.
+ */
+package com.isode.stroke.parser;
+
+import java.util.LinkedList;
+
+import com.isode.stroke.elements.Payload;
+import com.isode.stroke.parser.tree.ParserElement;
+
+/**
+ * Generic parser offering something a bit like a DOM to work with
+ * @param <T> Payload Type to parse
+ */
+public abstract class GenericPayloadTreeParser<T extends Payload> extends GenericPayloadParser<T> {
+
+ private LinkedList<ParserElement> elementStack_ = new LinkedList<ParserElement>();
+ private ParserElement root_;
+
+ /**
+ * Create the parser for the given payload type
+ * @param payload payload type object, not null
+ */
+ public GenericPayloadTreeParser(T payload) {
+ super(payload);
+ }
+
+ @Override
+ public void handleCharacterData(String data) {
+ ParserElement current = elementStack_.getLast();
+ current.appendCharacterData(data);
+ }
+
+ @Override
+ public void handleEndElement(String element, String xmlns) {
+ elementStack_.removeLast();
+ if (elementStack_.isEmpty()) {
+ handleTree(root_);
+ }
+ }
+
+ @Override
+ public void handleStartElement(String element, String xmlns,
+ AttributeMap attributes) {
+ if (root_ == null) {
+ root_ = new ParserElement(element, xmlns, attributes);
+ elementStack_.addLast(root_);
+ }else {
+ ParserElement current = elementStack_.getLast();
+ elementStack_.addLast(current.addChild(element, xmlns, attributes));
+ }
+ }
+
+ /**
+ * Parse children of the root element. Subclasses should implement
+ * this method to extract the items from child nodes
+ * @param root root of the node whose children contains items
+ */
+ public abstract void handleTree(ParserElement root);
+}