Skip to content

Feature ETP-4129: Fix Y27 deprecation and build warnings - #1045

Open
RomanMagnoli wants to merge 6 commits into
epic/ETP-2587-Y27from
feature/ETP-4129-Y27
Open

Feature ETP-4129: Fix Y27 deprecation and build warnings#1045
RomanMagnoli wants to merge 6 commits into
epic/ETP-2587-Y27from
feature/ETP-4129-Y27

Conversation

@RomanMagnoli

@RomanMagnoli RomanMagnoli commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Contexto

Este PR resuelve los warnings de deprecación emitidos durante la compilación javac de Y27 (Hibernate 6, Redisson nuevo, FreeMarker, Gradle 8+). El objetivo es llegar a 0 warnings de deprecación en la salida del compilador.


Cambios por área

1. Build scripts — configuración Log4j2 (build.xml, src/build.xml, src-db/, src-trl/, src-util/, src-wad/)

Por qué: Las tareas <java fork="true"> de Ant lanzan una JVM nueva que no hereda la configuración de Log4j2 del proceso padre. Sin log4j.configurationFile, Log4j2 imprime warnings de "no configuration found" en cada tarea forkeada.

Qué se hizo: Se agregó <sysproperty key="log4j.configurationFile" file="${base.config}/log4j2.xml"/> a todas las tareas <java> que usan fork="true".

Extra en generate.entities.quick: Se agregó un <delete> del archivo META-INF/services/org.hibernate.service.spi.ServiceContributor antes de regenerar entidades, para evitar registros duplicados del NonTRXMetadataContributor entre builds incrementales.


2. build.gradle — sintaxis Gradle 8+

Por qué: Gradle 8 deprecó la asignación de propiedades sin = (property assignment). url "..." y exceptionFormat "full" emiten warnings.

Qué se hizo: url "..."url = "..." y exceptionFormat "full"exceptionFormat = "full".


3. Hibernate Interceptor — OBInterceptor, PersistenceEventOBInterceptor, ModelSessionFactoryController, JsonConversionTest, HiddenUpdateTest

Por qué: En Hibernate 6, EmptyInterceptor fue deprecado. La forma correcta es implementar directamente la interfaz Interceptor, que en Hibernate 6 tiene todos sus métodos como default (comportamiento vacío por defecto), por lo que no es necesario implementar los métodos que no se usan.

Adicionalmente, las firmas de los métodos del Interceptor cambiaron: el parámetro id/key pasó de Serializable a Object.

Qué se hizo:

  • extends EmptyInterceptorimplements Interceptor en todas las clases afectadas.
  • Serializable id/keyObject id/key en todas las firmas sobreescritas.
  • Eliminación de super.afterTransactionBegin/Completion/preFlush() — al implementar la interfaz directamente, esas llamadas a super ya no tienen sentido (apuntaban a implementaciones vacías de EmptyInterceptor).
  • Eliminación de import java.io.Serializable donde ya no se usa.

4. DalUUIDGenerator — migración de UUIDGenerator

Por qué: org.hibernate.id.UUIDGenerator está deprecado en Hibernate 6. La forma recomendada es implementar IdentifierGenerator directamente y generar el UUID con java.util.UUID.randomUUID().

Qué se hizo: extends UUIDGeneratorimplements IdentifierGenerator. La lógica de negocio se preservó: si el objeto ya tiene un ID asignado se reutiliza; si no, se genera uno nuevo en formato de 32 caracteres sin guiones.


5. DefaultSequenceGenerator — migración de AnnotationValueGeneration

Por qué: La API org.hibernate.tuple.AnnotationValueGeneration / GenerationTiming / ValueGenerator fue reemplazada en Hibernate 6 por AnnotationBasedGenerator + BeforeExecutionGenerator.

Qué se hizo: Migración completa al nuevo API:

  • Implementa AnnotationBasedGenerator<Sequence> y BeforeExecutionGenerator.
  • initialize(Sequence, Class<?>)initialize(Sequence, Member, GeneratorCreationContext).
  • getValueGenerator()generate(SharedSessionContractImplementor, Object, Object, EventType).
  • getGenerationTiming()getEventTypes() retornando EventTypeSets.INSERT_ONLY.
  • Se eliminaron referenceColumnInSql() y getDatabaseGeneratedReferencedColumnValue() (no existen en el nuevo API, el generador in-memory los hace innecesarios).

6. SessionFactoryController — APIs deprecadas de Hibernate

Por qué: AvailableSettings.USER fue movido a JdbcSettings.JAKARTA_JDBC_USER. sessionFactory.getSessionFactoryOptions() está deprecado a favor de hacer unwrap(SessionFactoryImplementor.class).

Qué se hizo:

  • AvailableSettings.USERJdbcSettings.JAKARTA_JDBC_USER.
  • sessionFactory.getSessionFactoryOptions().getServiceRegistry()sessionFactory.unwrap(SessionFactoryImplementor.class).getServiceRegistry().

7. CachedConcurrentMap — migración API Redisson

Por qué: En Redisson 3.x, LocalCachedMapOptions fue movido al paquete org.redisson.api.options y su factory method cambió: ya no existe defaults(), el nombre del mapa ahora se configura en el objeto de opciones. La firma de getLocalCachedMap() también cambió — ya no acepta el nombre como parámetro separado.

Qué se hizo:

  • import org.redisson.api.LocalCachedMapOptionsimport org.redisson.api.options.LocalCachedMapOptions.
  • LocalCachedMapOptions.defaults()LocalCachedMapOptions.name(name).
  • getLocalCachedMap(name, options)getLocalCachedMap(options).

8. JPA — queries tipadas y mutation queries

Por qué: Session.createNativeQuery(String) sin tipo de retorno está deprecado en favor de la versión tipada. Para queries de mutación (UPDATE/DELETE), Hibernate 6 introdujo createNativeMutationQuery() como API semánticamente correcta.

Qué se hizo:

  • OrganizationStructureProvider: createNativeQuery(sql)createNativeQuery(sql, Object[].class) — elimina los @SuppressWarnings("rawtypes"/"unchecked") asociados.
  • DataImportService: createNativeQuery(sql).executeUpdate()createNativeMutationQuery(sql).executeUpdate() (x2).

9. GenerateEntitiesTask — FreeMarker versioned configuration

Por qué: El constructor sin argumentos new Configuration() y new DefaultObjectWrapper() de FreeMarker 2.3.x están deprecados — requieren la versión de incompatibilidad como argumento para garantizar comportamiento consistente.

Qué se hizo: new Configuration()new Configuration(Configuration.VERSION_2_3_34) y new DefaultObjectWrapper()new DefaultObjectWrapper(Configuration.VERSION_2_3_34).


10. Supresiones con @SuppressWarnings("deprecation") — deuda técnica conocida

Los siguientes casos usan APIs deprecadas que requieren una refactorización más profunda fuera del alcance de este ticket. Se suprime el warning para mantener la salida del compilador limpia, pero quedan pendientes:

Archivo API deprecada Motivo del defer
DalSessionFactory getFilterDefinition(), getSessionFactoryOptions() Delegación forzada por la interfaz SessionFactory
SessionHandler session.saveOrUpdate(), session.delete() Migrar a merge()/remove() implica revisar comportamiento de todos los callers
OBDal Flag de rollback en refresh Requiere análisis de impacto en manejo de transacciones
OBQuery Raw type en deleteQuery() Limitación del API de Hibernate queries sin tipo
OBInstantiator EntityInstantiator SPI SPI en evolución en Hibernate 6
OBContext AcctSchemaStructureProvider Clase marcada deprecated sin reemplazo aún disponible
XMLEntityConverter, StaxXMLEntityConverter BaseXMLEntityConverter Clase base deprecated sin reemplazo directo — refactor estructural pendiente
NonTRXMetadataContributor MetadataContributor Marcado para removal en Hibernate futuro, sin alternativa disponible aún

@RomanMagnoli
RomanMagnoli requested a review from Copilot June 2, 2026 16:13
@RomanMagnoli RomanMagnoli self-assigned this Jun 2, 2026
@RomanMagnoli RomanMagnoli added the enhancement New feature or request label Jun 2, 2026
Comment thread build.xml
Comment thread src-db/database/build.xml
Comment thread src-util/buildvalidation/build.xml
Comment thread src/com/etendoerp/redis/interfaces/CachedConcurrentMap.java
Comment thread src-wad/build.xml
Comment thread src/org/openbravo/dal/core/OBInterceptor.java

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR targets Java 27 deprecation/build warnings and Hibernate 6-related API updates by standardizing Log4j2 configuration for Ant-executed Java tasks and refactoring several DAL/Hibernate integration points (interceptors, generators, queries) to newer signatures/APIs.

Changes:

  • Standardize Log4j2 initialization across Ant build targets by passing -Dlog4j.configurationFile=${base.config}/log4j2.xml to many <java> tasks.
  • Update Hibernate/DAL integration to reduce warnings and align with newer Hibernate APIs (typed native queries, interceptor signatures, generator interfaces, deprecation suppressions).
  • Modernize a few supporting utilities/configurations (Freemarker configuration versioning, UUID generator, Redisson LocalCachedMapOptions API usage, Gradle DSL warnings).

Reviewed changes

Copilot reviewed 27 out of 28 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/org/openbravo/service/db/DataImportService.java Uses Hibernate-native mutation query API for UPDATE statements.
src/org/openbravo/dal/xml/XMLEntityConverter.java Suppresses deprecation warnings at class level for Hibernate migration noise.
src/org/openbravo/dal/xml/StaxXMLEntityConverter.java Suppresses deprecation warnings at class level for Hibernate migration noise.
src/org/openbravo/dal/service/OBQuery.java Extends suppression to cover deprecation warnings in delete-query creation.
src/org/openbravo/dal/service/OBDal.java Suppresses deprecation warnings on Hibernate 6 refresh-handling helper.
src/org/openbravo/dal/security/OrganizationStructureProvider.java Converts raw native query usage to typed NativeQuery<Object[]>.
src/org/openbravo/dal/core/SessionHandler.java Suppresses deprecation warnings for pool-aware save/delete overloads.
src/org/openbravo/dal/core/OBInterceptor.java Migrates from EmptyInterceptor to Interceptor and updates callback signatures.
src/org/openbravo/dal/core/OBInstantiator.java Suppresses deprecation warnings for Hibernate instantiator SPI usage.
src/org/openbravo/dal/core/OBContext.java Adds targeted deprecation suppressions around acct schema provider fields/methods.
src/org/openbravo/dal/core/DalSessionFactory.java Suppresses deprecations on a couple of delegated SessionFactory methods.
src/org/openbravo/base/session/SessionFactoryController.java Updates JDBC property key usage and changes pool shutdown to use unwrapped implementor.
src/org/openbravo/base/session/DalUUIDGenerator.java Reworks UUID generation to IdentifierGenerator using UUID.randomUUID() normalization.
src/org/openbravo/base/model/ModelSessionFactoryController.java Migrates local interceptor from EmptyInterceptor to Interceptor with updated signatures.
src/org/openbravo/base/gen/GenerateEntitiesTask.java Uses explicit Freemarker versioned Configuration/DefaultObjectWrapper constructors.
src/com/etendoerp/sequences/services/NonTRXMetadataContributor.java Adds suppression for “removal” warnings.
src/com/etendoerp/sequences/DefaultSequenceGenerator.java Migrates sequence generator to Hibernate 6 generator APIs (BeforeExecutionGenerator, etc.).
src/com/etendoerp/redis/interfaces/CachedConcurrentMap.java Updates Redisson LocalCachedMapOptions package/API usage and local-cached map creation.
src/build.xml Adds Log4j2 sysproperty to Ant java tasks; adds cleanup before entity generation.
src-wad/build.xml Adds Log4j2 sysproperty to Ant java tasks.
src-util/modulescript/build.xml Adds Log4j2 sysproperty to Ant java tasks.
src-util/buildvalidation/build.xml Adds Log4j2 sysproperty to Ant java tasks.
src-trl/build.xml Adds Log4j2 sysproperty to Ant java tasks.
src-db/database/build.xml Adds Log4j2 sysproperty to Ant java tasks.
modules_core/org.openbravo.service.json/src-test/org/openbravo/service/json/test/JsonConversionTest.java Updates interceptor callback signatures to match Hibernate API changes.
modules_core/org.openbravo.client.kernel/src/org/openbravo/client/kernel/event/PersistenceEventOBInterceptor.java Updates interceptor callback signatures and removes unused Serializable import.
build.xml Adds Log4j2 sysproperty to Ant java tasks.
build.gradle Fixes Gradle DSL deprecation warnings (property assignment style).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/com/etendoerp/sequences/DefaultSequenceGenerator.java
Comment thread src/org/openbravo/dal/service/OBDal.java
Comment thread src/org/openbravo/base/session/SessionFactoryController.java
Comment thread src/org/openbravo/base/session/SessionFactoryController.java
Comment thread src/org/openbravo/dal/xml/StaxXMLEntityConverter.java
Comment thread src/org/openbravo/dal/xml/XMLEntityConverter.java
Comment thread src/com/etendoerp/sequences/DefaultSequenceGenerator.java
@etendobot

Copy link
Copy Markdown
Collaborator

Warning

Git Police 👮

One or more commit messages do not meet the required standards. Please correct them.

For more information, visit: Methodology for repository managment

1 similar comment
@etendobot

Copy link
Copy Markdown
Collaborator

Warning

Git Police 👮

One or more commit messages do not meet the required standards. Please correct them.

For more information, visit: Methodology for repository managment

@RomanMagnoli
RomanMagnoli force-pushed the feature/ETP-4129-Y27 branch from a8fed3b to fc064e1 Compare June 10, 2026 17:34
@etendobot

Copy link
Copy Markdown
Collaborator

Warning

Git Police 👮

One or more commit messages do not meet the required standards. Please correct them.

For more information, visit: Methodology for repository managment

@RomanMagnoli
RomanMagnoli force-pushed the feature/ETP-4129-Y27 branch from fc064e1 to 3fc1a7c Compare June 10, 2026 17:47
@etendobot

Copy link
Copy Markdown
Collaborator

Warning

Git Police 👮

One or more commit messages do not meet the required standards. Please correct them.

For more information, visit: Methodology for repository managment

@RomanMagnoli
RomanMagnoli force-pushed the feature/ETP-4129-Y27 branch from 3fc1a7c to b8ef1a4 Compare June 10, 2026 17:51
@sonarscanetendo

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants