From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001
From: Gerard Smyth <gerard.smyth@gmail.com>
Date: Thu, 08 May 2014 13:09:30 -0400
Subject: [PATCH] Updated the SyndicationServlet to provide an additional option to return details of the tags in the repository instead of the commits. This uses a new 'ot' request parameter to indicate the object type of the content to return, which can be ither TAG or COMMIT. If this is not provided, then COMMIT is assumed to maintain backwards compatability. If tags are returned, then the paging parameters, 'l' and 'pg' are still supported, but searching options are currently ignored.

---
 src/main/java/com/gitblit/servlet/PagesServlet.java |  284 ++++----------------------------------------------------
 1 files changed, 21 insertions(+), 263 deletions(-)

diff --git a/src/main/java/com/gitblit/servlet/PagesServlet.java b/src/main/java/com/gitblit/servlet/PagesServlet.java
index 6146f13..f578f86 100644
--- a/src/main/java/com/gitblit/servlet/PagesServlet.java
+++ b/src/main/java/com/gitblit/servlet/PagesServlet.java
@@ -15,43 +15,10 @@
  */
 package com.gitblit.servlet;
 
-import java.io.IOException;
-import java.text.MessageFormat;
-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;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.gitblit.Constants;
-import com.gitblit.IStoredSettings;
-import com.gitblit.Keys;
-import com.gitblit.Keys.web;
-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.
@@ -59,26 +26,10 @@
  * @author James Moger
  *
  */
-@Singleton
-public class PagesServlet extends HttpServlet {
+public class PagesServlet extends RawServlet {
 
 	private static final long serialVersionUID = 1L;
 
-	private transient Logger logger = LoggerFactory.getLogger(PagesServlet.class);
-
-	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.
@@ -95,224 +46,31 @@
 		return baseURL + Constants.PAGES + repository + "/" + (path == null ? "" : ("/" + path));
 	}
 
-	/**
-	 * Retrieves the specified resource from the gh-pages branch of the
-	 * repository.
-	 *
-	 * @param request
-	 * @param response
-	 * @throws javax.servlet.ServletException
-	 * @throws java.io.IOException
-	 */
-	private void processRequest(HttpServletRequest request, HttpServletResponse response)
-			throws ServletException, IOException {
-		String path = request.getPathInfo();
-		if (path.toLowerCase().endsWith(".git")) {
-			// forward to url with trailing /
-			// this is important for relative pages links
-			response.sendRedirect(request.getServletPath() + path + "/");
-			return;
-		}
-		if (path.charAt(0) == '/') {
-			// strip leading /
-			path = path.substring(1);
-		}
-
-		// determine repository and resource from url
-		String repository = "";
-		String resource = "";
-		Repository r = null;
-		int offset = 0;
-		while (r == null) {
-			int slash = path.indexOf('/', offset);
-			if (slash == -1) {
-				repository = path;
-			} else {
-				repository = path.substring(0, slash);
-			}
-			r = repositoryManager.getRepository(repository, false);
-			offset = slash + 1;
-			if (offset > 0) {
-				resource = path.substring(offset);
-			}
-			if (repository.equals(path)) {
-				// either only repository in url or no repository found
-				break;
-			}
-		}
-
-		ServletContext context = request.getSession().getServletContext();
-
-		try {
-			if (r == null) {
-				// repository not found!
-				String mkd = MessageFormat.format(
-						"# Error\nSorry, no valid **repository** specified in this url: {0}!",
-						repository);
-				error(response, mkd);
-				return;
-			}
-
-			// retrieve the content from the repository
-			RefModel pages = JGitUtils.getPagesBranch(r);
-			RevCommit commit = JGitUtils.getCommit(r, pages.getObjectId().getName());
-
-			if (commit == null) {
-				// branch not found!
-				String mkd = MessageFormat.format(
-						"# Error\nSorry, the repository {0} does not have a **gh-pages** branch!",
-						repository);
-				error(response, mkd);
-				r.close();
-				return;
-			}
-
-			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 (names.isEmpty()) {
-				// not a path, a specific resource
-				try {
-					String contentType = context.getMimeType(resource);
-					if (contentType == null) {
-						contentType = "text/plain";
-					}
-					if (contentType.startsWith("text")) {
-						content = JGitUtils.getStringContent(r, tree, resource, encodings).getBytes(
-								Constants.ENCODING);
-					} else {
-						content = JGitUtils.getByteContent(r, tree, resource, false);
-					}
-					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 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);
-					}
-
-					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 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) {
-				logger.error("Failed to write page to client", t);
-			}
-
-			// close the repository
-			r.close();
-		} catch (Throwable t) {
-			logger.error("Failed to write page to client", t);
-		}
-	}
-
-	private void error(HttpServletResponse response, String mkd) throws ServletException,
-			IOException, ParseException {
-		String content = MarkdownUtils.transformMarkdown(mkd);
-		response.setContentType("text/html; charset=" + Constants.ENCODING);
-		response.getWriter().write(content);
+	@Override
+	protected String getBranch(String repository, HttpServletRequest request) {
+		return "gh-pages";
 	}
 
 	@Override
-	protected void doPost(HttpServletRequest request, HttpServletResponse response)
-			throws ServletException, IOException {
-		processRequest(request, response);
+	protected String getPath(String repository, String branch, HttpServletRequest request) {
+		String pi = request.getPathInfo().substring(1);
+		if (pi.equals(repository)) {
+			return "";
+		}
+		String path = pi.substring(pi.indexOf(repository) + repository.length() + 1);
+		if (path.endsWith("/")) {
+			path = path.substring(0, path.length() - 1);
+		}
+		return path;
 	}
 
 	@Override
-	protected void doGet(HttpServletRequest request, HttpServletResponse response)
-			throws ServletException, IOException {
-		processRequest(request, response);
+	protected boolean renderIndex() {
+		return true;
+	}
+
+	@Override
+	protected void setContentType(HttpServletResponse response, String contentType) {
+		response.setContentType(contentType);;
 	}
 }

--
Gitblit v1.9.1