package ilarkesto.io;
import ilarkesto.base.Str;
import ilarkesto.concurrent.ATask;
import ilarkesto.core.logging.Log;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
public class ZipTask extends ATask {
private static final Log LOG = Log.get(ZipTask.class);
private File currentFile;
private List<Failure> failures;
private int fileCount;
// --- dependencies ---
private File zipfile;
private File[] files;
private FileFilter filter;
private int estimatedFileCount;
public ZipTask(File zipfile, File... files) {
this.zipfile = zipfile;
this.files = files;
}
public void setFilter(FileFilter filter) {
this.filter = filter;
}
public void setEstimatedFileCount(int count) {
this.estimatedFileCount = count;
}
// --- ---
@Override
protected void perform() {
failures = new ArrayList<Failure>();
LOG.debug("Zipping", zipfile.getPath(), " -> ", files);
IO.zip(zipfile, files, filter, new Observer());
}
@Override
public float getProgress() {
return estimatedFileCount == 0 ? super.getProgress() : (float) fileCount / (float) estimatedFileCount;
}
@Override
public String getProgressMessage() {
return currentFile == null ? null : currentFile.getName();
}
class Observer implements IO.ZipObserver {
public boolean isAbortRequested() {
return ZipTask.this.isAbortRequested();
}
public void onFileBegin(File f) {
currentFile = f;
}
public void onFileEnd(File f) {
fileCount++;
currentFile = null;
}
public void onFileError(File f, Throwable ex) {
Failure failure = new Failure(f, ex);
failures.add(failure);
LOG.debug(failure);
}
}
public List<Failure> getFailures() {
return failures;
}
public int getFileCount() {
return fileCount;
}
public static class Failure {
private File file;
private Throwable exception;
public Failure(File file, Throwable ex) {
this.file = file;
this.exception = ex;
}
public File getFile() {
return file;
}
public Throwable getException() {
return exception;
}
@Override
public String toString() {
return file.getName() + ": " + Str.getRootCauseMessage(exception);
}
}
}