Compare commits

...

10 Commits

Author SHA1 Message Date
FabianArbeit cea8d25eea - calculate mittagspause with offset correctly
- show provisionary mittagspause
- handle zapfenstreich the same way
2026-04-28 11:26:00 +02:00
SZIMNAU 12c8898252 reverted 'verschlimmbesserung' trying to improve end time calculation 2026-01-06 15:57:41 +01:00
fszimnau 9e65158901 fixed method name 2026-01-06 08:26:55 +01:00
fszimnau 67c341a091 - added constant and renamed existing for clearer naming
- added comment about existing inprecision
2026-01-05 11:21:13 +01:00
fszimnau c74d63c178 better method naming 2026-01-05 11:19:17 +01:00
fszimnau 5f2c7ffeab added missing argument 2026-01-05 11:17:58 +01:00
fszimnau 8d1e6aed7a more precise calculation 2026-01-05 10:41:00 +01:00
fszimnau dc690f3350 - enable running project 'quck' - run the jar in the dist directory directly
- enable running any class directly without needing a jar in the first place
2025-12-03 15:13:16 +01:00
fszimnau 8be9cf81d7 work with jar file before closing it 2025-11-25 09:21:53 +01:00
fszimnau 7df22a2d1f improved/ added error messages 2025-11-20 09:07:29 +01:00
5 changed files with 94 additions and 33 deletions
+18 -6
View File
@@ -2,13 +2,25 @@
set -uo pipefail
# when executed as executable file in "git for windows" bash some things won't work, so always run with prefixed command
originDir=$(pwd);
cd /g/zeitlaeufer/;
tmpDir="/tmp/zeitlaeufer_$RANDOM";
jarDir=/g/zeitlaeufer/dist/;
if [[ $# == 0 || ($1 != -quick && $1 != -class) ]]; then
tmpDir=/tmp/zeitlaeufer_$RANDOM;
mkdir $tmpDir;
cp dist/zeitlaeufer.jar $tmpDir;
cd $originDir;
cp ${jarDir}zeitlaeufer.jar $tmpDir;
jarDir=$tmpDir;
elif [[ $1 == -quick ]]; then
shift;
elif [[ $1 == -class ]]; then
originDir=$(pwd);
cd /g/zeitlaeufer/target/;
java de.szimnau.zeitlaeufer.$2;
exitCode=$?;
cd originDir;
return $exitCode;
fi
# java -jar $tmpDir/zeitlaeufer.jar $@;
# -p <=> --module-path | -m <=> --module
java --module-path $tmpDir/zeitlaeufer.jar --module zeitlaeufer $@;
java --module-path $jarDir/zeitlaeufer.jar --module zeitlaeufer $@;
if [[ -n $tmpDir && -d $tmpDir ]]; then
rm -r $tmpDir;
fi
@@ -21,7 +21,8 @@ public class DrinkingBar extends AbstractLoadingBar implements WorkdayLoadingBar
private static final int MINS_PER_HALF_HOUR = CommonTools.MINS_PER_HOUR / 2;
private static final int MINUTES_BEFORE_PAUSE = 4 * CommonTools.MINS_PER_HOUR + MINS_PER_HALF_HOUR;
private static final int MINUTES_WITH_PAUSE = 6 * CommonTools.MINS_PER_HOUR;
private static final int MAX_MINUTES_WITHOUT_PAUSE = 6 * CommonTools.MINS_PER_HOUR;
private static final int MAX_MINUTES_WITH_PAUSE = 6 * CommonTools.MINS_PER_HOUR;
private static final int DEFAULT_TOTAL_TIME = 8 * CommonTools.MINS_PER_HOUR + MINS_PER_HALF_HOUR;
private static final BigDecimal DEFAULT_TOTAL_TIME_BD = BigDecimal.valueOf(DEFAULT_TOTAL_TIME);
private static final BigDecimal DEFAULT_TOTAL_LITRES = BigDecimal.valueOf(2.0);
@@ -65,7 +66,10 @@ public class DrinkingBar extends AbstractLoadingBar implements WorkdayLoadingBar
@Override
protected String fillLoadingBar(long passedMinutes, boolean progressive) {
long effectivePassedMinutes = passedMinutes < 0 ? 0 : passedMinutes;
if (getTotalMinutes() > MINUTES_WITH_PAUSE && passedMinutes > MINUTES_BEFORE_PAUSE && passedMinutes <= MINUTES_WITH_PAUSE) {
/* the pause in counting up passed minutes could be more precise.
there IS a way to find out how LONG the lunch break was (known until WorkdayLoadingBar.realInitZapfenstreich),
but NOT the exact time slot from when to when the lunch break did take place... */
if (getTotalMinutes() > MAX_MINUTES_WITHOUT_PAUSE && passedMinutes > MINUTES_BEFORE_PAUSE && passedMinutes <= MAX_MINUTES_WITH_PAUSE) {
effectivePassedMinutes = MINUTES_BEFORE_PAUSE;
}
var effectivePassedMinutesBD = BigDecimal.valueOf(effectivePassedMinutes);
+42 -15
View File
@@ -2,6 +2,7 @@ package de.szimnau.zeitlaeufer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -45,22 +46,15 @@ public class Main {
private static SortedMap<Integer, Class<?>> getAllrelevantClasses() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
List<String> fileNames = new ArrayList<>();
URL jarUrl = classLoader.getResource("de/szimnau/zeitlaeufer");
String path = jarUrl.getPath().split(":", 2)[1];
String cleanPath = path.substring(0, path.lastIndexOf('!'));
Enumeration<JarEntry> entries;
try (var jarFile = new JarFile(URLDecoder.decode(cleanPath, StandardCharsets.UTF_8))) {
entries = jarFile.entries();
} catch (IOException e) {
throw new RuntimeException(e);
URL resourceUrl = classLoader.getResource("de/szimnau/zeitlaeufer");
if (resourceUrl == null) {
throw new RuntimeException("Kann ausführbare Klassen nicht eruieren, da keine Ressource \"de/szimnau/zeitlaeufer\" verfügbar.");
}
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
fileNames.add(entry.getName());
Set<String> fileNames;
if (resourceUrl.getPath().contains(".jar")) {
fileNames = getFileNamesStreamFromJar(resourceUrl);
} else {
fileNames = getFileNamesStreamFromPackage(resourceUrl);
}
var increment = new AtomicInteger();
return Collections.unmodifiableSortedMap(new TreeMap<>(
@@ -79,6 +73,39 @@ public class Main {
}
private static Set<String> getFileNamesStreamFromJar(URL resourceUrl) {
Set<String> fileNames = new HashSet<>();
String path = resourceUrl.getPath().split(":", 2)[1];
String cleanPath = path.substring(0, path.lastIndexOf('!'));
Enumeration<JarEntry> entries;
try (var jarFile = new JarFile(URLDecoder.decode(cleanPath, StandardCharsets.UTF_8))) {
entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
fileNames.add(entry.getName());
}
} catch (IOException e) {
throw new RuntimeException("Kann JAR-Datei zwecks Reflection nicht öffnen:", e);
}
return fileNames;
}
private static Set<String> getFileNamesStreamFromPackage(URL resourceUrl) {
try (InputStream stream = resourceUrl.openStream();
var br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
return br.lines()
.map(line -> "de/szimnau/zeitlaeufer." + line)
.collect(Collectors.toSet());
} catch (IOException e) {
throw new RuntimeException("ausführbare Klassen nicht eruieren, da Ressource " + resourceUrl + " nicht auslesbar.", e);
}
}
private static Class<?> getClass(String className) {
String classWithPath = className.replace("/", ".");
return getClassForName(classWithPath.substring(0, className.lastIndexOf('.')));
@@ -20,12 +20,12 @@ public interface WorkdayLoadingBar {
void showLoadingBar(boolean debug, boolean passedMinutesZero);
default boolean hasMittagspauseArrived() {
return hasMittagspauseArrived(false);
default boolean couldHaveHadNoMittagspauseYet() {
return couldHaveHadNoMittagspauseYet(false);
}
default boolean hasMittagspauseArrived(boolean debugWithPassedMinutesZero) {
default boolean couldHaveHadNoMittagspauseYet(boolean debugWithPassedMinutesZero) {
return getPassedMinutes(debugWithPassedMinutesZero) < DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH;
}
@@ -33,6 +33,12 @@ public interface WorkdayLoadingBar {
long getPassedMinutes(boolean passedMinutesZero);
default LocalTime estimateMittagspause() {
LocalTime defaultEndTime = getStartTime().plusMinutes(DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH);
return calculateRealMittagspause(defaultEndTime);
}
default void initMittagspause() {
LocalTime defaultEndTime = getStartTime().plusMinutes(DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH);
realInitMittagspause(defaultEndTime);
@@ -43,7 +49,7 @@ public interface WorkdayLoadingBar {
default void initMittagspause(int endTimeOffset) {
LocalTime offsetEndTime = getStartTime().plusMinutes(DEFAULT_NUMBER_WORK_MINS_BEFORE_LUNCH + endTimeOffset);
LocalTime offsetEndTime = estimateMittagspause().plusMinutes(endTimeOffset);
realInitMittagspause(offsetEndTime);
}
@@ -55,13 +61,24 @@ public interface WorkdayLoadingBar {
private void realInitMittagspause(LocalTime theoreticalEndTime) {
setEndTime(theoreticalEndTime.isAfter(LATEST_LUNCH_TIME) ? LATEST_LUNCH_TIME : theoreticalEndTime);
setEndTime(calculateRealMittagspause(theoreticalEndTime));
}
private LocalTime calculateRealMittagspause(LocalTime theoreticalMittagspause) {
return theoreticalMittagspause.isAfter(LATEST_LUNCH_TIME) ? LATEST_LUNCH_TIME : theoreticalMittagspause;
}
void setEndTime(LocalTime endTime);
default LocalTime estimateZapfenstreich(Integer mittagspauseDuration) {
int estMittagspauseDuration = mittagspauseDuration != null ? mittagspauseDuration : MIN_LUNCH_DURATION;
return getStartTime().plusMinutes(MAX_NUMBER_WORK_MINS + estMittagspauseDuration);
}
default void initZapfenstreich() {
LocalTime trueEndTime = getStartTime().plusMinutes(MAX_NUMBER_WORK_MINS + MIN_LUNCH_DURATION);
realInitZapfenstreich(MIN_LUNCH_DURATION, trueEndTime);
@@ -61,7 +61,7 @@ public class LoadingBarCliTools {
WorkdayLoadingBar lb = constructor.apply(startTime);
boolean debug = false;
boolean passedMinutesZero = false;
if (lb.hasMittagspauseArrived(debug && passedMinutesZero)) {
if (lb.couldHaveHadNoMittagspauseYet(debug && passedMinutesZero)) {
handleMittagspause(br, lb);
lb.showLoadingBar(debug, passedMinutesZero);
}
@@ -71,6 +71,8 @@ public class LoadingBarCliTools {
private static void handleMittagspause(BufferedReader br, WorkdayLoadingBar lb) throws IOException {
LocalTime vorlaeufigeEndzeit = lb.estimateMittagspause();
println("Mittagspause: " + FormatTools.TIME_FORMATTER.format(vorlaeufigeEndzeit));
print("Mittagspause verschieben um (optional): ");
String mittagspauseOffsetRaw = br.readLine();
if (mittagspauseOffsetRaw != null && !mittagspauseOffsetRaw.isBlank()) {
@@ -96,8 +98,7 @@ public class LoadingBarCliTools {
if (mittagspauseDurationRaw != null && !mittagspauseDurationRaw.isBlank()) {
mittagspauseDuration = Integer.valueOf(mittagspauseDurationRaw);
}
LocalTime vorlaeufigeEndzeit = lb.getStartTime().plusMinutes(WorkdayLoadingBar.MAX_NUMBER_WORK_MINS)
.plusMinutes(mittagspauseDuration != null ? mittagspauseDuration : WorkdayLoadingBar.MIN_LUNCH_DURATION);
LocalTime vorlaeufigeEndzeit = lb.estimateZapfenstreich(mittagspauseDuration);
println("Endzeit: " + FormatTools.TIME_FORMATTER.format(vorlaeufigeEndzeit));
print("Feierabend verschieben um (optional): ");
String zapfenstreichOffsetRaw = br.readLine();