Skip to content

Commit caa660d

Browse files
committed
Merge pull request gitblit-org#1027 from gitblit/1018-Filestore-downloads-filename
Links to filestore items now download file with correct filename and extension
2 parents 252dc07 + 77c38a1 commit caa660d

File tree

4 files changed

+279
-12
lines changed

4 files changed

+279
-12
lines changed

src/main/java/com/gitblit/wicket/pages/CommitDiffPage.java

+82-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.gitblit.wicket.pages;
1717

18+
import java.io.OutputStream;
1819
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.List;
@@ -23,9 +24,13 @@
2324
import org.apache.wicket.markup.html.basic.Label;
2425
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
2526
import org.apache.wicket.markup.html.link.ExternalLink;
27+
import org.apache.wicket.markup.html.link.Link;
2628
import org.apache.wicket.markup.repeater.Item;
2729
import org.apache.wicket.markup.repeater.data.DataView;
2830
import org.apache.wicket.markup.repeater.data.ListDataProvider;
31+
import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
32+
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
33+
import org.apache.wicket.util.resource.IResourceStream;
2934
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
3035
import org.eclipse.jgit.lib.Repository;
3136
import org.eclipse.jgit.revwalk.RevCommit;
@@ -35,13 +40,15 @@
3540
import com.gitblit.models.GitNote;
3641
import com.gitblit.models.PathModel.PathChangeModel;
3742
import com.gitblit.models.SubmoduleModel;
43+
import com.gitblit.models.UserModel;
3844
import com.gitblit.servlet.RawServlet;
3945
import com.gitblit.utils.DiffUtils;
4046
import com.gitblit.utils.DiffUtils.DiffComparator;
4147
import com.gitblit.utils.DiffUtils.DiffOutput;
4248
import com.gitblit.utils.DiffUtils.DiffOutputType;
4349
import com.gitblit.utils.JGitUtils;
4450
import com.gitblit.wicket.CacheControl;
51+
import com.gitblit.wicket.GitBlitWebSession;
4552
import com.gitblit.wicket.CacheControl.LastModified;
4653
import com.gitblit.wicket.WicketUtils;
4754
import com.gitblit.wicket.panels.CommitHeaderPanel;
@@ -135,7 +142,6 @@ public void populateItem(final Item<GitNote> item) {
135142
@Override
136143
public void populateItem(final Item<PathChangeModel> item) {
137144
final PathChangeModel entry = item.getModelObject();
138-
final String filestoreItemUrl = entry.isFilestoreItem() ? JGitUtils.getLfsRepositoryUrl(getContextUrl(), repositoryName, entry.getFilestoreOid()) : null;
139145

140146
Label changeType = new Label("changeType", "");
141147
WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
@@ -162,7 +168,34 @@ public void populateItem(final Item<PathChangeModel> item) {
162168
item.add(new LinkPanel("pathName", "list", entry.path + " @ " + getShortObjectId(submoduleId), "#n" + entry.objectId));
163169
} else {
164170
// add relative link
165-
item.add(new LinkPanel("pathName", "list", entry.path, entry.isFilestoreItem() ? filestoreItemUrl : "#n" + entry.objectId));
171+
if (entry.isFilestoreItem()) {
172+
173+
item.add(new LinkPanel("pathName", "list", entry.path, new Link<Object>("link", null) {
174+
175+
private static final long serialVersionUID = 1L;
176+
177+
@Override
178+
public void onClick() {
179+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
180+
181+
private static final long serialVersionUID = 1L;
182+
183+
@Override
184+
public void write(OutputStream output) {
185+
UserModel user = GitBlitWebSession.get().getUser();
186+
user = user == null ? UserModel.ANONYMOUS : user;
187+
188+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
189+
}
190+
};
191+
192+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
193+
}}));
194+
}
195+
else
196+
{
197+
item.add(new LinkPanel("pathName", "list", entry.path, "#n" + entry.objectId));
198+
}
166199
}
167200

168201
// quick links
@@ -188,8 +221,53 @@ public void populateItem(final Item<PathChangeModel> item) {
188221
if (entry.isFilestoreItem()) {
189222
item.add(new Label("filestore", getString("gb.filestore")).setVisible(true));
190223

191-
item.add(new ExternalLink("view", filestoreItemUrl));
192-
item.add(new ExternalLink("raw", filestoreItemUrl));
224+
item.add(new Link<Object>("view", null) {
225+
226+
private static final long serialVersionUID = 1L;
227+
228+
@Override
229+
public void onClick() {
230+
231+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
232+
233+
private static final long serialVersionUID = 1L;
234+
235+
@Override
236+
public void write(OutputStream output) {
237+
UserModel user = GitBlitWebSession.get().getUser();
238+
user = user == null ? UserModel.ANONYMOUS : user;
239+
240+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
241+
}
242+
};
243+
244+
245+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
246+
}});
247+
248+
item.add(new Link<Object>("raw", null) {
249+
250+
private static final long serialVersionUID = 1L;
251+
252+
@Override
253+
public void onClick() {
254+
255+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
256+
257+
private static final long serialVersionUID = 1L;
258+
259+
@Override
260+
public void write(OutputStream output) {
261+
UserModel user = GitBlitWebSession.get().getUser();
262+
user = user == null ? UserModel.ANONYMOUS : user;
263+
264+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
265+
}
266+
};
267+
268+
269+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
270+
}});
193271
} else {
194272

195273
item.add(new Label("filestore", getString("gb.filestore")).setVisible(false));

src/main/java/com/gitblit/wicket/pages/CommitPage.java

+97-3
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,51 @@
1515
*/
1616
package com.gitblit.wicket.pages;
1717

18+
import java.io.OutputStream;
19+
import java.sql.Blob;
1820
import java.util.ArrayList;
1921
import java.util.Arrays;
2022
import java.util.List;
23+
import java.util.concurrent.Callable;
2124

2225
import org.apache.wicket.PageParameters;
26+
import org.apache.wicket.behavior.SimpleAttributeModifier;
2327
import org.apache.wicket.markup.html.basic.Label;
2428
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
29+
import org.apache.wicket.markup.html.link.DownloadLink;
2530
import org.apache.wicket.markup.html.link.ExternalLink;
31+
import org.apache.wicket.markup.html.link.Link;
32+
import org.apache.wicket.markup.html.link.ResourceLink;
2633
import org.apache.wicket.markup.repeater.Item;
2734
import org.apache.wicket.markup.repeater.data.DataView;
2835
import org.apache.wicket.markup.repeater.data.ListDataProvider;
36+
import org.apache.wicket.model.AbstractReadOnlyModel;
37+
import org.apache.wicket.model.IModel;
2938
import org.apache.wicket.model.StringResourceModel;
39+
import org.apache.wicket.request.target.basic.RedirectRequestTarget;
40+
import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
41+
import org.apache.wicket.util.resource.AbstractResourceStream;
42+
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
43+
import org.apache.wicket.util.resource.IResourceStream;
44+
import org.bouncycastle.jcajce.provider.symmetric.Threefish;
3045
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
3146
import org.eclipse.jgit.lib.Repository;
3247
import org.eclipse.jgit.revwalk.RevCommit;
3348

3449
import com.gitblit.Constants;
50+
import com.gitblit.GitBlit;
51+
import com.gitblit.manager.FilestoreManager;
52+
import com.gitblit.manager.GitblitManager;
53+
import com.gitblit.models.FilestoreModel;
3554
import com.gitblit.models.GitNote;
55+
import com.gitblit.models.RepositoryModel;
3656
import com.gitblit.models.PathModel.PathChangeModel;
3757
import com.gitblit.models.SubmoduleModel;
58+
import com.gitblit.models.UserModel;
3859
import com.gitblit.servlet.RawServlet;
3960
import com.gitblit.utils.JGitUtils;
4061
import com.gitblit.wicket.CacheControl;
62+
import com.gitblit.wicket.GitBlitWebSession;
4163
import com.gitblit.wicket.CacheControl.LastModified;
4264
import com.gitblit.wicket.WicketUtils;
4365
import com.gitblit.wicket.panels.CommitHeaderPanel;
@@ -198,7 +220,31 @@ public void populateItem(final Item<PathChangeModel> item) {
198220
}
199221

200222
if (entry.isFilestoreItem()) {
201-
item.add(new LinkPanel("pathName", "list", entry.path, filestoreItemUrl));
223+
item.add(new LinkPanel("pathName", "list", entry.path, new Link<Object>("link", null) {
224+
225+
private static final long serialVersionUID = 1L;
226+
227+
@Override
228+
public void onClick() {
229+
230+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
231+
232+
private static final long serialVersionUID = 1L;
233+
234+
@Override
235+
public void write(OutputStream output) {
236+
UserModel user = GitBlitWebSession.get().getUser();
237+
user = user == null ? UserModel.ANONYMOUS : user;
238+
239+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
240+
}
241+
};
242+
243+
244+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
245+
}}));
246+
247+
202248
} else {
203249
item.add(new LinkPanel("pathName", "list", displayPath, BlobPage.class,
204250
WicketUtils.newPathParameter(repositoryName, entry.commitId, path)));
@@ -232,8 +278,56 @@ public void populateItem(final Item<PathChangeModel> item) {
232278
if (entry.isFilestoreItem()) {
233279
item.add(new Label("filestore", getString("gb.filestore")).setVisible(true));
234280

235-
item.add(new ExternalLink("view", filestoreItemUrl));
236-
item.add(new ExternalLink("raw", filestoreItemUrl));
281+
282+
283+
item.add(new Link<Object>("view", null) {
284+
285+
private static final long serialVersionUID = 1L;
286+
287+
@Override
288+
public void onClick() {
289+
290+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
291+
292+
private static final long serialVersionUID = 1L;
293+
294+
@Override
295+
public void write(OutputStream output) {
296+
UserModel user = GitBlitWebSession.get().getUser();
297+
user = user == null ? UserModel.ANONYMOUS : user;
298+
299+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
300+
}
301+
};
302+
303+
304+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
305+
}});
306+
307+
item.add(new Link<Object>("raw", null) {
308+
309+
private static final long serialVersionUID = 1L;
310+
311+
@Override
312+
public void onClick() {
313+
314+
IResourceStream resourceStream = new AbstractResourceStreamWriter() {
315+
316+
private static final long serialVersionUID = 1L;
317+
318+
@Override
319+
public void write(OutputStream output) {
320+
UserModel user = GitBlitWebSession.get().getUser();
321+
user = user == null ? UserModel.ANONYMOUS : user;
322+
323+
app().filestore().downloadBlob(entry.getFilestoreOid(), user, getRepositoryModel(), output);
324+
}
325+
};
326+
327+
328+
getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream, entry.path));
329+
}});
330+
237331
} else {
238332
item.add(new Label("filestore", getString("gb.filestore")).setVisible(false));
239333

0 commit comments

Comments
 (0)