From b00f45e9492d1cc17bc214daab9988c640741621 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Wed, 06 Apr 2016 14:32:33 -0400
Subject: [PATCH] Merge pull request #1044 from gitblit/1042-IntrusiveFilestoreLozenge

---
 src/main/java/com/gitblit/wicket/pages/TreePage.java |  142 +++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 118 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/gitblit/wicket/pages/TreePage.java b/src/main/java/com/gitblit/wicket/pages/TreePage.java
index 870b75d..eecad26 100644
--- a/src/main/java/com/gitblit/wicket/pages/TreePage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TreePage.java
@@ -15,25 +15,33 @@
  */
 package com.gitblit.wicket.pages;
 
+import java.io.OutputStream;
 import java.util.List;
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.Constants;
+import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
+import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
+import org.apache.wicket.util.resource.IResourceStream;
 import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 
 import com.gitblit.models.PathModel;
 import com.gitblit.models.SubmoduleModel;
+import com.gitblit.models.UserModel;
+import com.gitblit.servlet.RawServlet;
 import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.wicket.CacheControl;
+import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.CacheControl.LastModified;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.panels.CommitHeaderPanel;
@@ -51,13 +59,11 @@
 
 		Repository r = getRepository();
 		RevCommit commit = getCommit();
-		List<PathModel> paths = JGitUtils.getFilesInPath(r, path, commit);
+		List<PathModel> paths = JGitUtils.getFilesInPath2(r, path, commit);
 
 		// tree page links
 		add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
 				WicketUtils.newPathParameter(repositoryName, objectId, path)));
-		add(new BookmarkablePageLink<Void>("headLink", TreePage.class,
-				WicketUtils.newPathParameter(repositoryName, Constants.HEAD, path)));
 		add(new CompressedDownloadsPanel("compressedLinks", getRequest()
 				.getRelativePathPrefixToContextRoot(), repositoryName, objectId, path));
 
@@ -71,13 +77,14 @@
 			if (path.lastIndexOf('/') > -1) {
 				parentPath = path.substring(0, path.lastIndexOf('/'));
 			}
-			PathModel model = new PathModel("..", parentPath, 0, FileMode.TREE.getBits(), null, objectId);
+			PathModel model = new PathModel("..", parentPath, null, 0, FileMode.TREE.getBits(), null, objectId);
 			model.isParentPath = true;
 			paths.add(0, model);
 		}
 
+		final String id = getBestCommitId(commit);
+		
 		final ByteFormat byteFormat = new ByteFormat();
-
 		final String baseUrl = WicketUtils.getGitblitURL(getRequest());
 
 		// changed paths list
@@ -88,15 +95,18 @@
 
 			@Override
 			public void populateItem(final Item<PathModel> item) {
-				PathModel entry = item.getModelObject();
+				final PathModel entry = item.getModelObject();
+				
 				item.add(new Label("pathPermissions", JGitUtils.getPermissionsFromMode(entry.mode)));
+				item.add(WicketUtils.setHtmlTooltip(new Label("filestore", ""), getString("gb.filestore"))
+									.setVisible(entry.isFilestoreItem()));
+
 				if (entry.isParentPath) {
 					// parent .. path
 					item.add(WicketUtils.newBlankImage("pathIcon"));
 					item.add(new Label("pathSize", ""));
 					item.add(new LinkPanel("pathName", null, entry.name, TreePage.class,
-							WicketUtils
-									.newPathParameter(repositoryName, entry.commitId, entry.path)));
+							WicketUtils.newPathParameter(repositoryName, id, entry.path)));
 					item.add(new Label("pathLinks", ""));
 				} else {
 					if (entry.isTree()) {
@@ -104,16 +114,16 @@
 						item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png"));
 						item.add(new Label("pathSize", ""));
 						item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										entry.path)));
 
 						// links
 						Fragment links = new Fragment("pathLinks", "treeLinks", this);
 						links.add(new BookmarkablePageLink<Void>("tree", TreePage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										entry.path)));
 						links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										entry.path)));
 						links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl,
 								repositoryName, objectId, entry.path));
@@ -141,7 +151,7 @@
 								WicketUtils.newPathParameter(submodulePath, submoduleId,
 										"")).setEnabled(hasSubmodule));
 						links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										entry.path)));
 						links.add(new CompressedDownloadsPanel("compressedLinks", baseUrl,
 								submodulePath, submoduleId, "").setEnabled(hasSubmodule));
@@ -156,22 +166,100 @@
 						}
 						item.add(WicketUtils.getFileImage("pathIcon", entry.name));
 						item.add(new Label("pathSize", byteFormat.format(entry.size)));
-						item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
-										path)));
-
+						
 						// links
 						Fragment links = new Fragment("pathLinks", "blobLinks", this);
-						links.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
-										path)));
-						links.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils
-								.newPathParameter(repositoryName, entry.commitId, path)));
+						
+						if (entry.isFilestoreItem()) {
+							item.add(new LinkPanel("pathName", "list", displayPath, new Link<Object>("link", null) {
+								 
+								private static final long serialVersionUID = 1L;
+
+								@Override
+							    public void onClick() {
+							 
+							    	 IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+							    		 								    	
+										private static final long serialVersionUID = 1L;
+
+										@Override 
+							    	      public void write(OutputStream output) {
+							    	   		 UserModel user =  GitBlitWebSession.get().getUser();
+										     user = user == null ? UserModel.ANONYMOUS : user;
+										    	
+							    	        app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
+							    	      }
+							    	  };
+							    	      
+							    	
+							    	getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
+							    }}));
+							
+							links.add(new Link<Object>("view", null) {
+								 
+								private static final long serialVersionUID = 1L;
+
+								@Override
+							    public void onClick() {
+							 
+							    	 IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+							    		 								    	
+										private static final long serialVersionUID = 1L;
+
+										@Override 
+							    	      public void write(OutputStream output) {
+							    	   		 UserModel user =  GitBlitWebSession.get().getUser();
+										     user = user == null ? UserModel.ANONYMOUS : user;
+										    	
+							    	        app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
+							    	      }
+							    	  };
+							    	      
+							    	
+							    	getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
+							    }});
+							
+							links.add(new Link<Object>("raw", null) {
+								 
+								private static final long serialVersionUID = 1L;
+
+								@Override
+							    public void onClick() {
+							 
+							    	 IResourceStream resourceStream = new AbstractResourceStreamWriter() {
+							    		 								    	
+										private static final long serialVersionUID = 1L;
+
+										@Override 
+							    	      public void write(OutputStream output) {
+							    	   		 UserModel user =  GitBlitWebSession.get().getUser();
+										     user = user == null ? UserModel.ANONYMOUS : user;
+										    	
+							    	        app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
+							    	      }
+							    	  };
+							    	      
+							    	
+							    	getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
+							    }});
+							
+						} else {
+							item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class,
+									WicketUtils.newPathParameter(repositoryName, id,
+											path)));
+							
+							links.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
+									WicketUtils.newPathParameter(repositoryName, id,
+											path)));
+							String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, id, path);
+							links.add(new ExternalLink("raw", rawUrl));
+						}
+						
 						links.add(new BookmarkablePageLink<Void>("blame", BlamePage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										path)));
 						links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
-								WicketUtils.newPathParameter(repositoryName, entry.commitId,
+								WicketUtils.newPathParameter(repositoryName, id,
 										path)));
 						item.add(links);
 					}
@@ -187,4 +275,10 @@
 	protected String getPageName() {
 		return getString("gb.tree");
 	}
+
+	@Override
+	protected boolean isCommitPage() {
+		return true;
+	}
+
 }

--
Gitblit v1.9.1