From e5877c8a34223e2490ac6e4573082cdedb8bca79 Mon Sep 17 00:00:00 2001 From: Nathan McRae Date: Mon, 27 Jan 2025 14:50:43 -0800 Subject: [PATCH] Get registering and running task scheduler task working --- src/main/java/build.ps1 | 1 + .../name/nathanmcrae/numbersstation/Main.java | 50 ++++++- .../numbersstation/MainController.java | 52 ++------ .../numbersstation/MainSettings.java | 37 ++++++ .../MainSettingsController.java | 9 ++ .../numbersstation/MainSettingsView.fxml | 12 +- .../numbersstation/WindowsScheduler.java | 122 ++++++++++++++++-- src/main/java/run.ps1 | 1 + 8 files changed, 223 insertions(+), 61 deletions(-) diff --git a/src/main/java/build.ps1 b/src/main/java/build.ps1 index c7a1702..e9d5d10 100644 --- a/src/main/java/build.ps1 +++ b/src/main/java/build.ps1 @@ -7,6 +7,7 @@ $modules = $( "com.fasterxml.jackson.core", "com.fasterxml.jackson.dataformat.xml", "com.fasterxml.jackson.datatype.jsr310", + "result", "javafx.controls", "javafx.fxml", "org.apache.commons.cli" diff --git a/src/main/java/name/nathanmcrae/numbersstation/Main.java b/src/main/java/name/nathanmcrae/numbersstation/Main.java index b9c095d..a713596 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/Main.java +++ b/src/main/java/name/nathanmcrae/numbersstation/Main.java @@ -1,5 +1,7 @@ package name.nathanmcrae.numbersstation; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -21,7 +23,7 @@ public class Main extends Application { private static final String VERSION = "0.0.1"; private static Path statePath = null; - public Path getStatePath() { + public static Path getStatePath() { if (statePath == null) { String stateHome = System.getenv("XDG_STATE_HOME"); if (stateHome == null || stateHome.isEmpty() || !Paths.get(stateHome).isAbsolute()) { @@ -37,7 +39,6 @@ public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { - setupLogger(); Parent root = FXMLLoader.load(getClass().getResource("MainView.fxml")); primaryStage.setTitle("Numbers Station"); primaryStage.setScene(new Scene(root)); @@ -45,7 +46,7 @@ public class Main extends Application { logger.info("Application started"); } - private void setupLogger() { + private static void setupLogger() { try { Path logFile = getStatePath().resolve("main.log"); @@ -61,7 +62,7 @@ public class Main extends Application { } } - private static void parseArguments(String[] args) { + private static String parseArguments(String[] args) { Options options = new Options(); Option help = new Option("h", "help", false, "Show help"); @@ -99,10 +100,12 @@ public class Main extends Application { formatter.printHelp("numbers-station", options); System.exit(1); } + + return stationName; } public static void main(String[] args) { - parseArguments(args); + String stationName = parseArguments(args); Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { logger.log(Level.SEVERE, "Unhandled exception caught", throwable); @@ -113,6 +116,41 @@ public class Main extends Application { logger.log(Level.SEVERE, "Unhandled exception in JavaFX application thread", throwable); }); - launch(args); + setupLogger(); + + if (stationName != null) { + // TODO: errors in runStation should trigger a notification + runStation(stationName); + } else { + launch(args); + } + } + + public static void runStation(String stationName) { + if (stationName == null || stationName == "") { + logger.log(Level.SEVERE, "Station name must be provided and not empty"); + System.exit(1); + } + + Result result = MainSettings.load(); + if (!result.hasSuccess()) { + logger.log(Level.SEVERE, "Unable to load settings"); + System.exit(1); + } + MainSettings settings = result.getSuccess().get(); + + StationSettings loadedStation = settings.getStations().stream() + .filter(station -> station.getName().equals(stationName)) + .findFirst() + .orElse(null); + + if (loadedStation == null) { + logger.log(Level.SEVERE, "Unable to find station " + stationName); + System.exit(1); + } + + logger.info("Loaded station " + stationName); + + System.exit(0); } } diff --git a/src/main/java/name/nathanmcrae/numbersstation/MainController.java b/src/main/java/name/nathanmcrae/numbersstation/MainController.java index 1656506..57a847c 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/MainController.java +++ b/src/main/java/name/nathanmcrae/numbersstation/MainController.java @@ -1,9 +1,7 @@ package name.nathanmcrae.numbersstation; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; import java.io.File; import java.io.IOException; import java.net.URL; @@ -118,46 +116,24 @@ public class MainController implements Initializable { } } - private void loadSettings() throws IOException { - XmlMapper xmlMapper = new XmlMapper(); - xmlMapper.registerModule(new JavaTimeModule()); - String userHome = System.getProperty("user.home"); - - Path filePath = MainSettings.getSettingsFilePath(); - Path directoryPath = filePath.getParent(); - try { - if (!Files.exists(directoryPath)) { - Files.createDirectories(directoryPath); - } - - if (!Files.exists(filePath)) { - settings = new MainSettings(); - - xmlMapper.writeValue(new File(filePath.toString()), settings); - } else { - settings = xmlMapper.readValue(new File(filePath.toString()), MainSettings.class); - for (StationSettings station : settings.getStations()) { - if (station.getDigitsPerGroup() == 0) { - station.setDigitsPerGroup(4); - } - } - } - } catch (IOException e) { - logger.log(Level.SEVERE, "Failed to load settings from " + filePath.toString(), e); - System.out.println("File contents: " + Files.readString(filePath)); - } - } - @Override public void initialize(URL location, ResourceBundle resources) { stationNameField.textProperty().bindBidirectional(selectedStationName); - try { - loadSettings(); - } catch (IOException e) { - e.printStackTrace(); + Result result = MainSettings.load(); + if (!result.hasSuccess()) { + // TODO: on failure, prompt user to re-initialize settings + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Settings load error"); + alert.setHeaderText(null); + alert.setContentText("Unable to load settings file"); + alert.showAndWait(); + + return; } + settings = result.getSuccess().get(); + selectedStationName.set(settings.getSelectedStationName()); if (selectedStationName.get() == null || selectedStationName.get() == "") { diff --git a/src/main/java/name/nathanmcrae/numbersstation/MainSettings.java b/src/main/java/name/nathanmcrae/numbersstation/MainSettings.java index 8f704c5..b1518ef 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/MainSettings.java +++ b/src/main/java/name/nathanmcrae/numbersstation/MainSettings.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.leakyabstractions.result.api.Result; +import com.leakyabstractions.result.core.Results; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -12,6 +14,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.logging.Logger; +import java.util.logging.Level; public class MainSettings { private static final Logger logger = Logger.getLogger(Main.class.getName()); @@ -71,6 +74,40 @@ public class MainSettings { this.selectedStationName = selectedStationName; } + public static Result load() { + XmlMapper xmlMapper = new XmlMapper(); + xmlMapper.registerModule(new JavaTimeModule()); + String userHome = System.getProperty("user.home"); + + MainSettings settings; + + Path filePath = MainSettings.getSettingsFilePath(); + Path directoryPath = filePath.getParent(); + try { + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + + if (!Files.exists(filePath)) { + settings = new MainSettings(); + + xmlMapper.writeValue(new File(filePath.toString()), settings); + } else { + settings = xmlMapper.readValue(new File(filePath.toString()), MainSettings.class); + for (StationSettings station : settings.getStations()) { + if (station.getDigitsPerGroup() == 0) { + station.setDigitsPerGroup(4); + } + } + } + } catch (IOException e) { + logger.log(Level.SEVERE, "Failed to load settings from " + filePath.toString(), e); + return Results.failure(e); + } + + return Results.success(settings); + } + public void save() { XmlMapper xmlMapper = new XmlMapper(); xmlMapper.registerModule(new JavaTimeModule()); diff --git a/src/main/java/name/nathanmcrae/numbersstation/MainSettingsController.java b/src/main/java/name/nathanmcrae/numbersstation/MainSettingsController.java index 562401c..6a8e834 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/MainSettingsController.java +++ b/src/main/java/name/nathanmcrae/numbersstation/MainSettingsController.java @@ -397,9 +397,18 @@ public class MainSettingsController { @FXML private void handleTestConnectionButtonPress() { + } + + @FXML + private void handleTestRegisterScheduleButtonPress() { WindowsScheduler.registerSchedule(settings); } + @FXML + private void handleTestRunScheduleButtonPress() { + WindowsScheduler.runSchedule(settings); + } + public StringProperty stationAddressProperty() { return stationAddress; } diff --git a/src/main/java/name/nathanmcrae/numbersstation/MainSettingsView.fxml b/src/main/java/name/nathanmcrae/numbersstation/MainSettingsView.fxml index c04845c..a02e25c 100644 --- a/src/main/java/name/nathanmcrae/numbersstation/MainSettingsView.fxml +++ b/src/main/java/name/nathanmcrae/numbersstation/MainSettingsView.fxml @@ -133,25 +133,27 @@ - + - + - + - +