LogServlet: factor out Paginator creation

Change-Id: Iff57817e6d545d529f9654fa1a8b16ffa780f3b5
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 9f23dae..983451d 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogServlet.java
@@ -69,33 +69,18 @@
   protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException {
     Repository repo = ServletUtils.getRepository(req);
     GitilesView view = getView(req, repo);
-    if (view == null) {
+    Paginator paginator = newPaginator(repo, view);
+    if (paginator == null) {
       res.setStatus(SC_NOT_FOUND);
       return;
     }
 
-    RevWalk walk = null;
     try {
-      try {
-        walk = newWalk(repo, view);
-      } catch (IncorrectObjectTypeException e) {
-        res.setStatus(SC_NOT_FOUND);
-        return;
-      }
-
-      Optional<ObjectId> start = getStart(view.getParameters(), walk.getObjectReader());
-      if (start == null) {
-        res.setStatus(SC_NOT_FOUND);
-        return;
-      }
-
-      Map<String, Object> data =
-          new LogSoyData(req, view)
-        .toSoyData(walk, LIMIT, null, start.orNull());
+      Map<String, Object> data = new LogSoyData(req, view).toSoyData(paginator, null);
 
       if (!view.getRevision().nameIsId()) {
         List<Map<String, Object>> tags = Lists.newArrayListWithExpectedSize(1);
-        for (RevObject o : RevisionServlet.listObjects(walk, view.getRevision())) {
+        for (RevObject o : RevisionServlet.listObjects(paginator.getWalk(), view.getRevision())) {
           if (o instanceof RevTag) {
             tags.add(new TagSoyData(linkifier, req).toSoyData((RevTag) o));
           }
@@ -120,9 +105,7 @@
       res.setStatus(SC_INTERNAL_SERVER_ERROR);
       return;
     } finally {
-      if (walk != null) {
-        walk.release();
-      }
+      paginator.getWalk().release();
     }
   }
 
@@ -177,4 +160,29 @@
     }
     return walk;
   }
+
+  private static Paginator newPaginator(Repository repo, GitilesView view) throws IOException {
+    if (view == null) {
+      return null;
+    }
+
+    RevWalk walk = null;
+    try {
+      walk = newWalk(repo, view);
+    } catch (IncorrectObjectTypeException e) {
+      return null;
+    }
+
+    Optional<ObjectId> start;
+    try {
+      start = getStart(view.getParameters(), walk.getObjectReader());
+    } catch (IOException e) {
+      walk.release();
+      throw e;
+    }
+    if (start == null) {
+      return null;
+    }
+    return new Paginator(walk, LIMIT, start.orNull());
+  }
 }
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 f4be0a4..7056261 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -40,10 +40,14 @@
 
   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);
+  }
+
+  public Map<String, Object> toSoyData(Paginator paginator, @Nullable String revision)
+      throws IOException {
     Map<String, Object> data = Maps.newHashMapWithExpectedSize(3);
 
-    Paginator paginator = new Paginator(walk, limit, start);
-    List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(limit);
+    List<Map<String, Object>> entries = Lists.newArrayListWithCapacity(paginator.getLimit());
     for (RevCommit c : paginator) {
       entries.add(new CommitSoyData().toSoyData(req, c, KeySet.SHORTLOG));
     }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
index 0454556..62dfb55 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/Paginator.java
@@ -162,6 +162,14 @@
     };
   }
 
+  public int getLimit() {
+    return limit;
+  }
+
+  public RevWalk getWalk() {
+    return walk;
+  }
+
   private RevCommit nextUnchecked() {
     try {
       return next();