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