package me.stieglmaier.sphereMiners.main; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.net.MalformedURLException; import java.util.Map; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; import me.stieglmaier.sphereMiners.controller.ViewController; import me.stieglmaier.sphereMiners.model.Model; import me.stieglmaier.sphereMiners.model.ai.AIManager; import me.stieglmaier.sphereMiners.model.physics.Physics; import me.stieglmaier.sphereMiners.view.ErrorPopup; import org.sosy_lab.common.configuration.Configuration; import org.sosy_lab.common.configuration.InvalidConfigurationException; import org.sosy_lab.common.configuration.OptionCollector; import org.sosy_lab.common.log.BasicLogManager; import org.sosy_lab.common.log.LogManager; import com.google.common.base.Optional; /** * Main class of the program. Creates the model and the View in a new Thread and * adds the View as Observer to the model. */ public class SphereMiners extends Application { /** * Launches the application. * * @param args used for either printing or setting configuration options */ public static void main(final String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws IOException { Optional<Configuration> config = handleOptions(); if (!config.isPresent()) { // platform should be exited by handleOptions anyway return; } primaryStage.setTitle("Sphere Miners"); FXMLLoader loader = new FXMLLoader(getClass().getResource("Overview.fxml")); primaryStage.setScene(new Scene(loader.load())); primaryStage.setMinWidth(1280); primaryStage.setMinHeight(900); ViewController controller = (ViewController) loader.getController(); final Model model; final AIManager ais; final Constants constants; final LogManager logger; try { logger = new BasicLogManager(config.get()); constants = new Constants(config.get(), logger); ais = new AIManager(constants); model = new Model(new Physics(constants), ais, constants, (l -> controller.removeBadAis(l))); } catch (MalformedURLException e) { ErrorPopup.create("AI Location is invalid please check your config file!", e.getMessage(), e); return; } catch (InvalidConfigurationException e) { ErrorPopup.create( "Configuration is invalid, please check your config file!", e.getMessage(), e); return; } controller.setConstants(constants); controller.setAIList(model.getAIList()); controller.setListeners( aisToPlay -> model.simulateGame(aisToPlay), () -> model.pauseSimulation(), () -> model.deleteSimulation(), () -> ais.reloadAIList()); primaryStage.show(); } private Optional<Configuration> handleOptions() { Map<String, String> params = getParameters().getNamed(); Configuration config; // cmdline parameter to retrieve configuration options if (params.containsKey("printOptionsTo")) { try { new FileWriter(new File(params.get("printOptionsTo")), false) .append(OptionCollector.getCollectedOptions(false)) .close(); } catch (IOException e) { System.err.println( "Configuration Options file could not be written please recheck the given path."); } Platform.exit(); return Optional.absent(); } else if (params.containsKey("config")) { try { config = Configuration.builder().loadFromFile(params.get("config")).build(); } catch (InvalidConfigurationException | IOException e) { System.err.println( "Given configuration could not be parsed, now falling back to standard configuration." + "\n See the stacktrace for more information:"); e.printStackTrace(System.err); config = Configuration.defaultConfiguration(); } } else { config = Configuration.defaultConfiguration(); } return Optional.of(config); } }