/*
* Copyright (C) 2011 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.opendap.ui;
import org.esa.snap.opendap.utils.DAPDownloader;
import javax.swing.SwingWorker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Tonio Fincke
* @author Thomas Storm
*/
class DownloadAction implements ActionListener, DAPDownloader.DownloadContext {
private final Set<DownloadWorker> activeDownloaders = new HashSet<DownloadWorker>();
private final DownloadProgressBarPM pm;
private final ParameterProvider parameterProvider;
private final DownloadHandler downloadHandler;
private int downloadedFilesCount;
private int filesToDownloadCount;
public DownloadAction(DownloadProgressBarPM pm, ParameterProvider parameterProvider,
DownloadHandler downloadHandler) {
this.pm = pm;
this.parameterProvider = parameterProvider;
this.downloadHandler = downloadHandler;
}
@Override
public void actionPerformed(ActionEvent ignored) {
Map<String, Boolean> dapURIs = parameterProvider.getDapURIs();
List<String> fileURIs = parameterProvider.getFileURIs();
parameterProvider.reset();
if (dapURIs.size() == 0 && fileURIs.size() == 0) {
return;
}
File targetDirectory = parameterProvider.getTargetDirectory();
DAPDownloader downloader = new DAPDownloader(dapURIs, fileURIs, this, pm);
if (activeDownloaders.isEmpty()) {
pm.beginTask("", (int) (parameterProvider.getDatasizeInKb()));
pm.worked(0);
pm.resetStartTime();
filesToDownloadCount = dapURIs.size() + fileURIs.size();
} else {
pm.updateTask((int) (parameterProvider.getDatasizeInKb()));
filesToDownloadCount += dapURIs.size() + fileURIs.size();
}
DownloadWorker downloadWorker = new DownloadWorker(downloader, targetDirectory);
downloadWorker.execute();
activeDownloaders.add(downloadWorker);
}
@Override
public int getAllFilesCount() {
return filesToDownloadCount;
}
@Override
public int getAllDownloadedFilesCount() {
return downloadedFilesCount;
}
@Override
public void notifyFileDownloaded(File downloadedFile) {
downloadedFilesCount++;
downloadHandler.handleDownloadFinished(downloadedFile);
}
@Override
public boolean mayOverwrite(String filename) {
return parameterProvider.inquireOverwritePermission(filename);
}
public void cancel() {
for (DownloadWorker activeDownloader : new HashSet<DownloadWorker>(activeDownloaders)) {
activeDownloader.cancel(true);
}
activeDownloaders.clear();
pm.setCanceled(true);
pm.setPreMessage("Download cancelled");
pm.setPostMessage("");
downloadedFilesCount = 0;
}
private class DownloadWorker extends SwingWorker<Void, Void> {
private final DAPDownloader downloader;
private final File targetDirectory;
public DownloadWorker(DAPDownloader downloader, File targetDirectory) {
this.downloader = downloader;
this.targetDirectory = targetDirectory;
}
@Override
protected Void doInBackground() {
try {
downloader.saveProducts(targetDirectory);
} catch (Exception e) {
downloadHandler.handleException(e);
}
return null;
}
@Override
protected void done() {
activeDownloaders.remove(this);
if (activeDownloaders.isEmpty()) {
pm.done();
pm.setPreMessage("All downloads completed");
pm.setPostMessage("");
downloadedFilesCount = 0;
}
}
}
interface ParameterProvider {
void reset();
Map<String, Boolean> getDapURIs();
List<String> getFileURIs();
double getDatasizeInKb();
File getTargetDirectory();
boolean inquireOverwritePermission(String filename);
}
interface DownloadHandler {
void handleException(Exception e);
void handleDownloadFinished(File downloadedFiles);
}
}