Compare commits

..

No commits in common. "240a3784ed5f71d460342549d2ed6cb112704a69" and "a7882ab201fce841c3b5aa0a6937d7f200616f2c" have entirely different histories.

9 changed files with 61 additions and 214 deletions

3
.gitignore vendored
View file

@ -37,6 +37,5 @@ gradlew.bat
# Ignore manual compilation results # Ignore manual compilation results
/de/jotoho/ /de/jotoho/
/META-INF /META-INF
/.idea/* /.idea
!/.idea/codeStyles/
*.zst *.zst

View file

@ -1,78 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="LINE_SEPARATOR" value="&#10;" />
<option name="RIGHT_MARGIN" value="80" />
<option name="WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN" value="true" />
<option name="ENABLE_SECOND_REFORMAT" value="true" />
<option name="SOFT_MARGINS" value="80" />
<JavaCodeStyleSettings>
<option name="ANNOTATION_PARAMETER_WRAP" value="5" />
<option name="ALIGN_MULTILINE_ANNOTATION_PARAMETERS" value="true" />
<option name="ALIGN_MULTILINE_TEXT_BLOCKS" value="true" />
<option name="NEW_LINE_AFTER_LPAREN_IN_RECORD_HEADER" value="true" />
<option name="RPAREN_ON_NEW_LINE_IN_RECORD_HEADER" value="true" />
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="CONTINUATION_INDENT_IN_PARAMETER_LISTS" value="false" />
<option name="CONTINUATION_INDENT_IN_ARGUMENT_LISTS" value="false" />
<option name="CONTINUATION_INDENT_FOR_CHAINED_CALLS" value="false" />
<option name="CONTINUATION_INDENT_IN_SUPERTYPE_LISTS" value="false" />
<option name="WRAP_EXPRESSION_BODY_FUNCTIONS" value="1" />
</JetCodeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BETWEEN_PACKAGE_DECLARATION_AND_HEADER" value="0" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
<option name="ALIGN_MULTILINE_CHAINED_METHODS" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
<option name="ALIGN_MULTILINE_ASSIGNMENT" value="true" />
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" />
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
<option name="CALL_PARAMETERS_WRAP" value="5" />
<option name="METHOD_PARAMETERS_WRAP" value="5" />
<option name="RESOURCE_LIST_WRAP" value="5" />
<option name="EXTENDS_LIST_WRAP" value="1" />
<option name="THROWS_LIST_WRAP" value="1" />
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
<option name="THROWS_KEYWORD_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="2" />
<option name="WRAP_FIRST_METHOD_IN_CALL_CHAIN" value="true" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="TERNARY_OPERATION_WRAP" value="5" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="KEEP_SIMPLE_BLOCKS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" />
<option name="FOR_STATEMENT_WRAP" value="5" />
<option name="ARRAY_INITIALIZER_WRAP" value="5" />
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
<option name="ASSIGNMENT_WRAP" value="5" />
<option name="ASSERT_STATEMENT_WRAP" value="1" />
<option name="WRAP_LONG_LINES" value="true" />
<option name="PARAMETER_ANNOTATION_WRAP" value="5" />
<option name="VARIABLE_ANNOTATION_WRAP" value="5" />
<option name="ENUM_CONSTANTS_WRAP" value="5" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" />
<option name="CALL_PARAMETERS_WRAP" value="5" />
<option name="METHOD_PARAMETERS_WRAP" value="5" />
<option name="EXTENDS_LIST_WRAP" value="5" />
<option name="METHOD_CALL_CHAIN_WRAP" value="5" />
<option name="ASSIGNMENT_WRAP" value="5" />
<option name="PARAMETER_ANNOTATION_WRAP" value="5" />
<option name="VARIABLE_ANNOTATION_WRAP" value="5" />
<option name="ENUM_CONSTANTS_WRAP" value="5" />
</codeStyleSettings>
</code_scheme>
</component>

View file

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View file

@ -6,7 +6,7 @@ plugins {
application application
java java
id("com.github.johnrengelman.shadow") version "7.1.2" id ("com.github.johnrengelman.shadow") version "7.1.2"
} }
repositories { repositories {
@ -15,9 +15,7 @@ repositories {
} }
dependencies { dependencies {
implementation(group = "commons-cli", implementation(group="commons-cli", name="commons-cli", version="1.5.0")
name = "commons-cli",
version = "1.5.0")
} }
fun versionBanner(): String { fun versionBanner(): String {
@ -40,9 +38,10 @@ java {
tasks.jar { tasks.jar {
manifest { manifest {
attributes("Implementation-Title" to project.name, attributes(
"Implementation-Version" to project.version, "Implementation-Title" to project.name,
"Main-Class" to "de.jotoho.waituntil.Main" "Implementation-Version" to project.version,
"Main-Class" to "de.jotoho.waituntil.Main"
//"Main-Module" to "de.jotoho.waituntil.main" //"Main-Module" to "de.jotoho.waituntil.main"
) )
} }

View file

@ -22,21 +22,14 @@ import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options; import org.apache.commons.cli.Options;
final class AppOptions { final class AppOptions {
public final Option help = Option public final static Option help = Option.builder().argName("h").longOpt("help").desc("Shows this help " + "message and exits").build();
.builder() public final static Option version = Option.builder().argName("v").longOpt("version").desc("Shows version information and exits").build();
.argName("h") private final static Options options = new Options().addOption(help).addOption(version);
.longOpt("help")
.desc("Shows this help " + "message and exits")
.build();
public final Option version = Option // Disable Instance Creation
.builder() private AppOptions() {}
.argName("v")
.longOpt("version")
.desc("Shows version information and exits")
.build();
public final Options options = new Options() public static Options getOptions() {
.addOption(help) return options;
.addOption(version); }
} }

View file

@ -22,12 +22,5 @@ import java.util.Locale;
public record GlobalConf() { public record GlobalConf() {
public static final String langGerman = "de"; public static final String langGerman = "de";
public static final String applicationOutputLanguage = (Locale public static final String applicationOutputLanguage = (Locale.getDefault().getLanguage().equals(Locale.GERMAN.getLanguage())) ? Locale.GERMAN.getLanguage() : Locale.ENGLISH.getLanguage();
.getDefault()
.getLanguage()
.equals(Locale.GERMAN.getLanguage()))
?
Locale.GERMAN.getLanguage()
:
Locale.ENGLISH.getLanguage();
} }

View file

@ -18,16 +18,13 @@ package de.jotoho.waituntil;
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import static de.jotoho.waituntil.GlobalConf.applicationOutputLanguage; import static de.jotoho.waituntil.GlobalConf.applicationOutputLanguage;
import static java.lang.System.Logger.Level; import static java.lang.System.Logger.Level;
// This file contains the main function and other utility function necessary // This file contains the main function and other utility function necessary for interpreting the terminal arguments.
// for interpreting the terminal arguments.
// See README.md and LICENSE.md for license information // See README.md and LICENSE.md for license information
// Author: Jonas Tobias Hopusch (@jotoho) // Author: Jonas Tobias Hopusch (@jotoho)
@ -36,96 +33,55 @@ public final class Main {
private static void printVersionInformation() { private static void printVersionInformation() {
final var thisPackage = Main.class.getPackage(); final var thisPackage = Main.class.getPackage();
final var final var appVersion = thisPackage.getImplementationVersion() != null ? thisPackage.getImplementationVersion() : "version unknown";
appVersion =
thisPackage.getImplementationVersion() != null
? thisPackage.getImplementationVersion()
: "version unknown";
System.out.println("waituntil " + appVersion); System.out.println("waituntil " + appVersion);
System.out.println(""" System.out.println("""
Project Repository: https://gitea.jotoho.de/jotoho/waituntil Project Repository: https://gitea.jotoho.de/jotoho/waituntil
This program is free software: you can redistribute it and/or modify it under the terms of the 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 GNU General Public License as published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version. License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 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. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details."""); See the GNU General Public License for more details.""");
} }
private static void printHelpInformation() { private static void printHelpInformation() {
switch (applicationOutputLanguage) { switch (applicationOutputLanguage) {
case GlobalConf.langGerman -> logger.log(Level.ERROR, case GlobalConf.langGerman -> logger.log(Level.ERROR, "Hilfe kommt noch. (Nicht implementiert)");
"Hilfe " + default -> logger.log(Level.ERROR, "Help is yet to come. (Not implemented)");
"kommt noch. (Nicht " +
"implementiert)");
default -> logger.log(Level.ERROR,
"Help is yet to come. (Not " +
"implemented)");
} }
} }
private static CommandLine parseArgs(final Options options, public static void main(final String[] args) {
final String[] args)
throws ParseException {
return DefaultParser
.builder()
.setStripLeadingAndTrailingQuotes(true)
.build()
.parse(options, args);
}
public synchronized static void main(final String[] args) {
// Retrieve defined CLI options
final var appOptions = new AppOptions();
try { try {
// Parse CLI final var parsedArguments = DefaultParser.builder().setStripLeadingAndTrailingQuotes(true).build().parse(AppOptions.getOptions(), args);
final var parsedArguments = parseArgs(appOptions.options, args);
final var userData = parsedArguments.getArgs(); final var userData = parsedArguments.getArgs();
// Differentiate between usage scenarios if (parsedArguments.hasOption(AppOptions.help)) {
if (parsedArguments.hasOption(appOptions.help)) {
printHelpInformation(); printHelpInformation();
} else if (parsedArguments.hasOption(appOptions.version)) { } else if (parsedArguments.hasOption(AppOptions.version)) {
printVersionInformation(); printVersionInformation();
} else if (userData.length == 0) { } else if (userData.length == 0) {
switch (applicationOutputLanguage) { switch (applicationOutputLanguage) {
case GlobalConf.langGerman -> logger.log(Level.ERROR, case GlobalConf.langGerman -> logger.log(Level.ERROR, "Es wurde keine Uhrzeit angegeben.");
"Es" + default -> logger.log(Level.ERROR, "No target time" + " was " + "provided.");
" wurde keine " +
"Uhrzeit " +
"angegeben.");
default -> logger.log(Level.ERROR,
"No target time was " + "provided.");
} }
System.exit(1); System.exit(1);
} else if (userData.length > 1) { } else if (userData.length > 1) {
switch (applicationOutputLanguage) { switch (applicationOutputLanguage) {
case GlobalConf.langGerman -> logger.log(Level.ERROR, case GlobalConf.langGerman -> logger.log(Level.ERROR, "Zu viele Argumente wurden angegeben.");
"Zu" + " viele " + default -> logger.log(Level.ERROR, "Too many arguments " + "provided.");
"Argumente " +
"wurden " +
"angegeben.");
default -> logger.log(Level.ERROR,
"Too many arguments " + "provided.");
} }
System.exit(1); System.exit(1);
} else { } else {
final var final var target = TimeCalculator.calculateAndAnnounceTargetTime(userData[0]);
target =
TimeCalculator.calculateAndAnnounceTargetTime(userData[0]);
Sleep.waitUntilTimeStamp(target); Sleep.waitUntilTimeStamp(target);
} }
} catch (final ParseException e) { } catch (final ParseException e) {
System System.getLogger("main").log(Level.ERROR, "Parsing " + "of arguments failed and the program cannot continue.", e);
.getLogger("main")
.log(Level.ERROR,
"Parsing of arguments " +
"failed and the program cannot " + "continue.",
e);
System.exit(1); System.exit(1);
} }
} }

View file

@ -30,19 +30,14 @@ import static java.lang.System.Logger.Level;
public final class Sleep { public final class Sleep {
public static void waitUntilTimeStamp(ZonedDateTime timestamp) { public static void waitUntilTimeStamp(ZonedDateTime timestamp) {
try { try {
Thread.sleep(Math.max(0, Thread.sleep(Math.max(0, Instant.now().until(timestamp, ChronoUnit.MILLIS)));
Instant
.now()
.until(timestamp, ChronoUnit.MILLIS)));
} catch (final InterruptedException ignored) { } catch (final InterruptedException ignored) {
} }
final String formattedTimeStamp = DateTimeFormatter final String formattedTimeStamp =
.ofLocalizedDateTime(FormatStyle.LONG) DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withZone(TimeZone .withZone(TimeZone.getDefault().toZoneId())
.getDefault() .format(Instant.now());
.toZoneId())
.format(Instant.now());
final String msg = switch (GlobalConf.applicationOutputLanguage) { final String msg = switch (GlobalConf.applicationOutputLanguage) {
case GlobalConf.langGerman -> "Erfolgreich bis %s gewartet!"; case GlobalConf.langGerman -> "Erfolgreich bis %s gewartet!";
@ -50,8 +45,6 @@ public final class Sleep {
}; };
final String msgWithData = msg.formatted(formattedTimeStamp); final String msgWithData = msg.formatted(formattedTimeStamp);
System System.getLogger("sleep").log(Level.INFO, msgWithData);
.getLogger("sleep")
.log(Level.INFO, msgWithData);
} }
} }

View file

@ -32,31 +32,28 @@ public final class TimeCalculator {
public static ZonedDateTime calculateAndAnnounceTargetTime(final String userTimeInputRaw) { public static ZonedDateTime calculateAndAnnounceTargetTime(final String userTimeInputRaw) {
final var userTimeInputRelative = LocalTime.parse(userTimeInputRaw); final var userTimeInputRelative = LocalTime.parse(userTimeInputRaw);
final var userTimeInputAbsolute = ZonedDateTime.of(LocalDate.now(), final var userTimeInputAbsolute =
userTimeInputRelative, ZonedDateTime.of(
TimeZone LocalDate.now(),
.getDefault() userTimeInputRelative,
.toZoneId()); TimeZone.getDefault().toZoneId()
);
final var userTimeInputFinal = (Instant final var userTimeInputFinal = (Instant.now().isBefore(userTimeInputAbsolute.toInstant()))
.now() ? userTimeInputAbsolute
.isBefore(userTimeInputAbsolute.toInstant())) : userTimeInputAbsolute.plusDays(1);
? userTimeInputAbsolute
: userTimeInputAbsolute.plusDays(1);
final var formattedTimeStamp = userTimeInputFinal.format( final var formattedTimeStamp =
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)); userTimeInputFinal.format(
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
);
final String msg = switch (GlobalConf.applicationOutputLanguage) { final String msg = switch (GlobalConf.applicationOutputLanguage) {
case GlobalConf.langGerman -> ("Dieses Program wird bis zum %s " + case GlobalConf.langGerman -> "Dieses Program wird bis zum %s warten."
"warten.").formatted( .formatted(formattedTimeStamp);
formattedTimeStamp); default -> "WaitUntil will suspend until %s".formatted(formattedTimeStamp);
default -> "WaitUntil will suspend until %s".formatted(
formattedTimeStamp);
}; };
System System.getLogger("timecalculator").log(Level.INFO, msg);
.getLogger("timecalculator")
.log(Level.INFO, msg);
return userTimeInputFinal; return userTimeInputFinal;
} }