package fr.openwide.core.showcase.web.application.widgets.component;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.RandomUtils;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.springframework.cglib.proxy.UndeclaredThrowableException;
import de.schlichtherle.truezip.file.TFile;
import fr.openwide.core.commons.util.mime.MediaType;
import fr.openwide.core.commons.util.registry.TFileRegistry;
import fr.openwide.core.spring.property.SpringPropertyIds;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.more.common.WorkInProgressPopup;
import fr.openwide.core.wicket.more.export.file.component.SimpleFileDownloadAjaxLink;
public class FileDownloadPanel extends Panel {
private static final long serialVersionUID = 4147662803478838954L;
@SpringBean
private IPropertyService propertyService;
private Map<TFile, Map<String, Long>> doublons = new HashMap<>();
public FileDownloadPanel(String id) {
super(id);
WorkInProgressPopup loadingPopup = new WorkInProgressPopup("exportZipLoadingPopup", new ResourceModel("common.action.export.zip.loading"));
add(
loadingPopup,
new SimpleFileDownloadAjaxLink("exportZip", loadingPopup, "export-showcase-", MediaType.APPLICATION_ZIP) {
private static final long serialVersionUID = 1L;
@Override
protected File generateFile() {
return generateTFile();
}
}
);
}
/*
* If you want to use TFileRegistry you must add {@link TFileZipFileFilter} in your web.xml file
*/
public TFile generateTFile() {
TFile archiveFile = null;
try {
archiveFile = new TFile(propertyService.getAsString(SpringPropertyIds.TMP_PATH) + "/mon_archive" + "." + RandomUtils.nextLong(0l, Long.MAX_VALUE) + "." + MediaType.APPLICATION_ZIP.extension()).mkdir(true);
// ------ dossier1 ------ //
TFile dossier1 = TFileRegistry.create(archiveFile, "Dossier1").mkdir(true);
// ---- dossier11 ----
TFile dossier11 = TFileRegistry.create(dossier1, "Dossier11").mkdir(true);
File file = File.createTempFile("file", ".txt");
copyFileIfNotNull(file, dossier11);
// ---- dossier12 ----
TFileRegistry.create(dossier1, "Dossier12").mkdir(true);
// ---- dossier2 ----
TFile dossier2 = TFileRegistry.create(archiveFile, "Dossier2").mkdir(true);
// ---- dossier21 ----
TFileRegistry.create(dossier2, "Dossier21").mkdir(true);
} catch (IOException e) {
throw new UndeclaredThrowableException(e);
}
return archiveFile.toNonArchiveFile();
}
private void copyFileIfNotNull(File file, TFile destination) throws IOException {
if (file != null) {
TFile src = TFileRegistry.create(file);
String fileName = file.getName();
TFile doublon = TFileRegistry.create(destination, fileName);
if (doublon.exists()) {
if (!doublons.containsKey(destination)) {
doublons.put(destination, new HashMap<String, Long>());
}
if (doublons.get(destination).containsKey(fileName)) {
doublons.get(destination).put(fileName, doublons.get(destination).get(fileName)+1L);
} else {
doublons.get(destination).put(fileName, 1L);
}
fileName = fileName + "(" + doublons.get(destination).get(fileName) + ")";
}
TFile dst = TFileRegistry.create(destination);
if (dst.isArchive() || dst.isDirectory()) {
dst = TFileRegistry.create(dst, fileName);
}
src.cp_rp(dst);
}
}
}