package org.wikipedia.edit.wikitext; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import com.google.gson.JsonParseException; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.dataclient.mwapi.MwException; import org.wikipedia.dataclient.mwapi.MwQueryResponse; import org.wikipedia.dataclient.retrofit.MwCachedService; import org.wikipedia.dataclient.retrofit.WikiCachedService; import org.wikipedia.page.PageTitle; import retrofit2.Call; import retrofit2.Response; import retrofit2.http.GET; import retrofit2.http.Query; public class WikitextClient { @NonNull private final WikiCachedService<Service> cachedService = new MwCachedService<>(Service.class); public Call<MwQueryResponse<Wikitext>> request(@NonNull final WikiSite wiki, @NonNull final PageTitle title, final int sectionID, @NonNull final Callback cb) { Service service = cachedService.service(wiki); return request(service, title, sectionID, cb); } @VisibleForTesting Call<MwQueryResponse<Wikitext>> request(@NonNull Service service, @NonNull final PageTitle title, final int sectionID, @NonNull final Callback cb) { Call<MwQueryResponse<Wikitext>> call = service.request(title.getPrefixedText(), sectionID); call.enqueue(new retrofit2.Callback<MwQueryResponse<Wikitext>>() { @Override public void onResponse(Call<MwQueryResponse<Wikitext>> call, Response<MwQueryResponse<Wikitext>> response) { // noinspection ConstantConditions if (response.body().success() && response.body().query().wikitext() != null) { // noinspection ConstantConditions cb.success(call, response.body().query().wikitext()); } else if (response.body().hasError()) { // noinspection ConstantConditions cb.failure(call, new MwException(response.body().getError())); } else { Throwable t = new JsonParseException("Error parsing wikitext from query response"); cb.failure(call, t); } } @Override public void onFailure(Call<MwQueryResponse<Wikitext>> call, Throwable t) { cb.failure(call, t); } }); return call; } public interface Callback { void success(@NonNull Call<MwQueryResponse<Wikitext>> call, @NonNull String wikitext); void failure(@NonNull Call<MwQueryResponse<Wikitext>> call, @NonNull Throwable caught); } @VisibleForTesting interface Service { @GET("w/api.php?action=query&format=json&formatversion=2&prop=revisions&rvprop=content&rvlimit=1") Call<MwQueryResponse<Wikitext>> request(@NonNull @Query("titles") String title, @Query("rvsection") int section); } }