From aa6d43e8b28ff73d69a920e9b3a7b284cfce00c3 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Nov 2013 11:05:51 -0500
Subject: [PATCH] Extract SessionManager from GitBlit singleton

---
 src/main/java/com/gitblit/PagesServlet.java |  171 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 113 insertions(+), 58 deletions(-)

diff --git a/src/main/java/com/gitblit/PagesServlet.java b/src/main/java/com/gitblit/PagesServlet.java
index 1e2d311..ba919e0 100644
--- a/src/main/java/com/gitblit/PagesServlet.java
+++ b/src/main/java/com/gitblit/PagesServlet.java
@@ -20,7 +20,11 @@
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -33,31 +37,48 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.gitblit.manager.IRepositoryManager;
+import com.gitblit.manager.IRuntimeManager;
+import com.gitblit.models.PathModel;
 import com.gitblit.models.RefModel;
 import com.gitblit.utils.ArrayUtils;
+import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.MarkdownUtils;
 import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.MarkupProcessor;
+import com.gitblit.wicket.MarkupProcessor.MarkupDocument;
 
 /**
  * Serves the content of a gh-pages branch.
- * 
+ *
  * @author James Moger
- * 
+ *
  */
+@Singleton
 public class PagesServlet extends HttpServlet {
 
 	private static final long serialVersionUID = 1L;
 
 	private transient Logger logger = LoggerFactory.getLogger(PagesServlet.class);
 
-	public PagesServlet() {
+	private final IStoredSettings settings;
+
+	private final IRepositoryManager repositoryManager;
+
+	@Inject
+	public PagesServlet(
+			IRuntimeManager runtimeManager,
+			IRepositoryManager repositoryManager) {
+
 		super();
+		this.settings = runtimeManager.getSettings();
+		this.repositoryManager = repositoryManager;
 	}
 
 	/**
 	 * Returns an url to this servlet for the specified parameters.
-	 * 
+	 *
 	 * @param baseURL
 	 * @param repository
 	 * @param path
@@ -73,7 +94,7 @@
 	/**
 	 * Retrieves the specified resource from the gh-pages branch of the
 	 * repository.
-	 * 
+	 *
 	 * @param request
 	 * @param response
 	 * @throws javax.servlet.ServletException
@@ -105,7 +126,7 @@
 			} else {
 				repository = path.substring(0, slash);
 			}
-			r = GitBlit.self().getRepository(repository, false);
+			r = repositoryManager.getRepository(repository, false);
 			offset = slash + 1;
 			if (offset > 0) {
 				resource = path.substring(offset);
@@ -141,35 +162,24 @@
 				r.close();
 				return;
 			}
-			response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());
 
-			String [] encodings = GitBlit.getEncodings();
+			MarkupProcessor processor = new MarkupProcessor(settings);
+			String [] encodings = settings.getStrings(Keys.web.blobEncodings).toArray(new String[0]);
 
 			RevTree tree = commit.getTree();
+
+			String res = resource;
+			if (res.endsWith("/")) {
+				res = res.substring(0, res.length() - 1);
+			}
+			Set<String> names = new TreeSet<String>();
+			for (PathModel entry : JGitUtils.getFilesInPath(r, res, commit)) {
+				names.add(entry.name);
+			}
+
 			byte[] content = null;
-			if (StringUtils.isEmpty(resource)) {
-				// find resource
-				List<String> markdownExtensions = GitBlit.getStrings(Keys.web.markdownExtensions);
-				List<String> extensions = new ArrayList<String>(markdownExtensions.size() + 1);
-				extensions.add("html");
-				extensions.addAll(markdownExtensions);
-				for (String ext : extensions){
-					String file = "index." + ext;
-					String stringContent = JGitUtils.getStringContent(r, tree, file, encodings);
-					if(stringContent == null){
-						continue;
-					}
-					content = stringContent.getBytes(Constants.ENCODING);
-					if (content != null) {
-						resource = file;
-						// assume text/html unless the servlet container
-						// overrides
-						response.setContentType("text/html; charset=" + Constants.ENCODING);
-						break;
-					}
-				}
-			} else {
-				// specific resource
+			if (names.isEmpty()) {
+				// not a path, a specific resource
 				try {
 					String contentType = context.getMimeType(resource);
 					if (contentType == null) {
@@ -184,47 +194,92 @@
 					response.setContentType(contentType);
 				} catch (Exception e) {
 				}
+			} else {
+				// path
+				List<String> extensions = new ArrayList<String>();
+				extensions.add("html");
+				extensions.add("htm");
+				extensions.addAll(processor.getMarkupExtensions());
+				for (String ext : extensions) {
+					String file = "index." + ext;
+
+					if (names.contains(file)) {
+						String stringContent = JGitUtils.getStringContent(r, tree, file, encodings);
+						if (stringContent == null) {
+							continue;
+						}
+						content = stringContent.getBytes(Constants.ENCODING);
+						if (content != null) {
+							resource = file;
+							// assume text/html unless the servlet container
+							// overrides
+							response.setContentType("text/html; charset=" + Constants.ENCODING);
+							break;
+						}
+					}
+				}
 			}
 
 			// no content, try custom 404 page
 			if (ArrayUtils.isEmpty(content)) {
-				String custom404 = JGitUtils.getStringContent(r, tree, "404.html", encodings);
-				if (!StringUtils.isEmpty(custom404)) {
-					content = custom404.getBytes(Constants.ENCODING);
-				}
+				String ext = StringUtils.getFileExtension(resource);
+				if (StringUtils.isEmpty(ext)) {
+					// document list
+					response.setContentType("text/html");
+					response.getWriter().append("<style>table th, table td { min-width: 150px; text-align: left; }</style>");
+					response.getWriter().append("<table>");
+					response.getWriter().append("<thead><tr><th>path</th><th>mode</th><th>size</th></tr>");
+					response.getWriter().append("</thead>");
+					response.getWriter().append("<tbody>");
+					String pattern = "<tr><td><a href=\"{0}\">{0}</a></td><td>{1}</td><td>{2}</td></tr>";
+					final ByteFormat byteFormat = new ByteFormat();
+					List<PathModel> entries = JGitUtils.getFilesInPath(r, resource, commit);
+					for (PathModel entry : entries) {
+						response.getWriter().append(MessageFormat.format(pattern, entry.name, JGitUtils.getPermissionsFromMode(entry.mode), byteFormat.format(entry.size)));
+					}
+					response.getWriter().append("</tbody>");
+					response.getWriter().append("</table>");
+				} else {
+					// 404
+					String custom404 = JGitUtils.getStringContent(r, tree, "404.html", encodings);
+					if (!StringUtils.isEmpty(custom404)) {
+						content = custom404.getBytes(Constants.ENCODING);
+					}
 
-				// still no content
-				if (ArrayUtils.isEmpty(content)) {
-					String str = MessageFormat.format(
-							"# Error\nSorry, the requested resource **{0}** was not found.",
-							resource);
-					content = MarkdownUtils.transformMarkdown(str).getBytes(Constants.ENCODING);
-				}
+					// still no content
+					if (ArrayUtils.isEmpty(content)) {
+						String str = MessageFormat.format(
+								"# Error\nSorry, the requested resource **{0}** was not found.",
+								resource);
+						content = MarkdownUtils.transformMarkdown(str).getBytes(Constants.ENCODING);
+					}
 
-				try {
-					// output the content
-					logger.warn("Pages 404: " + resource);
-					response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-					response.getOutputStream().write(content);
-					response.flushBuffer();
-				} catch (Throwable t) {
-					logger.error("Failed to write page to client", t);
+					try {
+						// output the content
+						logger.warn("Pages 404: " + resource);
+						response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+						response.getOutputStream().write(content);
+						response.flushBuffer();
+					} catch (Throwable t) {
+						logger.error("Failed to write page to client", t);
+					}
 				}
 				return;
 			}
 
-			// check to see if we should transform markdown files
-			for (String ext : GitBlit.getStrings(Keys.web.markdownExtensions)) {
-				if (resource.endsWith(ext)) {
-					String mkd = new String(content, Constants.ENCODING);
-					content = MarkdownUtils.transformMarkdown(mkd).getBytes(Constants.ENCODING);
-					response.setContentType("text/html; charset=" + Constants.ENCODING);
-					break;
-				}
+			// check to see if we should transform markup files
+			String ext = StringUtils.getFileExtension(resource);
+			if (processor.getMarkupExtensions().contains(ext)) {
+				String markup = new String(content, Constants.ENCODING);
+				MarkupDocument markupDoc = processor.parse(repository, commit.getName(), resource, markup);
+				content = markupDoc.html.getBytes("UTF-8");
+				response.setContentType("text/html; charset=" + Constants.ENCODING);
 			}
 
 			try {
 				// output the content
+				response.setHeader("Cache-Control", "public, max-age=3600, must-revalidate");
+				response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commit).getTime());
 				response.getOutputStream().write(content);
 				response.flushBuffer();
 			} catch (Throwable t) {

--
Gitblit v1.9.1