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.