package kubach.zip;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import kubach.ConfigManager;
import kubach.zip.ExtractWorker.ExtractState;
/**
* Sends auth request and checks result
*
* @author Cr0s
*/
public class ExtractWorker extends SwingWorker<Void, ExtractState> {
public ExtractingDialog ed;
private File pack;
private int totalFiles, filesDone;
private String currentFile;
private final int BUFFER_SIZE = 4096;
public ExtractWorker(ExtractingDialog ed, File pack) {
this.ed = ed;
this.pack = pack;
try {
try (ZipFile zf = new ZipFile(pack)) {
this.totalFiles = zf.size();
System.out.println("[Package] Total files: " + this.totalFiles);
}
} catch (ZipException ex) {
JOptionPane.showMessageDialog(ed, "Failed to extract: " + ex.toString(), "Extracting fail", JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
Logger.getLogger(ExtractWorker.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected Void doInBackground() throws Exception {
File destDirectory = new File(ConfigManager.getInstance().pathToJar);
if (!destDirectory.exists()) {
destDirectory.mkdirs();
}
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(pack))) {
ZipEntry entry = zipIn.getNextEntry();
// iterates over entries in the zip file
while (entry != null) {
String filePath = destDirectory + File.separator + entry.getName();
if (!entry.isDirectory()) {
this.currentFile = entry.getName();
publish(new ExtractState(this.currentFile, this.totalFiles, this.filesDone++));
// if the entry is a file, extracts it
extractFile(zipIn, filePath);
} else {
// if the entry is a directory, make the directory
File dir = new File(filePath);
dir.mkdirs();
this.currentFile = "creating dir: " + dir.getName();
publish(new ExtractState(this.currentFile, this.totalFiles, ++this.filesDone));
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
}
publish(new ExtractState(this.currentFile, this.totalFiles, this.totalFiles));
return null;
}
/**
* Extracts a zip entry (file entry)
*
* @param zipIn
* @param filePath
* @throws IOException
*/
private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath))) {
byte[] bytesIn = new byte[BUFFER_SIZE];
int read;
while ((read = zipIn.read(bytesIn)) != -1) {
bos.write(bytesIn, 0, read);
}
}
}
class ExtractState {
public String currentFile;
public int totalNumFiles;
public int filesDone;
public ExtractState(String currentFile, int totalNumFiles, int filesDone) {
this.currentFile = currentFile;
this.totalNumFiles = totalNumFiles;
this.filesDone = filesDone;
}
}
@Override
protected void process(List<ExtractState> l) {
for (ExtractState es : l) {
this.ed.updateState(es);
}
}
}