From b53e7a617d88f7ec512f8e7befb2aca300ed48ea Mon Sep 17 00:00:00 2001 From: Jonas Tobias Hopusch Date: Sat, 12 Mar 2022 03:16:00 +0100 Subject: [PATCH] Refactor main method to use commons-cli to parse arguments --- .../java/de/jotoho/waituntil/AppOptions.java | 23 ++++ src/main/java/de/jotoho/waituntil/Main.java | 100 ++++++++++-------- 2 files changed, 79 insertions(+), 44 deletions(-) create mode 100644 src/main/java/de/jotoho/waituntil/AppOptions.java diff --git a/src/main/java/de/jotoho/waituntil/AppOptions.java b/src/main/java/de/jotoho/waituntil/AppOptions.java new file mode 100644 index 0000000..83d9412 --- /dev/null +++ b/src/main/java/de/jotoho/waituntil/AppOptions.java @@ -0,0 +1,23 @@ +package de.jotoho.waituntil; + +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; + +final class AppOptions { + // Disable Instance Creation + private AppOptions() {} + + public final static Option help = + Option.builder().argName("h").longOpt("help").desc("Shows this help " + + "message and exits").build(); + public final static Option version = + Option.builder().argName("v").longOpt("version").desc("Shows version information and exits").build(); + + private final static Options options = new Options() + .addOption(help) + .addOption(version); + + public static Options getOptions() { + return options; + } +} diff --git a/src/main/java/de/jotoho/waituntil/Main.java b/src/main/java/de/jotoho/waituntil/Main.java index c160fdc..3380bb2 100644 --- a/src/main/java/de/jotoho/waituntil/Main.java +++ b/src/main/java/de/jotoho/waituntil/Main.java @@ -18,8 +18,8 @@ package de.jotoho.waituntil; along with this program. If not, see . */ -import java.util.HashSet; -import java.util.Map; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.ParseException; import static de.jotoho.waituntil.GlobalConf.applicationOutputLanguage; @@ -28,53 +28,65 @@ import static de.jotoho.waituntil.GlobalConf.applicationOutputLanguage; // Author: Jonas Tobias Hopusch (@jotoho) public final class Main { - public static void main(final String[] args) { - final var optionDictionary = Map.of("-h", "--help", "-v", "--version"); - final var options = new HashSet(); - final var words = new HashSet(); + private static void printVersionInformation() { + final var thisPackage = Main.class.getPackage(); + final var appVersion = thisPackage.getImplementationVersion() != null ? thisPackage.getImplementationVersion() : "version unknown"; + System.out.println("waituntil " + appVersion); + System.out.println(""" - for (final String arg : args) { - if (arg.startsWith("--")) { - options.add(arg.substring(2)); - } else if (arg.startsWith("-")) { - if (optionDictionary.containsKey(arg)) - options.add(optionDictionary.get(arg).substring(2)); - else - System.err.println("Short-hand '$arg' does not exist. Ignoring!"); - } else { - words.add(arg); - } + This program is free software: you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details."""); + } + + private static void printHelpInformation() { + switch (applicationOutputLanguage) { + case GlobalConf.langGerman -> System.out.println("Hilfe kommt noch. (Nicht implementiert)"); + default -> System.out.println("Help is yet to come. (Not implemented)"); } + } - if (options.contains("help")) { - switch (applicationOutputLanguage) { - case GlobalConf.langGerman -> System.out.println("Hilfe kommt noch. (Nicht implementiert)"); - default -> System.out.println("Help is yet to come. (Not implemented)"); - } - } else if (options.contains("version")) { - final var thisPackage = Main.class.getPackage(); - final var appVersion = thisPackage.getImplementationVersion() != null - ? thisPackage.getImplementationVersion() - : "version unknown"; - System.out.println("waituntil " + appVersion); - System.out.println(""" - - This program is free software: you can redistribute it and/or modify it under the terms of the - GNU General Public License as published by the Free Software Foundation, either version 3 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details."""); - } else if (words.size() == 1) { - final var target = TimeCalculator.calculateAndAnnounceTargetTime(words.iterator().next()); - Sleep.waitUntilTimeStamp(target); - } else { - switch (applicationOutputLanguage) { - case GlobalConf.langGerman -> System.err.println("FATAL: Es wurde exact ein nicht-flag Argument erwartet. (" + words.size() + " erhalten)"); - default -> System.err.println("FATAL: Expected one non-flag argument. (Got " + words.size() + ")"); + public static void main(final String[] args) { + try { + final var parsedArguments = + DefaultParser.builder() + .setStripLeadingAndTrailingQuotes(true) + .build() + .parse(AppOptions.getOptions(), args); + + final var userData = parsedArguments.getArgs(); + + if (parsedArguments.hasOption(AppOptions.help)) { + printHelpInformation(); + } else if (parsedArguments.hasOption(AppOptions.version)) { + printVersionInformation(); + } else if (userData.length == 0) { + switch (applicationOutputLanguage) { + case GlobalConf.langGerman -> System.err.println("FATAL: Es wurde exact ein nicht-flag Argument erwartet. (" + userData.length + " erhalten)"); + default -> System.err.println("FATAL: Expected one non-flag argument. (Got " + userData.length + ")"); + } + System.exit(1); + } else if (userData.length > 1) { + switch (applicationOutputLanguage) { + case GlobalConf.langGerman -> System.err.println("FATAL: " + + "Es wurde exact ein nicht-flag Argument erwartet. (" + userData.length + " erhalten)"); + default -> System.err.println("FATAL: Expected one " + + "non-flag argument. (Got " + userData.length + ")"); + } + System.exit(1); + } else { + final var target = + TimeCalculator.calculateAndAnnounceTargetTime(userData[0]); + Sleep.waitUntilTimeStamp(target); } + } catch (final ParseException e) { + System.getLogger("main").log(System.Logger.Level.ERROR, "Parsing " + + "of arguments failed and the program cannot continue.", e); System.exit(1); } }