Add REST API endpoint for RepositoryIndexServlet

Added support for the JSON output format to RepositoryIndexServlet and
RefServlet.

Sample JSON response from RepositoryIndexServlet:
  )]}'
  {
      "name": "gitiles",
      "clone_url": "https://gerrit.googlesource.com/gitiles",
      "description": "A simple browser for Git repositories"
  }

Sample JSON response from RefServlet:
  )]}'
  {
    "HEAD": {
        "value": "99df26787bf9d8b78bef8c12ad821d7a8fdfa044",
        "target": "refs/heads/master"
    },
    "refs/heads/32.93.1611": {
        "value": "e50434a901d89cd40ff1809b40a97bca87de2b3f"
    },
    "refs/tags/cut/2.8.2": {
        "value": "25ec7478b5f2d39d78a8978e727cd089e9af9df3",
        "peeled": "7ca778c7451560b27b3c902b21c528b0dde772d6"
    }
  }

Change-Id: I83caa5a46314b5d16bb6c14d275d191f1e888cc1
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
index bf0f75d..67d5edc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Ordering;
 import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.AnyObjectId;
@@ -38,6 +39,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.LinkedHashMap;
 
 import javax.annotation.Nullable;
 import javax.servlet.http.HttpServletRequest;
@@ -85,6 +87,19 @@
     adv.end();
   }
 
+  @Override
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
+    GitilesView view = ViewFilter.getView(req);
+    Map<String, Ref> refs = getRefs(ServletUtils.getRepository(req).getRefDatabase(),
+        view.getPathPart());
+    Map<String, RefJsonData> jsonRefs = new LinkedHashMap<String, RefJsonData>();
+    for (Map.Entry<String, Ref> ref : refs.entrySet()) {
+      jsonRefs.put(ref.getKey(), new RefJsonData(ref.getValue()));
+    }
+    renderJson(req, res, jsonRefs, new TypeToken<Map<String, RefJsonData>>() {}.getType());
+  }
+
   static List<Map<String, Object>> getBranchesSoyData(HttpServletRequest req, int limit)
       throws IOException {
     RefDatabase refdb = ServletUtils.getRepository(req).getRefDatabase();
@@ -209,4 +224,20 @@
       writer.close();
     }
   }
+
+  private static class RefJsonData {
+    public RefJsonData(Ref ref) {
+      value = ref.getObjectId().getName();
+      if(ref.getPeeledObjectId() != null) {
+        peeled = ref.getPeeledObjectId().getName();
+      }
+      if (ref.isSymbolic()) {
+        target = ref.getTarget().getName();
+      }
+    }
+
+    public String value;
+    public String peeled;
+    public String target;
+  }
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
index 7dde342..ca1a0dc 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.gitiles.DateFormatter.Format;
+import com.google.gson.reflect.TypeToken;
 
 import org.eclipse.jgit.http.server.ServletUtils;
 import org.eclipse.jgit.lib.Constants;
@@ -53,10 +54,17 @@
   }
 
   @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
+  protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     renderHtml(req, res, "gitiles.repositoryIndex", buildData(req));
   }
 
+  @Override
+  protected void doGetJson(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    GitilesAccess access = getAccess(req);
+    RepositoryDescription desc = access.getRepositoryDescription();
+    renderJson(req, res, desc, new TypeToken<RepositoryDescription>() {}.getType());
+  }
+
   @VisibleForTesting
   Map<String, ?> buildData(HttpServletRequest req) throws IOException {
     GitilesView view = ViewFilter.getView(req);