package org.wikipedia.page; import android.text.TextUtils; import org.json.JSONObject; import org.mediawiki.api.json.Api; import org.mediawiki.api.json.ApiResult; import org.mediawiki.api.json.RequestBuilder; import org.wikipedia.dataclient.ApiTask; import org.wikipedia.dataclient.WikiSite; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public abstract class PageQueryTask<T> extends ApiTask<Map<PageTitle, T>> { private final List<PageTitle> titles; private final WikiSite wiki; public PageQueryTask(Api api, WikiSite wiki, List<PageTitle> titles) { super(api); this.titles = titles; this.wiki = wiki; } public PageQueryTask(Api api, WikiSite wiki, PageTitle title) { super(api); this.titles = new ArrayList<>(); titles.add(title); this.wiki = wiki; } @Override public RequestBuilder buildRequest(Api api) { RequestBuilder builder = api.action("query") .param("titles", TextUtils.join("|", titles)) .param("continue", ""); // to avoid warning about new continuation syntax buildQueryParams(builder); return builder; } @Override public Map<PageTitle, T> processResult(ApiResult result) throws Throwable { Map<PageTitle, T> map = new HashMap<>(); JSONObject data = result.asObject(); JSONObject query = data.getJSONObject("query"); JSONObject pages = query.getJSONObject("pages"); // You would think you could use foreach on an Iterator, but you can't. Iterator<String> keys = pages.keys(); while (keys.hasNext()) { String key = keys.next(); int pageId = Integer.parseInt(key); JSONObject pageData = pages.getJSONObject(key); String titleString = pageData.getString("title"); PageTitle pageTitle = new PageTitle(null, titleString, wiki); T pageResult = processPage(pageId, pageTitle, pageData); map.put(pageTitle, pageResult); } return map; } public abstract void buildQueryParams(RequestBuilder buildQueryParams); public abstract T processPage(int pageId, PageTitle pageTitle, JSONObject page) throws Throwable; }