blob: b8cd317f3acb622ff02671b145501b6cbb11957d [file] [log] [blame]
/*
* $Id$
* $Revision$ $Date$
*
* ==============================================================================
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package wicket.examples.upload;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import wicket.PageParameters;
import wicket.examples.WicketExamplePage;
import wicket.markup.html.basic.Label;
import wicket.markup.html.form.upload.FileUpload;
import wicket.markup.html.form.upload.FileUploadField;
import wicket.markup.html.form.upload.UploadForm;
import wicket.markup.html.link.Link;
import wicket.markup.html.list.ListItem;
import wicket.markup.html.list.ListView;
import wicket.markup.html.panel.FeedbackPanel;
import wicket.util.file.Files;
import wicket.util.file.Folder;
import wicket.util.lang.Bytes;
/**
* Upload example.
*
* @author Eelco Hillenius
*/
public class UploadPage extends WicketExamplePage
{
/** Log. */
private static Log log = LogFactory.getLog(UploadPage.class);
/** List of files, model for file table. */
private List files = new ArrayList();
/** Reference to listview for easy access. */
private FileListView fileListView;
/** Upload folder */
private Folder uploadFolder;
/**
* Constructor.
*
* @param parameters
* Page parameters
*/
public UploadPage(final PageParameters parameters)
{
// Set upload folder to tempdir + 'wicket-uploads'.
this.uploadFolder = uploadFolder = new Folder(System.getProperty("java.io.tmpdir"),
"wicket-uploads");
// Ensure folder exists
uploadFolder.mkdirs();
// Create feedback panels
final FeedbackPanel simpleUploadFeedback = new FeedbackPanel("simpleUploadFeedback");
final FeedbackPanel uploadFeedback = new FeedbackPanel("uploadFeedback");
// Add uploadFeedback to the page itself
add(uploadFeedback);
// Add simple upload form, which is hooked up to its feedback panel by
// virtue of that panel being nested in the form.
final FileUploadForm simpleUploadForm = new FileUploadForm("simpleUpload");
simpleUploadForm.add(simpleUploadFeedback);
add(simpleUploadForm);
// Add folder view
add(new Label("dir", uploadFolder.getAbsolutePath()));
files.addAll(Arrays.asList(uploadFolder.listFiles()));
fileListView = new FileListView("fileList", files);
add(fileListView);
}
/**
* Refresh file list.
*/
private void refreshFiles()
{
fileListView.modelChanging();
files.clear();
files.addAll(Arrays.asList(uploadFolder.listFiles()));
}
/**
* Check whether the file allready exists, and if so, try to delete it.
*
* @param newFile
* the file to check
*/
private void checkFileExists(File newFile)
{
if (newFile.exists())
{
// Try to delete the file
if (!Files.remove(newFile))
{
throw new IllegalStateException("Unable to overwrite " + newFile.getAbsolutePath());
}
}
}
/**
* Form for uploads.
*/
private class FileUploadForm extends UploadForm
{
private FileUploadField fileUploadField;
/**
* Construct.
*
* @param name
* Component name
*/
public FileUploadForm(String name)
{
super(name);
// Add one file input field
add(fileUploadField = new FileUploadField("fileInput"));
// Set maximum size to 100K for demo purposes
setMaxSize(Bytes.kilobytes(100));
}
/**
* @see wicket.markup.html.form.upload.UploadForm#onSubmit()
*/
protected void onSubmit()
{
final FileUpload upload = fileUploadField.getFileUpload();
if (upload != null)
{
// Create a new file
File newFile = new File(uploadFolder, upload.getFile().getName());
// Check new file, delete if it allready existed
checkFileExists(newFile);
try
{
// Save to new file
newFile.createNewFile();
upload.writeTo(newFile);
UploadPage.this.info("saved file: " + upload.getFile());
}
catch (Exception e)
{
throw new IllegalStateException("Unable to write file");
}
// refresh the file list view
refreshFiles();
}
}
/**
* Gets the last part of the string after c or the string itself when c
* is not found.
*
* @param s
* the string
* @param c
* the char
* @return part of string
*/
private String afterLast(final String s, final char c)
{
final int index = s.lastIndexOf(c);
if (index == -1)
{
return s;
}
return s.substring(index + 1);
}
}
/**
* List view for files in upload folder.
*/
private class FileListView extends ListView
{
/**
* Construct.
*
* @param name
* Component name
* @param files
* The file list model
*/
public FileListView(String name, final List files)
{
super(name, files);
}
/**
* @see ListView#populateItem(ListItem)
*/
protected void populateItem(ListItem listItem)
{
final File file = (File)listItem.getModelObject();
listItem.add(new Label("file", file.getName()));
listItem.add(new Link("delete")
{
public void onClick()
{
Files.remove(file);
refreshFiles();
UploadPage.this.info("Deleted " + file);
}
});
}
}
}