Pass in GitDateFormatters instead of providing constants

This class is not thread safe. It may be reused within a single
thread, so it is ok to create one at the servlet doGet* level and pass
it in.

Change-Id: I20e9137acdd128053bb339f6ee0533c46d5f8a4b
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 5c3cb40..87f3456 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitJsonData.java
@@ -19,13 +19,10 @@
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.util.List;
 
 class CommitJsonData {
-  private static final GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
-
   static class Commit {
     String commit;
     List<String> parents;
@@ -40,24 +37,24 @@
     String time;
   }
 
-  static Commit toJsonData(RevCommit c) {
+  static Commit toJsonData(RevCommit c, GitDateFormatter df) {
     Commit result = new Commit();
     result.commit = c.name();
     result.parents = Lists.newArrayListWithCapacity(c.getParentCount());
     for (RevCommit parent : c.getParents()) {
       result.parents.add(parent.name());
     }
-    result.author = toJsonData(c.getAuthorIdent());
-    result.committer = toJsonData(c.getCommitterIdent());
+    result.author = toJsonData(c.getAuthorIdent(), df);
+    result.committer = toJsonData(c.getCommitterIdent(), df);
     result.message = c.getFullMessage();
     return result;
   }
 
-  private static Ident toJsonData(PersonIdent ident) {
+  private static Ident toJsonData(PersonIdent ident, GitDateFormatter df) {
     Ident result = new Ident();
     result.name = ident.getName();
     result.email = ident.getEmailAddress();
-    result.time = dateFormatter.formatDate(ident);
+    result.time = df.formatDate(ident);
     return result;
   }
 
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
index b7ce0c8..768c0f3 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -44,7 +44,6 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.eclipse.jgit.util.RelativeDateFormatter;
 import org.eclipse.jgit.util.io.NullOutputStream;
 
@@ -82,7 +81,6 @@
     }
   }
 
-  private final GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
   private Linkifier linkifier;
   private Repository repo;
   private RevWalk walk;
@@ -105,8 +103,8 @@
     return this;
   }
 
-  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit, KeySet ks)
-      throws IOException {
+  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit, KeySet ks,
+      GitDateFormatter df) throws IOException {
     checkKeys(ks);
     checkNotNull(req, "request");
     repo = ServletUtils.getRepository(req);
@@ -114,10 +112,10 @@
 
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(KeySet.DEFAULT.keys.size());
     if (ks.contains("author")) {
-      data.put("author", toSoyData(commit.getAuthorIdent(), dateFormatter));
+      data.put("author", toSoyData(commit.getAuthorIdent(), df));
     }
     if (ks.contains("committer")) {
-      data.put("committer", toSoyData(commit.getCommitterIdent(), dateFormatter));
+      data.put("committer", toSoyData(commit.getCommitterIdent(), df));
     }
     if (ks.contains("sha")) {
       data.put("sha", ObjectId.toString(commit));
@@ -179,9 +177,9 @@
     return ImmutableMap.copyOf(data);
   }
 
-  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit)
-      throws IOException {
-    return toSoyData(req, commit, KeySet.DEFAULT);
+  public Map<String, Object> toSoyData(HttpServletRequest req, RevCommit commit,
+      GitDateFormatter df) throws IOException {
+    return toSoyData(req, commit, KeySet.DEFAULT, df);
   }
 
   private void checkKeys(KeySet ks) {
@@ -192,11 +190,11 @@
   }
 
   // TODO(dborowitz): Extract this.
-  static Map<String, String> toSoyData(PersonIdent ident, GitDateFormatter dateFormatter) {
+  static Map<String, String> toSoyData(PersonIdent ident, GitDateFormatter df) {
     return ImmutableMap.of(
         "name", ident.getName(),
         "email", ident.getEmailAddress(),
-        "time", dateFormatter.formatDate(ident),
+        "time", df.formatDate(ident),
         // TODO(dborowitz): Switch from relative to absolute at some threshold.
         "relativeTime", RelativeDateFormatter.format(ident.getWhen()));
   }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
index e5fad23..02d81af 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/DiffServlet.java
@@ -15,7 +15,6 @@
 package com.google.gitiles;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-
 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
 
 import com.google.common.base.Charsets;
@@ -33,6 +32,8 @@
 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.EmptyTreeIterator;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -81,10 +82,11 @@
       Map<String, Object> data = getData(req);
       data.put("title", "Diff - " + view.getRevisionRange());
       if (showCommit) {
+        GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
         data.put("commit", new CommitSoyData()
             .setLinkifier(linkifier)
             .setArchiveFormat(archiveFormat)
-            .toSoyData(req, walk.parseCommit(view.getRevision().getId())));
+            .toSoyData(req, walk.parseCommit(view.getRevision().getId()), df));
       }
       if (!data.containsKey("repositoryName") && (view.getRepositoryName() != null)) {
         data.put("repositoryName", view.getRepositoryName());
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 ffad8d8..86bd5a7 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -45,6 +45,8 @@
 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
 import org.eclipse.jgit.treewalk.filter.PathFilter;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,13 +86,14 @@
     }
 
     try {
-      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null);
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null, df);
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
         for (RevObject o : RevisionServlet.listObjects(paginator.getWalk(), view.getRevision())) {
           if (o instanceof RevTag) {
-            tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o));
+            tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o, df));
           }
         }
         if (!tags.isEmpty()) {
@@ -128,11 +131,12 @@
     }
 
     try {
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
       Map<String, Object> result = Maps.newLinkedHashMap();
       List<CommitJsonData.Commit> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
       for (RevCommit c : paginator) {
         paginator.getWalk().parseBody(c);
-        entries.add(CommitJsonData.toJsonData(c));
+        entries.add(CommitJsonData.toJsonData(c, df));
       }
       result.put("log", entries);
       if (paginator.getPreviousStart() != null) {
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
index 7056261..61c2ea4 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -21,6 +21,7 @@
 import org.eclipse.jgit.lib.ObjectId;
 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;
@@ -39,17 +40,17 @@
   }
 
   public Map<String, Object> toSoyData(RevWalk walk, int limit, @Nullable String revision,
-      @Nullable ObjectId start) throws IOException {
-    return toSoyData(new Paginator(walk, limit, start), revision);
+      @Nullable ObjectId start, GitDateFormatter df) throws IOException {
+    return toSoyData(new Paginator(walk, limit, start), revision, df);
   }
 
-  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision)
-      throws IOException {
+  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision,
+      GitDateFormatter df) throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
 
     List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
     for (RevCommit c : paginator) {
-      entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG));
+      entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG, df));
     }
 
     data.put("entries", entries);
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 18614a1..3fa73b6 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RepositoryIndexServlet.java
@@ -29,6 +29,8 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.io.IOException;
 import java.util.List;
@@ -75,8 +77,8 @@
         if (head.getType() == Constants.OBJ_COMMIT) {
           walk.reset();
           walk.markStart((RevCommit) head);
-          data =
-              new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null);
+          GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
+          data = new LogSoyData(req, view).toSoyData(walk, LOG_LIMIT, "HEAD", null, df);
         } else {
           // TODO(dborowitz): Handle non-commit or missing HEAD?
           data = Maps.newHashMapWithExpectedSize(6);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
index f79df15..1e0b5b2 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/RevisionServlet.java
@@ -36,6 +36,8 @@
 import org.eclipse.jgit.revwalk.RevObject;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,6 +67,7 @@
 
     RevWalk walk = new RevWalk(repo);
     try {
+      GitDateFormatter df = new GitDateFormatter(Format.DEFAULT);
       List<RevObject> objects = listObjects(walk, view.getRevision());
       List<Map<String, ?>> soyObjects = Lists.newArrayListWithCapacity(objects.size());
       boolean hasBlob = false;
@@ -80,7 +83,7 @@
                       .setLinkifier(linkifier)
                       .setRevWalk(walk)
                       .setArchiveFormat(archiveFormat)
-                      .toSoyData(req, (RevCommit) obj, KeySet.DETAIL_DIFF_TREE)));
+                      .toSoyData(req, (RevCommit) obj, KeySet.DETAIL_DIFF_TREE, df)));
               break;
             case OBJ_TREE:
               soyObjects.add(ImmutableMap.of(
@@ -96,7 +99,7 @@
             case OBJ_TAG:
               soyObjects.add(ImmutableMap.of(
                   "type", Constants.TYPE_TAG,
-                  "data", new TagSoyData(linkifier, req).toSoyData((RevTag) obj)));
+                  "data", new TagSoyData(linkifier, req).toSoyData((RevTag) obj, df)));
               break;
             default:
               log.warn("Bad object type for {}: {}", ObjectId.toString(obj.getId()), obj.getType());
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
index 9ddf1e5..9e8d871 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/TagSoyData.java
@@ -19,7 +19,6 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
 
 import java.util.Map;
 
@@ -29,19 +28,17 @@
 public class TagSoyData {
   private final Linkifier linkifier;
   private final HttpServletRequest req;
-  private final GitDateFormatter dateFormatter;
 
   public TagSoyData(Linkifier linkifier, HttpServletRequest req) {
     this.linkifier = linkifier;
     this.req = req;
-    this.dateFormatter = new GitDateFormatter(Format.DEFAULT);
   }
 
-  public Map<String, Object> toSoyData(RevTag tag) {
+  public Map<String, Object> toSoyData(RevTag tag, GitDateFormatter df) {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(4);
     data.put("sha", ObjectId.toString(tag));
     if (tag.getTaggerIdent() != null) {
-      data.put("tagger", CommitSoyData.toSoyData(tag.getTaggerIdent(), dateFormatter));
+      data.put("tagger", CommitSoyData.toSoyData(tag.getTaggerIdent(), df));
     }
     data.put("object", ObjectId.toString(tag.getObject()));
     data.put("message", linkifier.linkify(req, tag.getFullMessage()));