package fr.openwide.core.wicket.more.export.file.component; import java.io.File; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.javatuples.LabelValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fr.openwide.core.wicket.more.common.WorkInProgressPopup; import fr.openwide.core.wicket.more.export.file.behavior.FileDeferredDownloadBehavior; import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils; import fr.openwide.core.wicket.more.util.model.Detachables; public abstract class AbstractFileDownloadAjaxLink extends AjaxLink<Void> { private static final long serialVersionUID = 3043111209219249583L; private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileDownloadAjaxLink.class); private final WorkInProgressPopup loadingPopup; private final IModel<LabelValue<String, File>> tempFileInformationModel; private final FileDeferredDownloadBehavior ajaxDownload; public AbstractFileDownloadAjaxLink(String id, WorkInProgressPopup loadingPopup) { super(id); this.loadingPopup = loadingPopup; this.tempFileInformationModel = new Model<LabelValue<String, File>>(); this.ajaxDownload = new FileDeferredDownloadBehavior(tempFileInformationModel); add(ajaxDownload); } @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); loadingPopup.updateAjaxAttributes(attributes); } @Override public void onClick(AjaxRequestTarget target) { try { tempFileInformationModel.setObject(generateFileInformation()); ajaxDownload.initiate(target); target.appendJavaScript(loadingPopup.closeStatement().render()); } catch (Exception e) { tempFileInformationModel.setObject(null); LOGGER.error("Error while downloading a file.", e); error(getString("common.error.unexpected")); } FeedbackUtils.refreshFeedback(target, getPage()); } protected abstract LabelValue<String, File> generateFileInformation(); @Override protected void onDetach() { super.onDetach(); Detachables.detach(tempFileInformationModel); } }