package net.krazyweb.starmodmanager.view; import java.nio.file.Files; import java.nio.file.Paths; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.ReadOnlyStringProperty; import javafx.concurrent.Task; import net.krazyweb.starmodmanager.data.DatabaseFactory; import net.krazyweb.starmodmanager.data.DatabaseModelInterface; import net.krazyweb.starmodmanager.data.LocalizerFactory; import net.krazyweb.starmodmanager.data.LocalizerModelInterface; import net.krazyweb.starmodmanager.data.ModList; import net.krazyweb.starmodmanager.data.Observable; import net.krazyweb.starmodmanager.data.Observer; import net.krazyweb.starmodmanager.data.SettingsFactory; import net.krazyweb.starmodmanager.data.SettingsModelInterface; import net.krazyweb.starmodmanager.dialogue.InputDialogue; import net.krazyweb.starmodmanager.dialogue.MessageDialogue; import net.krazyweb.starmodmanager.dialogue.MessageDialogue.DialogueAction; import net.krazyweb.starmodmanager.dialogue.MessageDialogue.MessageType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class ApplicationLoader implements Observer { @SuppressWarnings("unused") private static final Logger log = LogManager.getLogger(ApplicationLoader.class); private static final double STEP_MULTIPLIER = 1.0 / 5.0; private LoaderView view; private ModList modList; private SettingsModelInterface settings; private DatabaseModelInterface database; private LocalizerModelInterface localizer; public ApplicationLoader() { view = new LoaderView(); view.build(); settings = new SettingsFactory().getInstance(); settings.addObserver(this); configureLogger(); } private void configureLogger() { Task<Void> task = settings.getInitializeLoggerTask(); setProgressProperties(task.progressProperty(), task.messageProperty(), 1); Thread thread = new Thread(task); thread.setDaemon(true); thread.setName("Settings Initialization Thread"); thread.start(); } private void initDatabase() { database = new DatabaseFactory().getInstance(); database.addObserver(this); Task<Void> task = database.getInitializerTask(); setProgressProperties(task.progressProperty(), task.messageProperty(), 2); Thread thread = new Thread(task); thread.setDaemon(true); thread.setName("Database Initialization Thread"); thread.start(); } private void loadSettings() { Task<Void> task = settings.getLoadSettingsTask(); setProgressProperties(task.progressProperty(), task.messageProperty(), 3); Thread thread = new Thread(task); thread.setDaemon(true); thread.setName("Settings Loading Thread"); thread.start(); } private void initializeLocalizer() { localizer = new LocalizerFactory().getInstance(); localizer.addObserver(this); Task<Void> task = localizer.getInitializerTask(); setProgressProperties(task.progressProperty(), task.messageProperty(), 4); Thread thread = new Thread(task); thread.setDaemon(true); thread.setName("Localizer Initialization Thread"); thread.start(); } private void loadModList() { modList = new ModList(new SettingsFactory(), new DatabaseFactory(), new LocalizerFactory()); modList.addObserver(this); Task<Void> task = modList.getLoadTask(); setProgressProperties(task.progressProperty(), task.messageProperty(), 5); Thread thread = new Thread(task); thread.setDaemon(true); thread.setName("Mod List Loading Thread"); thread.start(); } private void completeLoading() { boolean continueLoading = true; if (!settings.getPropertyBoolean("firstruncomplete")) { InputDialogue input = new InputDialogue(localizer.getMessage("inputdialogue.starboundpath"), localizer.getMessage("inputdialogue.starboundpath.title"), MessageType.INFO, localizer); //TODO Verify game path if (input.getResult() == DialogueAction.CLOSED) { MessageDialogue message = new MessageDialogue(localizer.getMessage("applicationloader.mustinputpath"), localizer.getMessage("applicationloader.mustinputpath.title"), MessageType.INFO, localizer); message.getResult(); continueLoading = false; } else { settings.setProperty("starboundpath", Paths.get(input.getInputData())); settings.setProperty("firstruncomplete", true); } } if (!Files.isWritable(Paths.get(""))) { MessageDialogue message = new MessageDialogue(localizer.getMessage("applicationloader.filenotwritable"), localizer.getMessage("applicationloader.filenotwritable.title"), MessageType.INFO, localizer); message.getResult(); continueLoading = false; } settings.removeObserver(this); database.removeObserver(this); localizer.removeObserver(this); modList.removeObserver(this); if (continueLoading) { new MainViewController(modList); } view.close(); } @Override public void update(final Observable observable, final Object data) { if (data instanceof String) { String message = (String) data; switch (message) { case "loggerconfigured": initDatabase(); break; case "databaseinitialized": loadSettings(); break; case "settingsloaded": initializeLocalizer(); break; case "localizerloaded": loadModList(); break; case "modlistupdated": completeLoading(); break; } } } private void setProgressProperties(final ReadOnlyDoubleProperty progress, final ReadOnlyStringProperty message, final int step) { view.getProgressBar().bind(progress.multiply(STEP_MULTIPLIER).add((double) (step - 1) * STEP_MULTIPLIER), 1.0); view.getText().setText("Loading"); } }