package oraculum.droid.io;
import java.io.IOException;
import java.io.InputStream;
import oraculum.droid.io.XmlHandler.HandlerException;
import oraculum.droid.util.ParserUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.ContentResolver;
/**
* Executes an {@link HttpUriRequest} and passes the result as an
* {@link XmlPullParser} to the given {@link XmlHandler}.
*/
public class RemoteExecutor {
private final HttpClient mHttpClient;
private final ContentResolver mResolver;
public RemoteExecutor(HttpClient httpClient, ContentResolver resolver) {
mHttpClient = httpClient;
mResolver = resolver;
}
/**
* Execute a {@link HttpGet} request, passing a valid response through
* {@link XmlHandler#parseAndApply(XmlPullParser, ContentResolver)}.
*/
public void executeGet(String url, XmlHandler handler) throws HandlerException {
final HttpUriRequest request = new HttpGet(url);
execute(request, handler);
}
/**
* Execute this {@link HttpUriRequest}, passing a valid response through
* {@link XmlHandler#parseAndApply(XmlPullParser, ContentResolver)}.
*/
public void execute(HttpUriRequest request, XmlHandler handler) throws HandlerException {
try {
final HttpResponse resp = mHttpClient.execute(request);
final int status = resp.getStatusLine().getStatusCode();
if (status != HttpStatus.SC_OK) {
throw new HandlerException("Unexpected server response " + resp.getStatusLine()
+ " for " + request.getRequestLine());
}
final InputStream input = resp.getEntity().getContent();
try {
final XmlPullParser parser = ParserUtils.newPullParser(input);
handler.parseAndApply(parser, mResolver);
} catch (XmlPullParserException e) {
throw new HandlerException("Malformed response for " + request.getRequestLine(), e);
} finally {
if (input != null) input.close();
}
} catch (HandlerException e) {
throw e;
} catch (IOException e) {
throw new HandlerException("Problem reading remote response for "
+ request.getRequestLine(), e);
}
}
}