From fcc1e8a15bf382df24f99811b1c1a0676411bfab Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sun, 10 Aug 2025 17:05:18 +1000 Subject: [PATCH] fix "weird" unwrap logic in the ConnectionProviders --- .../internal/AgroalConnectionProvider.java | 23 ++++++++----------- .../c3p0/internal/C3P0ConnectionProvider.java | 10 ++++---- .../DatasourceConnectionProviderImpl.java | 13 +++++------ .../DriverManagerConnectionProviderImpl.java | 6 ++--- .../internal/HikariCPConnectionProvider.java | 15 ++++++------ 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java b/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java index 9008ec5f5ab9..330ebdcd24ae 100644 --- a/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java +++ b/hibernate-agroal/src/main/java/org/hibernate/agroal/internal/AgroalConnectionProvider.java @@ -7,7 +7,6 @@ import java.io.Serial; import java.sql.Connection; import java.sql.SQLException; -import javax.sql.DataSource; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -84,9 +83,9 @@ public class AgroalConnectionProvider implements ConnectionProvider, Configurabl private static String extractIsolationAsString(Map properties) { final Integer isolation = ConnectionProviderInitiator.extractIsolation( properties ); - return isolation != null ? + return isolation != null // Agroal resolves transaction isolation from the 'nice' name - toIsolationNiceName( isolation ) + ? toIsolationNiceName( isolation ) : null; } @@ -116,9 +115,7 @@ public void configure(Map properties) throws HibernateException : String.valueOf( 10 ); config.put( AgroalSettings.AGROAL_MAX_SIZE, maxSize ); } - final AgroalPropertiesReader agroalProperties = - new AgroalPropertiesReader( CONFIG_PREFIX ) - .readProperties( config ); + final var agroalProperties = new AgroalPropertiesReader( CONFIG_PREFIX ).readProperties( config ); agroalProperties.modify() .connectionPoolConfiguration( cp -> cp.connectionFactoryConfiguration( cf -> { copyProperty( properties, JdbcSettings.DRIVER, cf::connectionProviderClassName, identity() ); @@ -205,22 +202,22 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { @Override public boolean isUnwrappableAs(Class unwrapType) { - return ConnectionProvider.class.equals( unwrapType ) - || AgroalConnectionProvider.class.isAssignableFrom( unwrapType ) - || DataSource.class.isAssignableFrom( unwrapType ); + return unwrapType.isAssignableFrom( AgroalConnectionProvider.class ) + || unwrapType.isAssignableFrom( AgroalDataSource.class ); } @Override @SuppressWarnings( "unchecked" ) public T unwrap(Class unwrapType) { - if ( ConnectionProvider.class.equals( unwrapType ) - || AgroalConnectionProvider.class.isAssignableFrom( unwrapType ) ) { + if ( unwrapType.isAssignableFrom( AgroalConnectionProvider.class ) ) { return (T) this; } - if ( DataSource.class.isAssignableFrom( unwrapType ) ) { + else if ( unwrapType.isAssignableFrom( AgroalDataSource.class ) ) { return (T) agroalDataSource; } - throw new UnknownUnwrapTypeException( unwrapType ); + else { + throw new UnknownUnwrapTypeException( unwrapType ); + } } // --- Stoppable diff --git a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java index 77cc27f67e95..232f2e8297f3 100644 --- a/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java +++ b/hibernate-c3p0/src/main/java/org/hibernate/c3p0/internal/C3P0ConnectionProvider.java @@ -115,19 +115,17 @@ public void closeConnection(Connection connection) throws SQLException { @Override public boolean isUnwrappableAs(Class unwrapType) { - return ConnectionProvider.class.equals( unwrapType ) - || C3P0ConnectionProvider.class.isAssignableFrom( unwrapType ) - || DataSource.class.isAssignableFrom( unwrapType ); + return unwrapType.isAssignableFrom( C3P0ConnectionProvider.class ) + || unwrapType.isAssignableFrom( DataSource.class ); } @Override @SuppressWarnings("unchecked") public T unwrap(Class unwrapType) { - if ( ConnectionProvider.class.equals( unwrapType ) - || C3P0ConnectionProvider.class.isAssignableFrom( unwrapType ) ) { + if ( unwrapType.isAssignableFrom( C3P0ConnectionProvider.class ) ) { return (T) this; } - else if ( DataSource.class.isAssignableFrom( unwrapType ) ) { + else if ( unwrapType.isAssignableFrom( DataSource.class ) ) { return (T) dataSource; } else { diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java index 8e747671c26c..6877fa533e94 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DatasourceConnectionProviderImpl.java @@ -40,7 +40,8 @@ * @author Gavin King * @author Steve Ebersole */ -public class DatasourceConnectionProviderImpl implements ConnectionProvider, Configurable, Stoppable { +public class DatasourceConnectionProviderImpl + implements ConnectionProvider, Configurable, Stoppable { private DataSource dataSource; private String user; @@ -67,19 +68,17 @@ public void setJndiService(JndiService jndiService) { @Override public boolean isUnwrappableAs(Class unwrapType) { - return ConnectionProvider.class.equals( unwrapType ) - || DatasourceConnectionProviderImpl.class.isAssignableFrom( unwrapType ) - || DataSource.class.isAssignableFrom( unwrapType ); + return unwrapType.isAssignableFrom( DatasourceConnectionProviderImpl.class ) + || unwrapType.isAssignableFrom( DataSource.class); } @Override @SuppressWarnings("unchecked") public T unwrap(Class unwrapType) { - if ( ConnectionProvider.class.equals( unwrapType ) - || DatasourceConnectionProviderImpl.class.isAssignableFrom( unwrapType ) ) { + if ( unwrapType.isAssignableFrom( DatasourceConnectionProviderImpl.class ) ) { return (T) this; } - else if ( DataSource.class.isAssignableFrom( unwrapType ) ) { + else if ( unwrapType.isAssignableFrom( DataSource.class) ) { return (T) getDataSource(); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index 35dbcad27f0a..2450ccecf331 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -318,15 +318,13 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { @Override public boolean isUnwrappableAs(Class unwrapType) { - return ConnectionProvider.class.equals( unwrapType ) || - DriverManagerConnectionProviderImpl.class.isAssignableFrom( unwrapType ); + return unwrapType.isAssignableFrom( DriverManagerConnectionProviderImpl.class ); } @Override @SuppressWarnings( {"unchecked"}) public T unwrap(Class unwrapType) { - if ( ConnectionProvider.class.equals( unwrapType ) || - DriverManagerConnectionProviderImpl.class.isAssignableFrom( unwrapType ) ) { + if ( unwrapType.isAssignableFrom( DriverManagerConnectionProviderImpl.class ) ) { return (T) this; } else { diff --git a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java index d134e2dc95e2..decf33c77a61 100644 --- a/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java +++ b/hibernate-hikaricp/src/main/java/org/hibernate/hikaricp/internal/HikariCPConnectionProvider.java @@ -7,7 +7,6 @@ import java.io.Serial; import java.sql.Connection; import java.sql.SQLException; -import javax.sql.DataSource; import java.util.Map; import org.hibernate.HibernateException; @@ -140,21 +139,23 @@ public DatabaseConnectionInfo getDatabaseConnectionInfo(Dialect dialect) { @Override public boolean isUnwrappableAs(Class unwrapType) { - return ConnectionProvider.class.equals( unwrapType ) - || HikariCPConnectionProvider.class.isAssignableFrom( unwrapType ) - || DataSource.class.isAssignableFrom( unwrapType ); + return unwrapType.isAssignableFrom( HikariCPConnectionProvider.class ) + || unwrapType.isAssignableFrom( HikariDataSource.class ) + || unwrapType.isAssignableFrom( HikariConfig.class ); } @Override @SuppressWarnings("unchecked") public T unwrap(Class unwrapType) { - if ( ConnectionProvider.class.equals( unwrapType ) - || HikariCPConnectionProvider.class.isAssignableFrom( unwrapType ) ) { + if ( unwrapType.isAssignableFrom( HikariCPConnectionProvider.class ) ) { return (T) this; } - else if ( DataSource.class.isAssignableFrom( unwrapType ) ) { + else if ( unwrapType.isAssignableFrom( HikariDataSource.class ) ) { return (T) hikariDataSource; } + else if ( unwrapType.isAssignableFrom( HikariConfig.class ) ) { + return (T) hikariConfig; + } else { throw new UnknownUnwrapTypeException( unwrapType ); }