Add file web links for preview in side-by-side diff view

In the side-by-side diff view there is now a preview icon to render
Markdown files as HTML. This way the formatting can be easily checked
while reviewing.

Change-Id: I24bffa1ebdab31bd18c965d9b76c0f5b1a9ec509
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
index b2de009..28c89a5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/Module.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.webui.BranchWebLink;
+import com.google.gerrit.extensions.webui.FileWebLink;
 import com.google.gerrit.extensions.webui.GerritTopMenu;
 import com.google.gerrit.extensions.webui.ProjectWebLink;
 import com.google.gerrit.extensions.webui.TopMenu;
@@ -42,6 +43,8 @@
         .to(XDocWebLink.class);
     DynamicSet.bind(binder(), BranchWebLink.class)
         .to(XDocWebLink.class);
+    DynamicSet.bind(binder(), FileWebLink.class)
+        .to(XDocPatchWebLink.class);
 
     DynamicSet.bind(binder(), TopMenu.class).toInstance(new TopMenu() {
       @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocPatchWebLink.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocPatchWebLink.java
new file mode 100644
index 0000000..912e520
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocPatchWebLink.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.xdocs;
+
+import com.google.common.cache.LoadingCache;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.webui.FileWebLink;
+import com.google.gerrit.httpd.resources.Resource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+public class XDocPatchWebLink extends XDocWebLink implements FileWebLink {
+
+  @Inject
+  XDocPatchWebLink(
+      @PluginName String pluginName,
+      GitRepositoryManager repoManager,
+      @Named(XDocLoader.Module.X_DOC_RESOURCES) LoadingCache<String, Resource> cache) {
+    super(pluginName, repoManager, cache);
+  }
+
+  @Override
+  public String getLinkName() {
+    return "preview";
+  }
+
+  @Override
+  public String getFileUrl(String projectName, String revision,
+      String fileName) {
+    return super.getPatchUrl(projectName, revision, fileName);
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
index 8a8ac59..9d28b04 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocWebLink.java
@@ -65,25 +65,34 @@
 
   @Override
   public String getBranchUrl(String projectName, String branchName) {
+    return getPatchUrl(projectName, branchName, "README.md");
+  }
+
+  public String getPatchUrl(String projectName, String revision,
+      String fileName) {
+    if (!fileName.endsWith(".md")) {
+      return null;
+    }
+
     Project.NameKey p = new Project.NameKey(projectName);
     try {
       Repository repo = repoManager.openRepository(p);
       try {
-        ObjectId revId = repo.resolve(branchName);
+        ObjectId revId = repo.resolve(revision);
         if (revId == null) {
           return null;
         }
         Resource rsc = docCache.getUnchecked(
-           (new XDocResourceKey(p, "README.md", revId)).asString());
+           (new XDocResourceKey(p, fileName, revId)).asString());
         if (rsc != Resource.NOT_FOUND) {
           StringBuilder url = new StringBuilder();
           url.append("plugins/");
           url.append(pluginName);
           url.append(XDocServlet.PATH_PREFIX);
           url.append(Url.encode(projectName));
-          if (branchName != null && !Constants.HEAD.equals(branchName)) {
+          if (revision != null && !Constants.HEAD.equals(revision)) {
             url.append("/rev/");
-            url.append(Url.encode(branchName));
+            url.append(Url.encode(revision));
           }
           url.append("/README.md");
           return url.toString();