EN · DE · RU · FR · ES

#1874: Version.java

projectforge-common/src/main/java/org/projectforge/Version.java Clase de dominio — paquete org.projectforge, projectforge-common/src/main/java/org/projectforge/Version.java 314 líneas · 223 código · 63 comentarios · 28 en blanco
Clase de representación y comparación de números de versión semántica. Analiza cadenas de versión en formatos #.#.#.# con sufijos opcionales b{beta}, rc{candidato-a-lanzamiento} y -SNAPSHOT. Implementa Comparable<Version> para un orden correcto (lanzamiento > RC > beta, con subcomparación numérica). Se utiliza en todo ProjectForge para comprobaciones de compatibilidad de complementos y versionado de migraciones de base de datos.

Arquitectura

Importaciones

Jerarquía de clases

Version implements Comparable<Version>, Serializable

Componentes de la versión

ComponenteCampoValor predeterminado/sin establecerEjemplo
Lanzamiento principalmajorRelease03.5.4.2 → major=3
Lanzamiento menorminorRelease03.5.4.2 → minor=5
Nivel de parchepatchLevel03.5.4.2 → patch=4
Número de compilaciónbuildNumber03.5.4.2 → build=2
Versión betabetaVersionInteger.MAX_VALUE (no beta)3.5b2 → beta=2
Versión RCreleaseCandidateVersionInteger.MAX_VALUE (no RC)3.5rc1 → rc=1
Indicador de snapshotsnapshotfalse3.5-SNAPSHOT

Formato de análisis

El constructor de cadena acepta estos patrones (no distingue entre mayúsculas y minúsculas para los sufijos):

Lógica de comparación (compareTo)

La comparación sigue una jerarquía estricta:

  1. Lanzamiento principal → Lanzamiento menor → Nivel de parche → Número de compilación (comparación numérica)
  2. Lanzamiento vs. Prelanzamiento: Si las versiones difieren en el estado de prelanzamiento:
    • El lanzamiento normal es MAYOR que RC
    • RC es MAYOR que beta
    • Beta es MENOR que el lanzamiento normal
  3. Si ambos son RC: comparar números de versión RC
  4. Si ambos son beta: comparar números de versión beta

Este orden garantiza: 3.5b1 < 3.5rc1 < 3.5 — fundamental para determinar si se necesita una migración de base de datos o una actualización de complemento.

Manejo especial: marcador de posición de Gradle

El método parseInt() detecta el token no expandido de Gradle "gradle.version" y lo trata como 0, registrando una advertencia. Esto maneja el caso en que la información de versión se compila en un JAR durante la compilación y la propiedad de versión de Gradle aún no se ha resuelto (p. ej., en ejecuciones de prueba del IDE).

Formato toString()

El uso de Integer.MAX_VALUE como valor centinela para "no beta/RC" es una decisión de diseño elegante. Garantiza que, en la comparación numérica, una versión no beta siempre se compare como superior a cualquier versión beta (ya que MAX_VALUE es el entero más grande posible), al tiempo que permite la comparación numérica directa cuando ambas son beta/RC.
El método compareTo NO considera el indicador de snapshot en el orden. Dos versiones que difieren solo por el estado de snapshot (p. ej., "3.5" vs "3.5-SNAPSHOT") se compararían como iguales. Esto puede ser intencional: los snapshots indican metadatos de tiempo de compilación en lugar de diferencias semánticas de versión.

Historial de Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024 -> 2025.
0237d5eba Serialización JSON refactorizada: se introdujeron IdOnlySerializer e IdsOnlySerializer.
6f7e0fbc7 Trabajo de migración en curso...
b6092df09 Derechos de autor 2023 -> 2024
ab45d51fa Derechos de autor 2001-2022 -> 2001-2023.
5f7ef41b8 Derechos de autor 2021 -> 2022
ceb63e8a1 Encabezado de código fuente: (C) 2001-2021.