package net.krazyweb.starmodmanager.data; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import javafx.concurrent.Task; import javafx.concurrent.WorkerStateEvent; import javafx.event.EventHandler; import net.krazyweb.helpers.FileHelper; import net.krazyweb.starmodmanager.dialogue.MessageDialogue; import net.krazyweb.starmodmanager.dialogue.MessageDialogue.MessageType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class GetNewModsTask extends Task<Void> { private static final Logger log = LogManager.getLogger(GetNewModsTask.class); private Set<Path> files; private SettingsModelInterface settings; private LocalizerModelInterface localizer; private ModList modList; protected GetNewModsTask(final ModList modList) { this.modList = modList; settings = new SettingsFactory().getInstance(); localizer = new LocalizerFactory().getInstance(); setOnSucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(final WorkerStateEvent event) { modList.addMods(new ArrayList<>(files)); } }); setOnFailed(new EventHandler<WorkerStateEvent>() { @Override public void handle(final WorkerStateEvent event) { log.error("", getException()); MessageDialogue dialogue = new MessageDialogue(localizer.getMessage("newmodstask.error"), localizer.getMessage("newmodstask.error.title"), MessageType.ERROR, new LocalizerFactory()); dialogue.getResult(); } }); } @Override protected Void call() throws Exception { // TODO Remove mods from database when archive has been deleted this.updateMessage("Loading Mod List"); this.updateProgress(0.0, 1.0); files = new HashSet<>(); FileHelper.listFiles(settings.getPropertyPath("modsdir"), files); Set<Path> toRemove = new HashSet<>(); for (Path p : files) { for (Mod m : modList.getMods()) { if (Files.isSameFile(settings.getPropertyPath("modsdir").resolve(m.getArchiveName()), p)) { toRemove.add(p); } } } files.removeAll(toRemove); this.updateProgress(1.0, 1.0); /* * This gives the UI thread time to visually update to 100% * before the dialogue closes without adding noticeable time * to the loading process. */ Thread.sleep(15); return null; } }