From 5200b359257c2ab5e29781c2b05c6092fc8338f8 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Nov 2013 11:05:50 -0500
Subject: [PATCH] Eliminate static singleton calls from user services

---
 src/main/java/com/gitblit/BranchGraphServlet.java |   73 ++++++++++++++++++++++++++++--------
 1 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/gitblit/BranchGraphServlet.java b/src/main/java/com/gitblit/BranchGraphServlet.java
index 95be613..58a5778 100644
--- a/src/main/java/com/gitblit/BranchGraphServlet.java
+++ b/src/main/java/com/gitblit/BranchGraphServlet.java
@@ -32,8 +32,12 @@
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import javax.imageio.ImageIO;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -48,15 +52,18 @@
 import org.eclipse.jgit.revplot.PlotWalk;
 import org.eclipse.jgit.revwalk.RevCommit;
 
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.StringUtils;
 
 /**
  * Handles requests for branch graphs
- * 
+ *
  * @author James Moger
- * 
+ *
  */
+@Singleton
 public class BranchGraphServlet extends HttpServlet {
 
 	private static final long serialVersionUID = 1L;
@@ -70,8 +77,18 @@
 
 	private final Stroke[] strokeCache;
 
-	public BranchGraphServlet() {
+	private final IStoredSettings settings;
+
+	private final IRepositoryManager repositoryManager;
+
+	@Inject
+	public BranchGraphServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
 		super();
+		this.settings = runtimeManager.getSettings();
+		this.repositoryManager = repositoryManager;
 
 		strokeCache = new Stroke[4];
 		for (int i = 1; i < strokeCache.length; i++)
@@ -80,7 +97,7 @@
 
 	/**
 	 * Returns an url to this servlet for the specified parameters.
-	 * 
+	 *
 	 * @param baseURL
 	 * @param repository
 	 * @param objectId
@@ -102,7 +119,7 @@
 		String objectId = req.getParameter("h");
 		Repository r = null;
 		try {
-			r = GitBlit.self().getRepository(repository);
+			r = repositoryManager.getRepository(repository);
 			if (StringUtils.isEmpty(objectId)) {
 				objectId = JGitUtils.getHEADRef(r);
 			}
@@ -126,7 +143,7 @@
 			String objectId = request.getParameter("h");
 			String length = request.getParameter("l");
 
-			r = GitBlit.self().getRepository(repository);
+			r = repositoryManager.getRepository(repository);
 
 			rw = new PlotWalk(r);
 			if (StringUtils.isEmpty(objectId)) {
@@ -136,7 +153,7 @@
 			rw.markStart(rw.lookupCommit(r.resolve(objectId)));
 
 			// default to the items-per-page setting, unless specified
-			int maxCommits = GitBlit.getInteger(Keys.web.itemsPerPage, 50);
+			int maxCommits = settings.getInteger(Keys.web.itemsPerPage, 50);
 			int requestedCommits = maxCommits;
 			if (!StringUtils.isEmpty(length)) {
 				int l = Integer.parseInt(length);
@@ -146,18 +163,41 @@
 			}
 
 			// fetch the requested commits plus some extra so that the last
-			// commit displayed *likely* has correct lane assignments  
+			// commit displayed *likely* has correct lane assignments
 			CommitList commitList = new CommitList();
 			commitList.source(rw);
 			commitList.fillTo(2*Math.max(requestedCommits, maxCommits));
 
 			// determine the appropriate width for the image
-			int numLanes = 0;
-			int numCommits = Math.min(requestedCommits, commitList.size());			
-			for (int i = 0; i < numCommits; i++) {
-				PlotCommit<Lane> commit = commitList.get(i);
-				int pos = commit.getLane().getPosition();
-				numLanes = Math.max(numLanes, pos + 1);
+			int numLanes = 1;
+			int numCommits = Math.min(requestedCommits, commitList.size());
+			if (numCommits > 1) {
+				// determine graph width
+				Set<String> parents = new TreeSet<String>();
+				for (int i = 0; i < commitList.size(); i++) {
+					PlotCommit<Lane> commit = commitList.get(i);
+					boolean checkLane = false;
+
+					if (i < numCommits) {
+						// commit in visible list
+						checkLane = true;
+
+						// remember parents
+						for (RevCommit p : commit.getParents()) {
+							parents.add(p.getName());
+						}
+					} else if (parents.contains(commit.getName())) {
+						// commit outside visible list, but it is a parent of a
+						// commit in the visible list so we need to know it's lane
+						// assignment
+						checkLane = true;
+					}
+
+					if (checkLane) {
+						int pos = commit.getLane().getPosition();
+						numLanes = Math.max(numLanes, pos + 1);
+					}
+				}
 			}
 
 			int graphWidth = numLanes * LANE_WIDTH + RIGHT_PAD;
@@ -165,12 +205,13 @@
 
 			// create an image buffer and render the lanes
 			BufferedImage image = new BufferedImage(graphWidth, rowHeight*numCommits, BufferedImage.TYPE_INT_ARGB);
+
 			Graphics2D g = null;
 			try {
 				g = image.createGraphics();
 				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 				LanesRenderer renderer = new LanesRenderer();
-				for (int i = 0; i < numCommits; i++) {
+				for (int i = 0; i < commitList.size(); i++) {
 					PlotCommit<Lane> commit = commitList.get(i);
 					Graphics row = g.create(0, i*rowHeight, graphWidth, rowHeight);
 					try {
@@ -189,7 +230,7 @@
 
 			// write the image buffer to the client
 			response.setContentType("image/png");
-			if (numCommits > 0) {
+			if (numCommits > 1) {
 				response.setHeader("Cache-Control", "public, max-age=60, must-revalidate");
 				response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commitList.get(0)).getTime());
 			}

--
Gitblit v1.9.1