package fr.openwide.core.showcase.web.application.widgets.component; import java.util.List; import org.apache.commons.io.FilenameUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.upload.FileUploadField; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.util.ListModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import fr.openwide.core.showcase.core.business.fileupload.model.ShowcaseFile; import fr.openwide.core.showcase.core.business.fileupload.service.IShowcaseFileService; import fr.openwide.core.showcase.web.application.widgets.resource.FileUploadResource; import fr.openwide.core.wicket.more.fileapi.behavior.FileUploadBehavior; import fr.openwide.core.wicket.more.fileapi.model.FileApiFile; import fr.openwide.core.wicket.more.fileapi.model.FileUploadFailType; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; public class FileUploadPanel extends Panel { private static final long serialVersionUID = 4147662803478838954L; private static final Logger LOGGER = LoggerFactory.getLogger(FileUploadPanel.class); @SpringBean private IShowcaseFileService showcaseFileService; private IModel<List<FileApiFile>> fileListModel = new ListModel<FileApiFile>(Lists.<FileApiFile>newArrayList()); public FileUploadPanel(String id) { super(id); final WebMarkupContainer fileListContainer = new WebMarkupContainer("fileListContainer"); fileListContainer.setOutputMarkupId(true); ListView<FileApiFile> fileList = new ListView<FileApiFile>("fileList", fileListModel) { private static final long serialVersionUID = -4186637455523902479L; @Override protected void populateItem(ListItem<FileApiFile> item) { item.add(new Label("name", item.getModelObject().getName())); item.add(new Label("type", item.getModelObject().getType())); item.add(new Label("size", item.getModelObject().getSize())); item.add(new ExternalLink("link", item.getModelObject().getObjectUrl())); } }; WebMarkupContainer progress = new WebMarkupContainer("progress"); progress.setOutputMarkupId(true); Form<?> form = new Form<Void>("form"); FileUploadField fileUpload = new FileUploadField("fileUpload"); fileUpload.add(new FileUploadBehavior(progress) { private static final long serialVersionUID = 8090452933671159353L; @Override protected List<FileApiFile> onFileChange(AjaxRequestTarget target, List<FileApiFile> fileList) { List<FileApiFile> acceptedFiles = Lists.newArrayList(); for (FileApiFile fileApiFile : fileList) { ShowcaseFile file = new ShowcaseFile(); file.setExtension(FilenameUtils.getExtension(fileApiFile.getName())); file.setName(fileApiFile.getName()); try { showcaseFileService.create(file); fileApiFile.setIdentifier(file.getId().toString()); acceptedFiles.add(fileApiFile); } catch (Exception e) { LOGGER.error("Erreur d'enregistrement du fichier"); } } fileListModel.getObject().addAll(acceptedFiles); target.add(fileListContainer); return acceptedFiles; } @Override protected String getFileUploadUrl() { return FileUploadResource.linkDescriptor().fullUrl(); } @Override protected void onFileUploadDone(AjaxRequestTarget target, List<FileApiFile> successFileList, List<FileApiFile> errorFileList) { if (!errorFileList.isEmpty()) { error(getString("widgets.fileupload.partialError")); } List<FileApiFile> toRemove = Lists.newArrayList(); for (FileApiFile file : errorFileList) { ShowcaseFile showcaseFile = showcaseFileService.getById(Long.valueOf(file.getIdentifier())); for (FileApiFile fileApiFile : fileListModel.getObject()) { if (fileApiFile.getIdentifier() != null && fileApiFile.getIdentifier().equals(fileApiFile.getIdentifier())) { toRemove.add(fileApiFile); } } try { showcaseFileService.delete(showcaseFile); } catch (Exception e) { LOGGER.error("Erreur de nettoyage des fichiers", e); } } fileListModel.getObject().removeAll(toRemove); FeedbackUtils.refreshFeedback(target, getPage()); target.add(fileListContainer); } @Override protected void onFileUploadFails(AjaxRequestTarget target, FileUploadFailType failType, String errorMessage) { error(getString(errorMessage)); for (FileApiFile file : fileListModel.getObject()) { ShowcaseFile showcaseFile = showcaseFileService.getById(Long.valueOf(file.getIdentifier())); try { showcaseFileService.delete(showcaseFile); } catch (Exception e) { LOGGER.error("Erreur de nettoyage des fichiers", e); } } fileListModel.getObject().removeAll(fileListModel.getObject()); FeedbackUtils.refreshFeedback(target, getPage()); target.add(fileListContainer); } }); form.add(fileUpload); fileListContainer.add(fileList); add(progress); add(form); add(fileListContainer); } }