/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.install;
import com.skcraft.concurrency.ProgressObservable;
import com.skcraft.launcher.util.SharedLocale;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.java.Log;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.skcraft.launcher.LauncherUtils.checkInterrupted;
import static com.skcraft.launcher.util.SharedLocale.tr;
@Log
public class Installer implements ProgressObservable {
@Getter private final File tempDir;
private final HttpDownloader downloader;
private InstallTask running;
private int count = 0;
private int finished = 0;
private List<InstallTask> queue = new ArrayList<InstallTask>();
public Installer(@NonNull File tempDir) {
this.tempDir = tempDir;
this.downloader = new HttpDownloader(tempDir);
}
public synchronized void queue(@NonNull InstallTask runnable) {
queue.add(runnable);
count++;
}
public void download() throws IOException, InterruptedException {
downloader.execute();
}
public synchronized void execute() throws Exception {
queue = Collections.unmodifiableList(queue);
try {
for (InstallTask runnable : queue) {
checkInterrupted();
running = runnable;
runnable.execute();
finished++;
}
} finally {
running = null;
}
}
public Downloader getDownloader() {
return downloader;
}
@Override
public double getProgress() {
return finished / (double) count;
}
@Override
public String getStatus() {
InstallTask running = this.running;
if (running != null) {
String status = running.getStatus();
if (status == null) {
status = running.toString();
}
return tr("installer.executing", count - finished) + "\n" + status;
} else {
return SharedLocale.tr("installer.installing");
}
}
}