package com.jdroid.android.http.parser;
import android.util.Xml;
import com.jdroid.java.exception.ConnectionException;
import com.jdroid.java.http.parser.Parser;
import com.jdroid.java.utils.FileUtils;
import com.jdroid.java.utils.NumberUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public abstract class AbstractXmlPullParser implements Parser {
/**
* @see Parser#parse(java.lang.String)
*/
@Override
public Object parse(String input) {
return parse(new ByteArrayInputStream(input.getBytes()));
}
/**
* @see Parser#parse(java.io.InputStream)
*/
@Override
public Object parse(InputStream inputStream) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(inputStream, null);
parser.nextTag();
return readFeed(parser);
} catch (XmlPullParserException | IOException e) {
throw new ConnectionException(e);
} finally {
FileUtils.safeClose(inputStream);
}
}
protected abstract Object readFeed(XmlPullParser parser) throws XmlPullParserException, IOException;
protected String readStringAttribute(XmlPullParser parser, String attributeName) {
return parser.getAttributeValue(null, attributeName);
}
protected Long readLongValue(XmlPullParser parser, String name) throws IOException, XmlPullParserException {
return NumberUtils.getLong(readStringValue(parser, name));
}
protected String readStringValue(XmlPullParser parser, String name) throws IOException, XmlPullParserException {
parser.require(XmlPullParser.START_TAG, null, name);
String value = "";
if (parser.next() == XmlPullParser.TEXT) {
value = parser.getText();
parser.nextTag();
}
parser.require(XmlPullParser.END_TAG, null, name);
return value;
}
protected void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException();
}
int depth = 1;
while (depth != 0) {
switch (parser.next()) {
case XmlPullParser.END_TAG:
depth--;
break;
case XmlPullParser.START_TAG:
depth++;
break;
}
}
}
}