package org.wikipedia.dataclient; import android.net.Uri; import org.mediawiki.api.json.Api; import org.mediawiki.api.json.ApiException; import org.mediawiki.api.json.ApiResult; import org.mediawiki.api.json.RequestBuilder; import org.wikipedia.concurrency.SaneAsyncTask; import org.wikipedia.util.ReleaseUtil; import org.wikipedia.util.log.L; import java.util.Map; public abstract class ApiTask<T> extends SaneAsyncTask<T> { private static final boolean VERBOSE = ReleaseUtil.isDevRelease(); private final Api api; public ApiTask(Api api) { this.api = api; } @Override public T performTask() throws Throwable { RequestBuilder request = buildRequest(api); if (VERBOSE) { L.v(buildUrl(api.getApiUrl().toString(), request.getParams())); } ApiResult result = makeRequest(request); return processResult(result); } /** * Called when an exception is thrown in the background process. * <p/> * Called on the UI Thread. * * Default implementation just throws it as a RuntimeException, so exceptions are never swallowed. * Unless specific exceptions are handled. * * @param caught The exception that was thrown. */ @Override public void onCatch(Throwable caught) { throw new RuntimeException(caught); } protected ApiResult makeRequest(RequestBuilder builder) throws ApiException { return builder.get(); } public abstract RequestBuilder buildRequest(Api api); public abstract T processResult(ApiResult result) throws Throwable; private String buildUrl(String url, Map<String, String> params) { Uri.Builder builder = new Uri.Builder().encodedPath(url); for (Map.Entry<String, String> param : params.entrySet()) { builder.appendQueryParameter(param.getKey(), param.getValue()); } return builder.build().toString(); } }