Use CommitData to produce CommitJsonData

Change-Id: I7261b0c40e97119c32627c4ea89038bbe174925f
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
index 87f3456..10a8c24 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -14,15 +14,26 @@
 
 package com.google.gitiles;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gitiles.CommitData.Field;
 
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.util.GitDateFormatter;
 
+import java.io.IOException;
 import java.util.List;
 
+import javax.annotation.Nullable;
+import javax.servlet.http.HttpServletRequest;
+
 class CommitJsonData {
+  private static final ImmutableSet<Field> DEFAULT_FIELDS = Sets.immutableEnumSet(
+      Field.SHA, Field.PARENTS, Field.AUTHOR, Field.COMMITTER, Field.MESSAGE);
+
   static class Commit {
     String commit;
     List<String> parents;
@@ -37,16 +48,38 @@
     String time;
   }
 
-  static Commit toJsonData(RevCommit c, GitDateFormatter df) {
+  private RevWalk walk;
+
+  CommitJsonData setRevWalk(@Nullable RevWalk walk) {
+    this.walk = walk;
+    return this;
+  }
+
+  Commit toJsonData(HttpServletRequest req, RevCommit c, GitDateFormatter df)
+      throws IOException {
+    CommitData cd = new CommitData.Builder()
+        .setRevWalk(walk)
+        .build(req, c, DEFAULT_FIELDS);
+
     Commit result = new Commit();
-    result.commit = c.name();
-    result.parents = Lists.newArrayListWithCapacity(c.getParentCount());
-    for (RevCommit parent : c.getParents()) {
-      result.parents.add(parent.name());
+    if (cd.sha != null) {
+      result.commit = cd.sha.name();
     }
-    result.author = toJsonData(c.getAuthorIdent(), df);
-    result.committer = toJsonData(c.getCommitterIdent(), df);
-    result.message = c.getFullMessage();
+    if (cd.parents != null) {
+      result.parents = Lists.newArrayListWithCapacity(cd.parents.size());
+      for (RevCommit parent : cd.parents) {
+        result.parents.add(parent.name());
+      }
+    }
+    if (cd.author != null) {
+      result.author = toJsonData(cd.author, df);
+    }
+    if (cd.committer != null) {
+      result.committer = toJsonData(cd.committer, df);
+    }
+    if (cd.message != null) {
+      result.message = cd.message;
+    }
     return result;
   }
 
@@ -57,7 +90,4 @@
     result.time = df.formatDate(ident);
     return result;
   }
-
-  private CommitJsonData() {
-  }
 }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
index aa6bd34..e6ae4c2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -135,7 +135,7 @@
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
         paginator.getWalk().parseBody(c);
-        entries.add(CommitJsonData.toJsonData(c, df));
+        entries.add(new CommitJsonData().setRevWalk(paginator.getWalk()).toJsonData(req, c, df));
       }
       result.put("log", entries);
       if (paginator.getPreviousStart() != null) {