Compare commits
3 Commits
474c0210cd
...
e0750ef26f
Author | SHA1 | Date | |
---|---|---|---|
e0750ef26f | |||
f8ed1d185b | |||
b472d0dcba |
@@ -75,27 +75,36 @@ public class LoadingBar {
|
|||||||
|
|
||||||
private static void askParametersAndRun() throws IOException {
|
private static void askParametersAndRun() throws IOException {
|
||||||
var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
|
var br = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
|
||||||
System.out.print("Ankunftszeit: ");
|
print("Ankunftszeit: ");
|
||||||
String startTimeRaw = br.readLine();
|
String startTimeRaw = br.readLine();
|
||||||
var startTime = LocalTime.parse(startTimeRaw, TIME_FORMATTER);
|
var startTime = LocalTime.parse(startTimeRaw, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
handleMittagspause(br, startTime);
|
handleMittagspause(br, startTime);
|
||||||
handleZapfenstreich(br, startTime);
|
handleZapfenstreich(br, startTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void println(Object o) {
|
||||||
|
System.out.println(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void print(Object o) {
|
||||||
|
System.out.print(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void handleMittagspause(BufferedReader br, LocalTime startTime) throws IOException {
|
private static void handleMittagspause(BufferedReader br, LocalTime startTime) throws IOException {
|
||||||
System.out.print("Mittagspause verschieben um (optional): ");
|
print("Mittagspause verschieben um (optional): ");
|
||||||
String mittagspauseOffsetRaw = br.readLine();
|
String mittagspauseOffsetRaw = br.readLine();
|
||||||
if (mittagspauseOffsetRaw != null && !mittagspauseOffsetRaw.isBlank()) {
|
if (mittagspauseOffsetRaw != null && !mittagspauseOffsetRaw.isBlank()) {
|
||||||
var mittagspauseOffset = Integer.parseInt(mittagspauseOffsetRaw);
|
var mittagspauseOffset = Integer.parseInt(mittagspauseOffsetRaw);
|
||||||
showLoadingBarMittagspause(startTime, mittagspauseOffset);
|
showLoadingBarMittagspause(startTime, mittagspauseOffset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
System.out.print("Mittagspause um (optional): ");
|
print("Mittagspause um (optional): ");
|
||||||
String manualMittagspauseRaw = br.readLine();
|
String manualMittagspauseRaw = br.readLine();
|
||||||
if (manualMittagspauseRaw != null && !manualMittagspauseRaw.isBlank()) {
|
if (manualMittagspauseRaw != null && !manualMittagspauseRaw.isBlank()) {
|
||||||
var manualMittagspause = LocalTime.parse(manualMittagspauseRaw, TIME_FORMATTER);
|
var manualMittagspause = LocalTime.parse(manualMittagspauseRaw, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
showLoadingBarMittagspause(startTime, manualMittagspause);
|
showLoadingBarMittagspause(startTime, manualMittagspause);
|
||||||
} else {
|
} else {
|
||||||
showLoadingBarMittagspause(startTime);
|
showLoadingBarMittagspause(startTime);
|
||||||
@@ -104,13 +113,13 @@ public class LoadingBar {
|
|||||||
|
|
||||||
|
|
||||||
private static void handleZapfenstreich(BufferedReader br, LocalTime startTime) throws IOException {
|
private static void handleZapfenstreich(BufferedReader br, LocalTime startTime) throws IOException {
|
||||||
System.out.print("Mittagspause hat gedauert (optional): ");
|
print("Mittagspause hat gedauert (optional): ");
|
||||||
String mittagspauseDurationRaw = br.readLine();
|
String mittagspauseDurationRaw = br.readLine();
|
||||||
Integer mittagspauseDuration = null;
|
Integer mittagspauseDuration = null;
|
||||||
if (mittagspauseDurationRaw != null && !mittagspauseDurationRaw.isBlank()) {
|
if (mittagspauseDurationRaw != null && !mittagspauseDurationRaw.isBlank()) {
|
||||||
mittagspauseDuration = Integer.valueOf(mittagspauseDurationRaw);
|
mittagspauseDuration = Integer.valueOf(mittagspauseDurationRaw);
|
||||||
}
|
}
|
||||||
System.out.print("Feierabend verschieben um (optional): ");
|
print("Feierabend verschieben um (optional): ");
|
||||||
String zapfenstreichOffsetRaw = br.readLine();
|
String zapfenstreichOffsetRaw = br.readLine();
|
||||||
Integer zapfenstreichOffset = null;
|
Integer zapfenstreichOffset = null;
|
||||||
if (zapfenstreichOffsetRaw != null && !zapfenstreichOffsetRaw.isBlank()) {
|
if (zapfenstreichOffsetRaw != null && !zapfenstreichOffsetRaw.isBlank()) {
|
||||||
@@ -118,11 +127,11 @@ public class LoadingBar {
|
|||||||
showLoadingBarZapfenstreich(startTime, mittagspauseDuration, zapfenstreichOffset);
|
showLoadingBarZapfenstreich(startTime, mittagspauseDuration, zapfenstreichOffset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
System.out.print("Manuelle Uhrzeit Feierabend (optional): ");
|
print("Manuelle Uhrzeit Feierabend (optional): ");
|
||||||
String manualZapfenstreichRaw = br.readLine();
|
String manualZapfenstreichRaw = br.readLine();
|
||||||
LocalTime manualZapfenstreich = null;
|
LocalTime manualZapfenstreich = null;
|
||||||
if (manualZapfenstreichRaw != null && !manualZapfenstreichRaw.isBlank()) {
|
if (manualZapfenstreichRaw != null && !manualZapfenstreichRaw.isBlank()) {
|
||||||
manualZapfenstreich = LocalTime.parse(manualZapfenstreichRaw, TIME_FORMATTER);
|
manualZapfenstreich = LocalTime.parse(manualZapfenstreichRaw, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
showLoadingBarZapfenstreich(startTime, mittagspauseDuration, manualZapfenstreich);
|
showLoadingBarZapfenstreich(startTime, mittagspauseDuration, manualZapfenstreich);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -138,7 +147,7 @@ public class LoadingBar {
|
|||||||
}
|
}
|
||||||
verifyMinimumNumberOfArgs(args);
|
verifyMinimumNumberOfArgs(args);
|
||||||
verifyTimeFormat(nextArg, "Erstes Argument");
|
verifyTimeFormat(nextArg, "Erstes Argument");
|
||||||
var startTime = LocalTime.parse(nextArg, TIME_FORMATTER);
|
var startTime = LocalTime.parse(nextArg, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
nextArg = args[1];
|
nextArg = args[1];
|
||||||
var section = DaySection.byParam(nextArg);
|
var section = DaySection.byParam(nextArg);
|
||||||
verifyDaySection(section, nextArg);
|
verifyDaySection(section, nextArg);
|
||||||
@@ -161,7 +170,7 @@ public class LoadingBar {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
verifyTimeFormat(nextArg, "Argument nach " + DaySection.MITTAG.getParam());
|
verifyTimeFormat(nextArg, "Argument nach " + DaySection.MITTAG.getParam());
|
||||||
var manualMittagspause = LocalTime.parse(nextArg, TIME_FORMATTER);
|
var manualMittagspause = LocalTime.parse(nextArg, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
showLoadingBarMittagspause(startTime, manualMittagspause);
|
showLoadingBarMittagspause(startTime, manualMittagspause);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +185,7 @@ public class LoadingBar {
|
|||||||
int endTimeOffset = 0;
|
int endTimeOffset = 0;
|
||||||
Integer lunchDuration = null;
|
Integer lunchDuration = null;
|
||||||
if (TIME_PATTERN.matcher(nextArg).matches()) {
|
if (TIME_PATTERN.matcher(nextArg).matches()) {
|
||||||
maxZapfenstreich = LocalTime.parse(nextArg, TIME_FORMATTER);
|
maxZapfenstreich = LocalTime.parse(nextArg, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
} else if (OFFSET_PATTERN.matcher(nextArg).matches()) {
|
} else if (OFFSET_PATTERN.matcher(nextArg).matches()) {
|
||||||
endTimeOffset = Integer.parseInt(nextArg);
|
endTimeOffset = Integer.parseInt(nextArg);
|
||||||
} else {
|
} else {
|
||||||
@@ -195,12 +204,12 @@ public class LoadingBar {
|
|||||||
}
|
}
|
||||||
nextArg = args[3];
|
nextArg = args[3];
|
||||||
if (lunchDuration == null) {
|
if (lunchDuration == null) {
|
||||||
System.out.println("Letztes Argument darf nur auf Mittagspausendauer folgen.");
|
println("Letztes Argument darf nur auf Mittagspausendauer folgen.");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
if (maxZapfenstreich == null && !OFFSET_PATTERN.matcher(nextArg).matches()) {
|
if (maxZapfenstreich == null && !OFFSET_PATTERN.matcher(nextArg).matches()) {
|
||||||
verifyTimeFormat(nextArg, "Letztes Argument nach " + DaySection.ZAPFENSTREICH.getParam() + " und Mittagspausendauer");
|
verifyTimeFormat(nextArg, "Letztes Argument nach " + DaySection.ZAPFENSTREICH.getParam() + " und Mittagspausendauer");
|
||||||
maxZapfenstreich = LocalTime.parse(nextArg, TIME_FORMATTER);
|
maxZapfenstreich = LocalTime.parse(nextArg, TIME_FORMATTER).truncatedTo(ChronoUnit.MINUTES);
|
||||||
showLoadingBarZapfenstreich(startTime, lunchDuration, maxZapfenstreich);
|
showLoadingBarZapfenstreich(startTime, lunchDuration, maxZapfenstreich);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -214,7 +223,7 @@ public class LoadingBar {
|
|||||||
if (args.length >= 2) {
|
if (args.length >= 2) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
System.out.println("Mindestens 2 Argumente müssen gegeben sein.");
|
println("Mindestens 2 Argumente müssen gegeben sein.");
|
||||||
printHelp();
|
printHelp();
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
@@ -241,7 +250,7 @@ public class LoadingBar {
|
|||||||
} // FSFIXME fine tune message -> HH:mm, mm, -+mm
|
} // FSFIXME fine tune message -> HH:mm, mm, -+mm
|
||||||
var firstInputPart = timeInput ? "Uhrzeitformat (" + TIME_FORMAT + ")" : "Minutenanzahl (" + LUNCH_DURATION_PATTERN + ")";
|
var firstInputPart = timeInput ? "Uhrzeitformat (" + TIME_FORMAT + ")" : "Minutenanzahl (" + LUNCH_DURATION_PATTERN + ")";
|
||||||
var possibleTimeInputPart = !timeInput && timeInputPossible ? " oder Uhrzeitformat (" + TIME_FORMAT + ")" : "";
|
var possibleTimeInputPart = !timeInput && timeInputPossible ? " oder Uhrzeitformat (" + TIME_FORMAT + ")" : "";
|
||||||
System.out.println(errMsgPrefix + " \"" + param + "\" muss " + firstInputPart + possibleTimeInputPart + " entsprechen.");
|
println(errMsgPrefix + " \"" + param + "\" muss " + firstInputPart + possibleTimeInputPart + " entsprechen.");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,13 +262,13 @@ public class LoadingBar {
|
|||||||
List<String> sectionDescs = Arrays.stream(DaySection.values()).map((DaySection ds) -> ds.getDescription() + " (" + ds.getParam() + ")")
|
List<String> sectionDescs = Arrays.stream(DaySection.values()).map((DaySection ds) -> ds.getDescription() + " (" + ds.getParam() + ")")
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
String sectionDescsJoined = String.join(" oder ", sectionDescs);
|
String sectionDescsJoined = String.join(" oder ", sectionDescs);
|
||||||
System.out.println("Argument nach Startzeit \"" + param + "\" muss Angabe für " + sectionDescsJoined + " sein.");
|
println("Argument nach Startzeit \"" + param + "\" muss Angabe für " + sectionDescsJoined + " sein.");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void printHelp() {
|
private static void printHelp() {
|
||||||
System.out.println("Mögliche Argumente für LoadingBar:\n"
|
println("Mögliche Argumente für LoadingBar:\n"
|
||||||
+ "Normalfall Vormittag (Mittagspause <= " + LATEST_LUNCH_TIME + ")\n"
|
+ "Normalfall Vormittag (Mittagspause <= " + LATEST_LUNCH_TIME + ")\n"
|
||||||
+ TIME_FORMAT + " " + DaySection.MITTAG.getParam() + "\n"
|
+ TIME_FORMAT + " " + DaySection.MITTAG.getParam() + "\n"
|
||||||
+ "Vormittag mit expliziter Mittagspause (<= " + LATEST_LUNCH_TIME + ")\n"
|
+ "Vormittag mit expliziter Mittagspause (<= " + LATEST_LUNCH_TIME + ")\n"
|
||||||
@@ -373,24 +382,24 @@ public class LoadingBar {
|
|||||||
private static void realShowLoadingBarZapfenstreich(LocalTime startTime, long manualLunchDuration, LocalTime endTime) {
|
private static void realShowLoadingBarZapfenstreich(LocalTime startTime, long manualLunchDuration, LocalTime endTime) {
|
||||||
if (manualLunchDuration > 0) {
|
if (manualLunchDuration > 0) {
|
||||||
var totalWorkTime = LocalTime.MIDNIGHT.plusMinutes(startTime.until(endTime, ChronoUnit.MINUTES) - manualLunchDuration);
|
var totalWorkTime = LocalTime.MIDNIGHT.plusMinutes(startTime.until(endTime, ChronoUnit.MINUTES) - manualLunchDuration);
|
||||||
System.out.print("Arbeitszeit: " + TIME_FORMATTER.format(totalWorkTime) + "; ");
|
print("Arbeitszeit: " + TIME_FORMATTER.format(totalWorkTime) + "; ");
|
||||||
}
|
}
|
||||||
showLoadingBar(startTime, endTime);
|
showLoadingBar(startTime, endTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void showLoadingBar(LocalTime startTime, LocalTime endTime) {
|
private static void showLoadingBar(LocalTime startTime, LocalTime endTime) {
|
||||||
long initialMinutes = startTime.until(endTime, ChronoUnit.MINUTES);
|
long totalMinutes = startTime.until(endTime, ChronoUnit.MINUTES);
|
||||||
System.out.print(minutesToTimeString(initialMinutes) + " gesamt; Endzeit: " + TIME_FORMATTER.format(endTime) + "\n");
|
long passedMinutes = startTime.until(LocalTime.now().truncatedTo(ChronoUnit.MINUTES), ChronoUnit.MINUTES);
|
||||||
long passedMinutes = startTime.until(LocalTime.now(), ChronoUnit.MINUTES);
|
if (passedMinutes > totalMinutes) {
|
||||||
if (passedMinutes > initialMinutes) {
|
passedMinutes = totalMinutes;
|
||||||
passedMinutes = initialMinutes;
|
|
||||||
} else if (passedMinutes < 0) {
|
} else if (passedMinutes < 0) {
|
||||||
System.out.println(fillLoadingBar(initialMinutes, 0, false));
|
var now = LocalTime.now().truncatedTo(ChronoUnit.SECONDS);
|
||||||
return;
|
println("!ACHTUNG! Startzeit \"" + startTime + ":00\" liegt in der Zukunft von jetzt an (" + now + ") gesehen.");
|
||||||
}
|
}
|
||||||
while (passedMinutes < initialMinutes) {
|
println(minutesToTimeString(totalMinutes) + " gesamt; Endzeit: " + TIME_FORMATTER.format(endTime));
|
||||||
System.out.print(fillLoadingBar(initialMinutes, passedMinutes, true));
|
while (passedMinutes < totalMinutes) {
|
||||||
|
print(fillLoadingBar(totalMinutes, passedMinutes, true));
|
||||||
try {
|
try {
|
||||||
var now = LocalTime.now();
|
var now = LocalTime.now();
|
||||||
var oneMinuteLater = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
|
var oneMinuteLater = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);
|
||||||
@@ -402,15 +411,15 @@ public class LoadingBar {
|
|||||||
}
|
}
|
||||||
passedMinutes++;
|
passedMinutes++;
|
||||||
}
|
}
|
||||||
System.out.println(fillLoadingBar(initialMinutes, passedMinutes, false));
|
println(fillLoadingBar(totalMinutes, passedMinutes, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static String fillLoadingBar(long initialMinutes, long passedMinutes, boolean progressive) {
|
private static String fillLoadingBar(long totalMinutes, long passedMinutes, boolean progressive) {
|
||||||
|
var nonNegativePassedMinutes = passedMinutes < 0 ? 0 : passedMinutes;
|
||||||
BigDecimal wholePercentage = BigDecimal.valueOf(100)
|
BigDecimal wholePercentage = BigDecimal.valueOf(100)
|
||||||
.multiply(BigDecimal.valueOf(passedMinutes) // kind of reverse dreisatz to avoid to have e.g. 99.9999 instead of 100 %
|
.multiply( // kind of reverse dreisatz to avoid to have e.g. 99.9999 instead of 100 %
|
||||||
.divide(BigDecimal.valueOf(initialMinutes), MathContext.DECIMAL64));
|
BigDecimal.valueOf(nonNegativePassedMinutes).divide(BigDecimal.valueOf(totalMinutes), MathContext.DECIMAL64));
|
||||||
long remainingMinutes = initialMinutes - passedMinutes;
|
|
||||||
int numberOfEquals = wholePercentage.intValue();
|
int numberOfEquals = wholePercentage.intValue();
|
||||||
var sb = new StringBuilder("[");
|
var sb = new StringBuilder("[");
|
||||||
for (int i = 0; i < LINE_LENGTH; i++) {
|
for (int i = 0; i < LINE_LENGTH; i++) {
|
||||||
@@ -420,8 +429,9 @@ public class LoadingBar {
|
|||||||
sb.append("-");
|
sb.append("-");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
long remainingMinutes = totalMinutes - nonNegativePassedMinutes;
|
||||||
sb.append("] ").append(PERCENTAGE_FORMAT.format(wholePercentage)).append("% ")
|
sb.append("] ").append(PERCENTAGE_FORMAT.format(wholePercentage)).append("% ")
|
||||||
.append(minutesToTimeString(passedMinutes)).append(" - ").append(minutesToTimeString(remainingMinutes));
|
.append(minutesToTimeString(nonNegativePassedMinutes)).append(" - ").append(minutesToTimeString(remainingMinutes));
|
||||||
if (progressive) {
|
if (progressive) {
|
||||||
sb.append("\r");
|
sb.append("\r");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user