Brion VIBBER has submitted this change and it was merged.

Change subject: Add Site object, make it part of PageTitle
......................................................................


Add Site object, make it part of PageTitle

Change-Id: I5bc57d5a7c3e9948703f45b7ba27698237b36713
---
M 
wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
M wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
7 files changed, 136 insertions(+), 52 deletions(-)

Approvals:
  Brion VIBBER: Verified; Looks good to me, approved



diff --git 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
index e5f149d..714c377 100644
--- 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
+++ 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
@@ -2,11 +2,11 @@
 
 import android.content.Intent;
 import android.test.ActivityUnitTestCase;
-import android.util.Log;
 import org.mediawiki.api.json.Api;
 import org.wikimedia.wikipedia.Page;
 import org.wikimedia.wikipedia.PageFetchTask;
 import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -14,7 +14,8 @@
 public class PageFetchTaskTests extends 
ActivityUnitTestCase<TestDummyActivity> {
     private static final int TASK_COMPLETION_TIMEOUT = 20000;
 
-    private Api enwiki;
+    private Api enwikiAPI;
+    private Site enwiki;
 
     public PageFetchTaskTests() {
         super(TestDummyActivity.class);
@@ -23,7 +24,9 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        enwiki = new Api("en.wikipedia.org");
+        enwiki = new Site("en.wikipedia.org");
+        enwikiAPI = new Api("en.wikipedia.org");
+
         startActivity(new Intent(), null, null);
     }
 
@@ -32,7 +35,7 @@
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
-                new PageFetchTask(enwiki, new PageTitle(null, "India")) {
+                new PageFetchTask(enwikiAPI, new PageTitle(null, "India", 
enwiki)) {
                     @Override
                     public void onFinish(Page result) {
                         assertNotNull(result);
diff --git 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
index 8583d59..b4a70fd 100644
--- 
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
+++ 
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
@@ -2,23 +2,35 @@
 
 import junit.framework.TestCase;
 import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
 
 public class PageTitleTests extends TestCase {
     public void testPrefixedText() throws Exception {
-        assertEquals(new PageTitle(null, "Test  title").getPrefixedText(), 
"Test  title");
-        assertEquals(new PageTitle(null, "Test title").getPrefixedText(), 
"Test title");
-        assertEquals(new PageTitle("Talk", "Test title").getPrefixedText(), 
"Talk:Test title");
-        assertEquals(new PageTitle(null, "Test   title").getText(), "Test   
title");
+        Site enwiki = new Site("en.wikipedia.org");
+
+        assertEquals(new PageTitle(null, "Test  title", 
enwiki).getPrefixedText(), "Test  title");
+        assertEquals(new PageTitle(null, "Test title", 
enwiki).getPrefixedText(), "Test title");
+        assertEquals(new PageTitle("Talk", "Test title", 
enwiki).getPrefixedText(), "Talk:Test title");
+        assertEquals(new PageTitle(null, "Test   title", enwiki).getText(), 
"Test   title");
     }
 
     public void testFromInternalLink() throws Exception {
-        
assertEquals(PageTitle.fromInternalLink("/wiki/India").getPrefixedText(), 
"India");
-        assertNull(PageTitle.fromInternalLink("/wiki/India").getNamespace());
+        Site enwiki = new Site("en.wikipedia.org");
 
-        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getNamespace(), 
"Talk");
-        assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getText(), 
"India");
+        
assertEquals(enwiki.titleForInternalLink("/wiki/India").getPrefixedText(), 
"India");
+        assertNull(enwiki.titleForInternalLink("/wiki/India").getNamespace());
 
-        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getNamespace(),
 "Talk");
-        
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getText(), 
"India");
+        
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getNamespace(), 
"Talk");
+        
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getText(), 
"India");
+
+        
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getNamespace(),
 "Talk");
+        
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getText(), 
"India");
+    }
+
+    public void testSite() throws Exception {
+        Site enwiki = new Site("en.wikipedia.org");
+
+        assertEquals(enwiki, new PageTitle(null, "Test", enwiki).getSite());
+        assertEquals(enwiki, new Site("en.wikipedia.org"));
     }
 }
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
index fb5cbd3..19a795d 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
@@ -15,6 +15,7 @@
     private final Context context;
     private final CommunicationBridge bridge;
     private final Bus bus;
+    private final WikipediaApp app;
 
     public static class NewWikiPageNavigationEvent {
         private final PageTitle title;
@@ -31,7 +32,8 @@
     public LinkHandler(Context context, CommunicationBridge bridge) {
         this.context = context;
         this.bridge = bridge;
-        this.bus = ((WikipediaApp)context.getApplicationContext()).getBus();
+        this.app = ((WikipediaApp)context.getApplicationContext());
+        this.bus = app.getBus();
 
         this.bridge.addListener("linkClicked", this);
     }
@@ -54,7 +56,7 @@
             Log.d("Wikipedia", "Link clicked was " + href);
             if (href.startsWith("/wiki/")) {
                 // TODO: Handle fragments
-                bus.post(new 
NewWikiPageNavigationEvent(PageTitle.fromInternalLink(href)));
+                bus.post(new 
NewWikiPageNavigationEvent(app.getPrimarySite().titleForInternalLink(href)));
             } else {
                 // Assume everything else is an external link... for now!
                 handleExternalLink(href);
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
index e08a5bf..9f30cd8 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
@@ -13,13 +13,15 @@
     EditText pageNameText;
 
     private Bus bus;
+    private WikipediaApp app;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
-        bus = ((WikipediaApp)getApplicationContext()).getBus();
+        app = ((WikipediaApp)getApplicationContext());
+        bus = app.getBus();
         bus.register(this);
 
         pageGoButton = (Button) findViewById(R.id.pageGoButton);
@@ -28,7 +30,7 @@
         pageGoButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                PageTitle title = new PageTitle(null, 
pageNameText.getText().toString());
+                PageTitle title = new PageTitle(null, 
pageNameText.getText().toString(), app.getPrimarySite());
                 displayNewPage(title);
             }
         });
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
index 83e8313..5329803 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
@@ -3,9 +3,6 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 /**
  * Immutable value object representing the text of a page.
  *
@@ -15,14 +12,20 @@
 public class PageTitle implements Parcelable {
     private final String namespace;
     private final String text;
+    private final Site site;
 
-    public PageTitle(final String namespace, final String text) {
+    public PageTitle(final String namespace, final String text, final Site 
site) {
         this.namespace = namespace;
         this.text = text;
+        this.site = site;
     }
 
     public String getNamespace() {
         return namespace;
+    }
+
+    public Site getSite() {
+        return site;
     }
 
     public String getText() {
@@ -52,40 +55,14 @@
     private PageTitle(Parcel in) {
         namespace = in.readString();
         text = in.readString();
+        site = in.readParcelable(Site.class.getClassLoader());
     }
 
     @Override
     public void writeToParcel(Parcel parcel, int flags) {
         parcel.writeString(namespace);
         parcel.writeString(text);
+        parcel.writeParcelable(site, flags);
     }
 
-    /**
-     * Regex to match internal relative wikilinks.
-     *
-     * Start with /wiki/, can contain a Namespace indicator and a fragment.
-     * Capturing Group 1 is namespace (or null for no namespace). 2 is Page 
Title text. 3 is Fragment.
-     */
-    public static Pattern internalLinkMatchPattern = 
Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.+))?");
-
-    /**
-     * Create a PageTitle object from an internal link string.
-     *
-     * @param internalLink Internal link target text (eg. /wiki/Target).
-     *                     Should be URL decoded before passing in
-     * @return A {@link PageTitle} object representing the internalLink passed 
in.
-     */
-    public static PageTitle fromInternalLink(String internalLink) {
-        //TODO: Do better validation of internal links!
-        //TODO: Handle fragments better!
-        Matcher matches = internalLinkMatchPattern.matcher(internalLink);
-        if (matches.matches()) {
-            String namespace = matches.group(1);
-            String pageText = matches.group(2);
-            return new PageTitle(namespace, pageText);
-        } else {
-            throw new RuntimeException("Did not  match internalLinkPattern: " 
+ internalLink);
-        }
-
-    }
 }
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
new file mode 100644
index 0000000..806654c
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
@@ -0,0 +1,80 @@
+package org.wikimedia.wikipedia;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.regex.*;
+
+/**
+ * Represents a particular Wikimedia project.
+ */
+public class Site implements Parcelable {
+    private final String domain;
+
+    public Site(String domain) {
+        this.domain = domain;
+    }
+
+    public Site(Parcel in) {
+        domain = in.readString();
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(domain);
+    }
+
+    public static final Parcelable.Creator<Site> CREATOR
+            = new Parcelable.Creator<Site>() {
+        public Site createFromParcel(Parcel in) {
+            return new Site(in);
+        }
+
+        public Site[] newArray(int size) {
+            return new Site[size];
+        }
+    };
+
+    @Override
+    public boolean equals(Object o) {
+        return ((Site)o).getDomain().equals(domain);
+    }
+
+    /**
+     * Regex to match internal relative wikilinks.
+     *
+     * Start with /wiki/, can contain a Namespace indicator and a fragment.
+     * Capturing Group 1 is namespace (or null for no namespace). 2 is Page 
Title text. 3 is Fragment.
+     */
+    public static Pattern internalLinkMatchPattern = 
Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.+))?");
+
+    /**
+     * Create a PageTitle object from an internal link string.
+     *
+     * @param internalLink Internal link target text (eg. /wiki/Target).
+     *                     Should be URL decoded before passing in
+     * @return A {@link PageTitle} object representing the internalLink passed 
in.
+     */
+    public PageTitle titleForInternalLink(String internalLink) {
+        //TODO: Do better validation of internal links!
+        //TODO: Handle fragments better!
+        Matcher matches = internalLinkMatchPattern.matcher(internalLink);
+        if (matches.matches()) {
+            String namespace = matches.group(1);
+            String pageText = matches.group(2);
+            return new PageTitle(namespace, pageText, this);
+        } else {
+            throw new RuntimeException("Did not  match internalLinkPattern: " 
+ internalLink);
+        }
+
+    }
+}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java 
b/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
index c7da481..8d396a6 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
@@ -20,9 +20,17 @@
     Api primarySiteAPI;
     public Api getPrimarySiteAPI() {
         if (primarySiteAPI == null) {
-            //TODO: Make this configurable
-            primarySiteAPI =  new Api("en.wikipedia.org");
+            primarySiteAPI =  new Api(getPrimarySite().getDomain());
         }
         return primarySiteAPI;
     }
+
+    private Site primarySite;
+    public Site getPrimarySite() {
+        if (primarySite == null) {
+            // FIXME: Actually read from SharedPreferences or something
+            primarySite = new Site("en.wikipedia.org");
+        }
+        return primarySite;
+    }
 }

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I5bc57d5a7c3e9948703f45b7ba27698237b36713
Gerrit-PatchSet: 3
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>

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

Reply via email to