Yes, It is working. Adding AJAXDownload behavior to the Folder in newContentComponent and download.initiate(target) in onClick method of the Folder implementation did the trick.
Thanks, -Mihir. On Thu, Jul 16, 2015 at 2:24 PM, Mihir Chhaya <[email protected]> wrote: > I had had AjaxDownLoad implemented as below and download initiated. It > stopped the Ajax debug error, but did not show dialog box to save. > > I might not be setting the resource stream properly. Thanks for 'forcing' > me to look at the AjaxUpload code online :) > > -Mihir. > > On Thu, Jul 16, 2015 at 2:11 PM, Martin Grigorov <[email protected]> > wrote: > >> Hi, >> >> You cannot stream binary data in the Ajax response. >> Wicket-ajax.js expects XML response. >> >> Check >> >> https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow >> for a description how to accomplish your task. >> >> Martin Grigorov >> Freelancer. Available for hire! >> Wicket Training and Consulting >> https://twitter.com/mtgrigorov >> >> On Thu, Jul 16, 2015 at 8:36 PM, Mihir Chhaya <[email protected]> >> >> wrote: >> >> > Hello, >> > >> > Could anybody guide me on following? >> > >> > I am using SelectableFolderContent from Wicket Advanced Tabular Tree >> > structure example (TableTreePage). >> > >> > Here is what I am trying: >> > >> > 1. Using JCraft - JSch, establish connection to the host, traverse the >> > folder structure, prepare list of file path-name, file size, file type >> etc. >> > - This is working. >> > 2. Display the list on the tabular tree structure - This is working. >> > 3. On click of the link of each folder, expand and collapse the folder >> > structure - Working. >> > 4. On click of the file, zip the file and create into default temp >> folder >> > of the running server- Working. >> > >> > 5. At the same time when clicked, open download file dialog box to >> download >> > the zip file from the server to local machine - Not working. >> > >> > Here is my SelectableFolderContent class. 'downloadFile(...)' method >> call >> > in from select(...) is where I am trying to download using >> IResourceStream. >> > >> > public class SelectableFolderContent extends Content { >> > >> > private static final long serialVersionUID = 1L; >> > >> > private ITreeProvider<SomeFileBean> provider; >> > >> > private IModel<SomeFileBean> selected; >> > >> > public SelectableFolderContent(ITreeProvider<SomeFileBean> >> provider) { >> > this.provider = provider; >> > } >> > >> > @Override >> > public void detach() { >> > if (selected != null) { >> > selected.detach(); >> > } >> > } >> > >> > protected boolean isSelected(SomeFileBean someFile) { >> > IModel<SomeFileBean> model = provider.model(someFile); >> > >> > try { >> > return selected != null && selected.equals(model); >> > } finally { >> > model.detach(); >> > } >> > } >> > >> > protected void select(SomeFileBean someFile, >> AbstractTree<SomeFileBean> >> > tree, final AjaxRequestTarget target) { >> > >> > if (!someFile.isFolder()) { >> > //SFTP to host, get file, create zip in temp folder. Once done, >> download to >> > local machine. >> > downloadFile(tree.getPage(), someFile, target); >> > } else { >> > >> > if (selected != null) { >> > tree.updateNode(selected.getObject(), target); >> > >> > selected.detach(); >> > selected = null; >> > } >> > >> > selected = provider.model(someFile); >> > >> > if (tree.getState(selected.getObject()) == >> > AbstractTree.State.COLLAPSED) { >> > tree.expand(selected.getObject()); >> > } else { >> > tree.collapse(selected.getObject()); >> > } >> > tree.updateNode(someFile, target); >> > >> > tree.getPage().setResponsePage(SomeTableTreePage.class); >> > } >> > } >> > >> > >> > @Override >> > public Component newContentComponent(final String id, final >> > AbstractTree<SomeFileBean> tree, final IModel<SomeFileBean> model) { >> > >> > Folder<SomeFileBean> components = new Folder<SomeFileBean>(id, >> > tree, model) { >> > private static final long serialVersionUID = 1L; >> > >> > @Override >> > protected IModel<?> newLabelModel(IModel<SomeFileBean> >> model) { >> > return new PropertyModel<String>(model, "id"); >> > } >> > >> > /** >> > * Always clickable. >> > */ >> > @Override >> > protected boolean isClickable() { >> > return true; >> > } >> > >> > @Override >> > protected void onClick(AjaxRequestTarget target) { >> > SelectableFolderContent.this.select(modelObject, tree, >> > target); >> > } >> > >> > @Override >> > protected boolean isSelected() { >> > return >> > SelectableFolderContent.this.isSelected(getModelObject()); >> > } >> > >> > }; >> > >> > return components; >> > } >> > protected void downloadFile(final Page page, SomeFileBean someFile, >> > AjaxRequestTarget target) { >> > IModel<File> fileModel = getDownloadFileModel(someFile); >> > file = fileModel.getObject(); >> > IResourceStream resourceStream = new FileResourceStream(new >> > org.apache.wicket.util.file.File(file)); >> > String fileName = "serverlog.zip"; >> > >> > ResourceStreamRequestHandler resourceStreamRequestHandler = new >> > ResourceStreamRequestHandler( >> > resourceStream, fileName); >> > >> > >> > >> page.getRequestCycle().scheduleRequestHandlerAfterCurrent(resourceStreamRequestHandler); >> > >> > >> > try { >> > resourceStream.close(); >> > } catch (IOException e) { >> > AppLogger.logMessage(AppLogger.LEVEL.ERROR, "File I/O >> Error:", >> > e); >> > } catch (Exception e) { >> > AppLogger.logMessage(AppLogger.LEVEL.ERROR, "Error:", e); >> > } >> > } >> > } >> > >> > >> > There are two issues I am experiencing: >> > 1. Dialog box not opening to save the file on local machine. >> > 2. When debugging, the Ajax Debug window showing >> 'Wicket.Ajax.Call.failure: >> > Error while parsing response: Error: Invalid XML' error. >> > >> > Thanks in advance, >> > -Mihir. >> > >> > >
