From 3f5b8f5d9203aa7ffb7fbe9cdbaf9dba3da6cae6 Mon Sep 17 00:00:00 2001 From: Hybris95 <hybris_95@hotmail.com> Date: Thu, 01 May 2014 16:14:15 -0400 Subject: [PATCH] Fixes sort, page building and search functions on "my tickets" page. --- src/main/java/com/gitblit/servlet/PagesServlet.java | 126 ++++++++++++++++++++++++------------------ 1 files changed, 72 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gitblit/servlet/PagesServlet.java b/src/main/java/com/gitblit/servlet/PagesServlet.java index 6146f13..7e48f8e 100644 --- a/src/main/java/com/gitblit/servlet/PagesServlet.java +++ b/src/main/java/com/gitblit/servlet/PagesServlet.java @@ -20,17 +20,15 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; -import java.util.Set; -import java.util.TreeSet; +import java.util.Map; +import java.util.TreeMap; -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.FileMode; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevTree; @@ -40,9 +38,8 @@ import com.gitblit.Constants; import com.gitblit.IStoredSettings; import com.gitblit.Keys; -import com.gitblit.Keys.web; +import com.gitblit.dagger.DaggerServlet; 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; @@ -53,31 +50,28 @@ import com.gitblit.wicket.MarkupProcessor; import com.gitblit.wicket.MarkupProcessor.MarkupDocument; +import dagger.ObjectGraph; + /** * Serves the content of a gh-pages branch. * * @author James Moger * */ -@Singleton -public class PagesServlet extends HttpServlet { +public class PagesServlet extends DaggerServlet { private static final long serialVersionUID = 1L; private transient Logger logger = LoggerFactory.getLogger(PagesServlet.class); - private final IStoredSettings settings; + private IStoredSettings settings; - private final IRepositoryManager repositoryManager; + private IRepositoryManager repositoryManager; - @Inject - public PagesServlet( - IRuntimeManager runtimeManager, - IRepositoryManager repositoryManager) { - - super(); - this.settings = runtimeManager.getSettings(); - this.repositoryManager = repositoryManager; + @Override + protected void inject(ObjectGraph dagger) { + this.settings = dagger.get(IStoredSettings.class); + this.repositoryManager = dagger.get(IRepositoryManager.class); } /** @@ -163,7 +157,6 @@ "# Error\nSorry, the repository {0} does not have a **gh-pages** branch!", repository); error(response, mkd); - r.close(); return; } @@ -176,45 +169,59 @@ 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); - } + + List<PathModel> pathEntries = JGitUtils.getFilesInPath(r, res, commit); byte[] content = null; - if (names.isEmpty()) { + if (pathEntries.isEmpty()) { // not a path, a specific resource try { - String contentType = context.getMimeType(resource); + String contentType = context.getMimeType(res); if (contentType == null) { contentType = "text/plain"; } if (contentType.startsWith("text")) { - content = JGitUtils.getStringContent(r, tree, resource, encodings).getBytes( + content = JGitUtils.getStringContent(r, tree, res, encodings).getBytes( Constants.ENCODING); } else { - content = JGitUtils.getByteContent(r, tree, resource, false); + content = JGitUtils.getByteContent(r, tree, res, false); } response.setContentType(contentType); } catch (Exception e) { } } else { - // path + // path request + if (!request.getPathInfo().endsWith("/")) { + // redirect to trailing '/' url + response.sendRedirect(request.getServletPath() + request.getPathInfo() + "/"); + return; + } + + Map<String, String> names = new TreeMap<String, String>(); + for (PathModel entry : pathEntries) { + names.put(entry.name.toLowerCase(), entry.name); + } + List<String> extensions = new ArrayList<String>(); extensions.add("html"); extensions.add("htm"); extensions.addAll(processor.getMarkupExtensions()); for (String ext : extensions) { - String file = "index." + ext; + String key = "index." + ext; - if (names.contains(file)) { - String stringContent = JGitUtils.getStringContent(r, tree, file, encodings); + if (names.containsKey(key)) { + String fileName = names.get(key); + String fullPath = fileName; + if (!res.isEmpty()) { + fullPath = res + "/" + fileName; + } + String stringContent = JGitUtils.getStringContent(r, tree, fullPath, encodings); if (stringContent == null) { continue; } content = stringContent.getBytes(Constants.ENCODING); if (content != null) { - resource = file; + res = fullPath; // assume text/html unless the servlet container // overrides response.setContentType("text/html; charset=" + Constants.ENCODING); @@ -224,26 +231,9 @@ } } - // no content, try custom 404 page + // no content, document list or 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 { + if (pathEntries.isEmpty()) { // 404 String custom404 = JGitUtils.getStringContent(r, tree, "404.html", encodings); if (!StringUtils.isEmpty(custom404)) { @@ -267,6 +257,34 @@ } catch (Throwable t) { logger.error("Failed to write page to client", t); } + } else { + // 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}/{1}\">{1}</a></td><td>{2}</td><td>{3}</td></tr>"; + final ByteFormat byteFormat = new ByteFormat(); + if (!pathEntries.isEmpty()) { + if (pathEntries.get(0).path.indexOf('/') > -1) { + // we are in a subdirectory, add parent directory link + pathEntries.add(0, new PathModel("..", resource + "/..", 0, FileMode.TREE.getBits(), null, null)); + } + } + + String basePath = request.getServletPath() + request.getPathInfo(); + if (basePath.charAt(basePath.length() - 1) == '/') { + // strip trailing slash + basePath = basePath.substring(0, basePath.length() - 1); + } + for (PathModel entry : pathEntries) { + response.getWriter().append(MessageFormat.format(pattern, basePath, entry.name, + JGitUtils.getPermissionsFromMode(entry.mode), byteFormat.format(entry.size))); + } + response.getWriter().append("</tbody>"); + response.getWriter().append("</table>"); } return; } @@ -290,10 +308,10 @@ 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); + } finally { + r.close(); } } -- Gitblit v1.9.1