+ * Im gepackten Betrieb wird der Eintrag {@code Implementation-Version} aus dem + * JAR-Manifest gelesen, der beim Build durch das Shade-Plugin befüllt wird. + * Im IDE-Betrieb und in Testumgebungen ohne gepacktes JAR steht kein Manifest + * zur Verfügung; in diesem Fall wird der Fallback {@code "dev"} zurückgegeben. + *
+ * Diese Klasse ist eine reine Hilfsklasse ohne Zustand; alle Methoden sind statisch. + * Die Verdrahtung mit der GUI-Statuszeile erfolgt in einer späteren Ausbaustufe. + */ +public final class ApplicationVersionProvider { + + /** Fallback-Version, wenn kein Manifest-Eintrag verfügbar ist. */ + private static final String FALLBACK_VERSION = "dev"; + + /** Utility-Klasse – kein öffentlicher Konstruktor. */ + private ApplicationVersionProvider() { + // nicht instanziierbar + } + + /** + * Gibt die Anwendungsversion zurück. + *
+ * Die Version wird aus dem {@code Implementation-Version}-Eintrag des Pakets + * {@code de.gecheckt.pdf.umbenenner.bootstrap} gelesen. Dieser Eintrag wird + * beim Build durch das Shade-Plugin mit dem Wert der Property {@code ${revision}} + * befüllt. + *
+ * Ist der Eintrag nicht vorhanden (IDE-Start, Tests, ungepackter Betrieb), + * wird der Wert {@code "dev"} zurückgegeben. + * + * @return die aufgelöste Versionsnummer, niemals {@code null} + */ + public static String resolveVersion() { + String version = ApplicationVersionProvider.class.getPackage().getImplementationVersion(); + if (version == null) { + // Fallback für IDE-Start und ungepackten Betrieb + return FALLBACK_VERSION; + } + return version; + } +} diff --git a/pdf-umbenenner-bootstrap/src/test/java/de/gecheckt/pdf/umbenenner/bootstrap/ApplicationVersionProviderTest.java b/pdf-umbenenner-bootstrap/src/test/java/de/gecheckt/pdf/umbenenner/bootstrap/ApplicationVersionProviderTest.java new file mode 100644 index 0000000..3b283ca --- /dev/null +++ b/pdf-umbenenner-bootstrap/src/test/java/de/gecheckt/pdf/umbenenner/bootstrap/ApplicationVersionProviderTest.java @@ -0,0 +1,36 @@ +package de.gecheckt.pdf.umbenenner.bootstrap; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Unit-Tests für {@link ApplicationVersionProvider}. + *
+ * Im Testlauf ist kein gepacktes JAR mit Manifest vorhanden; der Test prüft deshalb
+ * ausschließlich das Fallback-Verhalten und stellt sicher, dass die Methode niemals
+ * {@code null} zurückgibt.
+ */
+class ApplicationVersionProviderTest {
+
+ /**
+ * Im Testlauf (kein Fat-JAR, kein Manifest-Eintrag) muss der Fallback-Wert
+ * {@code "dev"} zurückgegeben werden.
+ */
+ @Test
+ void resolveVersion_ohneGepacktesJar_gibtDevZurueck() {
+ // Wenn kein MANIFEST.MF mit Implementation-Version vorhanden ist (IDE / Test),
+ // wird der Fallback-Wert geliefert.
+ String version = ApplicationVersionProvider.resolveVersion();
+ assertThat(version).isEqualTo("dev");
+ }
+
+ /**
+ * Das Ergebnis von {@link ApplicationVersionProvider#resolveVersion()} darf
+ * niemals {@code null} sein – weder im IDE-Betrieb noch im gepackten Betrieb.
+ */
+ @Test
+ void resolveVersion_gibtNiemalsNull() {
+ assertThat(ApplicationVersionProvider.resolveVersion()).isNotNull();
+ }
+}
diff --git a/pdf-umbenenner-coverage/pom.xml b/pdf-umbenenner-coverage/pom.xml
index 76c1ca9..0d9cffc 100644
--- a/pdf-umbenenner-coverage/pom.xml
+++ b/pdf-umbenenner-coverage/pom.xml
@@ -5,7 +5,7 @@