package com.swtworkbench.community.xswt.xmlparser;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.kxml2.io.KXmlParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import com.swtworkbench.community.xswt.XSWTException;
public class MinimalPullParser extends MinimalParser implements IMinimalParser {
private XmlPullParser parser;
public MinimalPullParser() {
initParser();
}
private void initParser() {
if (System.getProperty(XmlPullParserFactory.PROPERTY_NAME) != null) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//System.getProperty(XmlPullParserFactory.PROPERTY_NAME),
// null);
factory.setNamespaceAware(true);
parser = factory.newPullParser();
} catch (XmlPullParserException e) {
}
} else {
parser = new KXmlParser();
}
}
public Object build(InputStream input) throws XSWTException {
try {
parser.setInput(input, null);
return build();
} catch (Exception e) {
throw new XSWTException(e);
} finally {
try {
input.close();
} catch (IOException e) {
}
}
}
public Object build(Reader input) throws XSWTException {
try {
parser.setInput(input);
return build();
} catch (Exception e) {
throw new XSWTException(e);
} finally {
try {
input.close();
} catch (IOException e) {
}
}
}
private Object build() throws XmlPullParserException, IOException {
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.require(XmlPullParser.START_DOCUMENT, null, null);
startDocument();
parser.nextToken();
try {
int eventType = parser.getEventType();
Element lastElement = null;
// start parsing loop
do {
switch (eventType) {
case org.xmlpull.v1.XmlPullParser.START_TAG: {
Element element = startElement(parser.getNamespace(), parser.getName());
setPosition(element, parser.getLineNumber(), parser.getColumnNumber());
Attribute[] attrs = new Attribute[parser.getAttributeCount()];
for (int i = 0; i < attrs.length; i++) {
Attribute attr = createAttribute(parser.getAttributeNamespace(i), parser.getAttributeName(i));
attr.value = parser.getAttributeValue(i);
attrs[i] = attr;
}
element.attributes = attrs;
lastElement = element;
break;
}
case org.xmlpull.v1.XmlPullParser.TEXT: {
if (lastElement != null) {
String text = parser.getText(); // nextText();
if (text != null) {
text = text.trim();
if (text.length() > 0) {
lastElement.text = text;
}
}
}
break;
}
case org.xmlpull.v1.XmlPullParser.END_TAG: {
lastElement = null;
Element element = endElement();
if (element.children.length > 0) {
element.text = null;
}
}
default: break;
}
eventType = parser.next();
} while (eventType != org.xmlpull.v1.XmlPullParser.END_DOCUMENT);
return endDocument();
} catch (IOException e) {
}
return null;
}
}