/*
* Copyright (C) 2004, 2005 Joe Walnes.
* Copyright (C) 2006, 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 07. March 2004 by Joe Walnes
*/
package com.thoughtworks.xstream.io.xml.xppdom;
import org.xmlpull.mxp1.MXParser;
import org.xmlpull.v1.XmlPullParser;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
public class Xpp3DomBuilder {
public static Xpp3Dom build(Reader reader)
throws Exception {
List elements = new ArrayList();
List values = new ArrayList();
Xpp3Dom node = null;
XmlPullParser parser = new MXParser();
parser.setInput(reader);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String rawName = parser.getName();
Xpp3Dom child = new Xpp3Dom(rawName);
int depth = elements.size();
if (depth > 0) {
Xpp3Dom parent = (Xpp3Dom) elements.get(depth - 1);
parent.addChild(child);
}
elements.add(child);
values.add(new StringBuffer());
int attributesSize = parser.getAttributeCount();
for (int i = 0; i < attributesSize; i++) {
String name = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
child.setAttribute(name, value);
}
} else if (eventType == XmlPullParser.TEXT) {
int depth = values.size() - 1;
StringBuffer valueBuffer = (StringBuffer) values.get(depth);
valueBuffer.append(parser.getText());
} else if (eventType == XmlPullParser.END_TAG) {
int depth = elements.size() - 1;
Xpp3Dom finalNode = (Xpp3Dom) elements.remove(depth);
String accumulatedValue = (values.remove(depth)).toString();
String finishedValue;
if (0 == accumulatedValue.length()) {
finishedValue = null;
} else {
finishedValue = accumulatedValue;
}
finalNode.setValue(finishedValue);
if (0 == depth) {
node = finalNode;
}
}
eventType = parser.next();
}
reader.close();
return node;
}
}