package fr.openwide.core.wicket.more.export.excel.component;
import static fr.openwide.core.spring.property.SpringPropertyIds.TMP_EXPORT_EXCEL_PATH;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.commons.util.mime.MediaType;
import fr.openwide.core.jpa.exception.ServiceException;
import fr.openwide.core.spring.property.service.IPropertyService;
import fr.openwide.core.wicket.more.export.file.behavior.FileDeferredDownloadBehavior;
import fr.openwide.core.wicket.more.export.util.ExportFileUtils;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.util.model.Detachables;
public abstract class AbstractExcelExportAjaxSubmitLink extends AjaxSubmitLink {
private static final long serialVersionUID = -3122955700569654875L;
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractExcelExportAjaxSubmitLink.class);
@SpringBean
private IPropertyService propertyService;
private final ExcelExportWorkInProgressModalPopupPanel loadingPopup;
private final FileDeferredDownloadBehavior ajaxDownload;
private final IModel<File> tempFileModel = new Model<File>();
private final IModel<MediaType> mediaTypeModel = new Model<MediaType>();
public AbstractExcelExportAjaxSubmitLink(String id, Form<?> form, ExcelExportWorkInProgressModalPopupPanel loadingPopup, String fileNamePrefix) {
this(id, form, loadingPopup, Model.of(fileNamePrefix));
}
public AbstractExcelExportAjaxSubmitLink(String id, Form<?> form, ExcelExportWorkInProgressModalPopupPanel loadingPopup, IModel<String> fileNamePrefixModel) {
super(id, form);
this.loadingPopup = loadingPopup;
this.ajaxDownload = new FileDeferredDownloadBehavior(tempFileModel, ExportFileUtils.getFileNameMediaTypeModel(fileNamePrefixModel, mediaTypeModel));
add(ajaxDownload);
}
protected MediaType getMediaType(Workbook workbook) {
if (workbook instanceof HSSFWorkbook) {
return MediaType.APPLICATION_MS_EXCEL;
} else if (workbook instanceof XSSFWorkbook) {
return MediaType.APPLICATION_OPENXML_EXCEL;
} else if (workbook instanceof SXSSFWorkbook) {
return MediaType.APPLICATION_OPENXML_EXCEL;
} else {
// Default
return MediaType.APPLICATION_MS_EXCEL;
}
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
loadingPopup.updateAjaxAttributes(attributes);
}
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
boolean hasError = false;
File tmp = null;
try {
Workbook workbook = generateWorkbook();
if (workbook.getNumberOfSheets() == 0) {
onEmptyExport(workbook);
hasError = true;
} else {
mediaTypeModel.setObject(getMediaType(workbook));
tmp = File.createTempFile("export-", "", propertyService.get(TMP_EXPORT_EXCEL_PATH));
tempFileModel.setObject(tmp);
FileOutputStream output = new FileOutputStream(tmp);
workbook.write(output);
output.close();
}
} catch (Exception e) {
LOGGER.error("Erreur en générant un fichier Excel.", e);
hasError = true;
FileUtils.deleteQuietly(tmp);
tempFileModel.setObject(null);
error(getString("common.error.unexpected"));
}
FeedbackUtils.refreshFeedback(target, getPage());
target.appendJavaScript(loadingPopup.closeStatement().render());
if (!hasError) {
ajaxDownload.initiate(target);
}
onAfterSubmit(target, hasError);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
target.appendJavaScript(loadingPopup.closeStatement().render());
}
protected void onAfterSubmit(AjaxRequestTarget target, boolean hasError) {
// Nothing
}
protected void onEmptyExport(Workbook workbook) {
error(getString("common.error.export.empty"));
}
protected abstract Workbook generateWorkbook() throws ServiceException;
@Override
protected void onDetach() {
super.onDetach();
Detachables.detach(tempFileModel, mediaTypeModel);
}
}