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();