Brion VIBBER has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/95722


Change subject: Work in progress: PageQueryTask & PageImagesTask
......................................................................

Work in progress: PageQueryTask & PageImagesTask

Change-Id: I4b1432cab6762fb052b2c5e2c10c1a91226b9085
---
A wikipedia/src/main/java/org/wikimedia/wikipedia/PageImagesTask.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/PageQueryTask.java
2 files changed, 105 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/22/95722/1

diff --git 
a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageImagesTask.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageImagesTask.java
new file mode 100644
index 0000000..80ce02b
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageImagesTask.java
@@ -0,0 +1,35 @@
+package org.wikimedia.wikipedia;
+
+import android.content.Context;
+import org.json.JSONObject;
+import org.mediawiki.api.json.RequestBuilder;
+
+import java.net.URL;
+import java.util.List;
+
+public class PageImagesTask extends PageQueryTask<URL> {
+    private int thumbSize;
+
+    public PageImagesTask(Context context, Site site, List<PageTitle> titles, 
int thumbSize) {
+        super(context, site, titles);
+        this.thumbSize = thumbSize;
+    }
+
+    @Override
+    public void buildQueryParams(RequestBuilder builder) {
+        builder.param("titles", joinTitles())
+               .param("prop", "pageimages")
+               .param("piprop", "thumbnail")
+               .param("pithumbsize", Integer.toString(thumbSize));
+    }
+
+    @Override
+    public URL processPage(int pageId, PageTitle pageTitle, JSONObject 
pageData) throws Throwable {
+        JSONObject thumbnail = pageData.optJSONObject("thumbnail");
+        if (thumbnail == null) {
+            return null;
+        } else {
+            return new URL(pageData.getString("source"));
+        }
+    }
+}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageQueryTask.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageQueryTask.java
new file mode 100644
index 0000000..f82fbc4
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageQueryTask.java
@@ -0,0 +1,70 @@
+package org.wikimedia.wikipedia;
+
+import android.content.Context;
+import org.json.JSONObject;
+import org.mediawiki.api.json.Api;
+import org.mediawiki.api.json.ApiResult;
+import org.mediawiki.api.json.RequestBuilder;
+
+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 List<PageTitle> titles;
+
+    public PageQueryTask(Context context, Site site, List<PageTitle> titles) {
+        super(context, site);
+        this.titles = titles;
+    }
+
+    @Override
+    public ApiResult buildRequest(Api api) {
+        RequestBuilder builder = api.action("query").param("titles", 
joinTitles());
+        buildQueryParams(builder);
+        return builder.get();
+    }
+
+    public String joinTitles() {
+        StringBuilder str = new StringBuilder();
+        boolean first = true;
+        for (PageTitle title : titles) {
+            str.append(title.getPrefixedText());
+            if (first) {
+                first = false;
+            } else {
+                str.append('|');
+            }
+        }
+        return str.toString();
+    }
+
+    @Override
+    public Map<PageTitle,T> processResult(ApiResult result) throws Throwable {
+        Map<PageTitle,T> map = new HashMap<PageTitle,T>();
+        JSONObject data = result.asObject();
+        JSONObject query = data.getJSONObject("query");
+
+        // You would think you could use foreach on an Iterator, but you can't.
+        Iterator<String> keys = query.keys();
+        for (String key = keys.next(); keys.hasNext(); key = keys.next()) {
+            int pageId = Integer.parseInt(key);
+            JSONObject pageData = data.getJSONObject(key);
+            PageTitle pageTitle = processPageTitle(pageData);
+            T pageResult = processPage(pageId, pageTitle, pageData);
+            map.put(pageTitle, pageResult);
+        }
+
+        return map;
+    }
+
+    public PageTitle processPageTitle(JSONObject pageData) throws Throwable {
+        String title = pageData.getString("title");
+        return new PageTitle(null, title, getSite());
+    }
+
+    abstract public void buildQueryParams(RequestBuilder buildQueryParams);
+
+    abstract public T processPage(int pageId, PageTitle pageTitle, JSONObject 
page) throws Throwable;
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/95722
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4b1432cab6762fb052b2c5e2c10c1a91226b9085
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Brion VIBBER <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to