diff --git a/build.gradle.kts b/build.gradle.kts index 281b392..33d7497 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,6 +12,10 @@ repositories { mavenCentral() } +dependencies { + implementation(group="commons-cli", name="commons-cli", version="1.5.0") +} + fun versionBanner(): String { val os = ByteArrayOutputStream() val devNull = OutputStream.nullOutputStream() @@ -36,8 +40,8 @@ tasks.jar { attributes( "Implementation-Title" to project.name, "Implementation-Version" to project.version, - "Main-Class" to "de.jotoho.waituntil.Main", - "Main-Module" to "de.jotoho.waituntil.main" + "Main-Class" to "de.jotoho.waituntil.Main" + //"Main-Module" to "de.jotoho.waituntil.main" ) } } @@ -45,5 +49,5 @@ tasks.jar { application { // Define the main class for the application. mainClass.set("de.jotoho.waituntil.Main") - mainModule.set("de.jotoho.waituntil.main") + //mainModule.set("de.jotoho.waituntil.main") } 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..e558d67 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,67 @@ 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 keine Uhrzeit angegeben."); + default -> System.err.println("FATAL: No target time was " + + "provided."); + } + System.exit(1); + } else if (userData.length > 1) { + switch (applicationOutputLanguage) { + case GlobalConf.langGerman -> System.err.println("FATAL: " + + "Zu viele Argumente wurden angegeben."); + default -> System.err.println("FATAL: Too many arguments " + + "provided."); + } + 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); } } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java deleted file mode 100644 index 72e6d14..0000000 --- a/src/main/java/module-info.java +++ /dev/null @@ -1,2 +0,0 @@ -module de.jotoho.waituntil.main { -} \ No newline at end of file