EN · DE · RU · FR · ES

#1874: Version.java

projectforge-common/src/main/java/org/projectforge/Version.java Domain-Klasse — Paket org.projectforge, projectforge-common/src/main/java/org/projectforge/Version.java 314 Zeilen · 223 Code · 63 Kommentare · 28 leer
Klasse zur Darstellung und zum Vergleich semantischer Versionsnummern. Analysiert Versionszeichenfolgen in den Formaten #.#.#.# mit optionalen Suffixen b{beta}, rc{release-candidate} und -SNAPSHOT. Implementiert Comparable<Version> für eine korrekte Sortierung (Release > RC > Beta, mit numerischem Untervergleich). Wird in ProjectForge für Plugin-Kompatibilitätsprüfungen und Datenbankmigrations-Versionierung verwendet.

Architektur

Importe

Klassenhierarchie

Version implements Comparable<Version>, Serializable

Versionskomponenten

KomponenteFeldStandard-/Nicht gesetzter WertBeispiel
HauptversionmajorRelease03.5.4.2 → major=3
NebenversionminorRelease03.5.4.2 → minor=5
Patch-LevelpatchLevel03.5.4.2 → patch=4
Build-NummerbuildNumber03.5.4.2 → build=2
Beta-VersionbetaVersionInteger.MAX_VALUE (kein Beta)3.5b2 → beta=2
RC-VersionreleaseCandidateVersionInteger.MAX_VALUE (kein RC)3.5rc1 → rc=1
Snapshot-Flagsnapshotfalse3.5-SNAPSHOT

Analyseformat

Der Zeichenfolgenkonstruktor akzeptiert diese Muster (Groß-/Kleinschreibung bei Suffixen wird ignoriert):

Vergleichslogik (compareTo)

Der Vergleich folgt einer strengen Hierarchie:

  1. Hauptversion → Nebenversion → Patch-Level → Build-Nummer (numerischer Vergleich)
  2. Release vs. Vorabversion: Wenn sich Versionen im Vorabversionsstatus unterscheiden:
    • Normales Release ist HÖHER als RC
    • RC ist HÖHER als Beta
    • Beta ist NIEDRIGER als normales Release
  3. Wenn beide RC sind: RC-Versionsnummern vergleichen
  4. Wenn beide Beta sind: Beta-Versionsnummern vergleichen

Diese Sortierung stellt sicher: 3.5b1 < 3.5rc1 < 3.5 — entscheidend für die Bestimmung, ob eine Datenbankmigration oder ein Plugin-Upgrade erforderlich ist.

Spezialbehandlung: Gradle-Platzhalter

Die Methode parseInt() erkennt das nicht expandierte Gradle-Token "gradle.version" und behandelt es als 0, wobei eine Warnung protokolliert wird. Dies behandelt den Fall, dass Versionsinformationen zur Build-Zeit in ein JAR kompiliert werden und die Gradle-Versionseigenschaft noch nicht aufgelöst wurde (z. B. bei IDE-Testläufen).

toString()-Format

Die Verwendung von Integer.MAX_VALUE als Sentinel für "kein Beta/RC" ist eine elegante Designentscheidung. Sie stellt sicher, dass eine Nicht-Beta-Version im numerischen Vergleich immer höher ist als jede Beta-Version (da MAX_VALUE die größtmögliche ganze Zahl ist), während dennoch ein direkter numerischer Vergleich möglich ist, wenn beide Beta/RC sind.
Die Methode compareTo berücksichtigt das Snapshot-Flag NICHT bei der Sortierung. Zwei Versionen, die sich nur durch den Snapshot-Status unterscheiden (z. B. "3.5" vs. "3.5-SNAPSHOT"), würden als gleich verglichen. Dies könnte beabsichtigt sein – Snapshots kennzeichnen Build-Zeit-Metadaten und keine semantischen Versionsunterschiede.

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelltextdatei-Header: 2024 -> 2025.
0237d5eba JSON-Serialisierung umgestaltet: IdOnlySerializer und IdsOnlySerializer eingeführt.
6f7e0fbc7 Migrationskram in Arbeit...
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
ceb63e8a1 Quelltextkopf: (C) 2001-2021.