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 | 169 +++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 111 insertions(+), 58 deletions(-)
diff --git a/src/main/java/com/gitblit/PagesServlet.java b/src/main/java/com/gitblit/PagesServlet.java
index fc71bc5..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);
@@ -142,34 +163,23 @@
return;
}
- 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() + 2);
- extensions.add("html");
- extensions.add("htm");
- 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,43 +194,86 @@
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 {
--
Gitblit v1.9.1