HHH-10499 - Can't set ConnectionProvider instance, regression
(cherry picked from commit f076b5823c
)
This commit is contained in:
parent
3f9df3c4a9
commit
39ce4eee79
|
@ -23,14 +23,13 @@ import org.hibernate.boot.registry.StandardServiceInitiator;
|
||||||
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||||
|
import org.hibernate.internal.CoreLogging;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.internal.log.DeprecationLogger;
|
import org.hibernate.internal.log.DeprecationLogger;
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.internal.util.beans.BeanInfoHelper;
|
import org.hibernate.internal.util.beans.BeanInfoHelper;
|
||||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates and configures an appropriate {@link ConnectionProvider}.
|
* Instantiates and configures an appropriate {@link ConnectionProvider}.
|
||||||
*
|
*
|
||||||
|
@ -39,10 +38,7 @@ import org.jboss.logging.Logger;
|
||||||
* @author Brett Meyer
|
* @author Brett Meyer
|
||||||
*/
|
*/
|
||||||
public class ConnectionProviderInitiator implements StandardServiceInitiator<ConnectionProvider> {
|
public class ConnectionProviderInitiator implements StandardServiceInitiator<ConnectionProvider> {
|
||||||
private static final CoreMessageLogger LOG = Logger.getMessageLogger(
|
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( ConnectionProviderInitiator.class );
|
||||||
CoreMessageLogger.class,
|
|
||||||
ConnectionProviderInitiator.class.getName()
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Singleton access
|
* Singleton access
|
||||||
|
@ -104,15 +100,41 @@ public class ConnectionProviderInitiator implements StandardServiceInitiator<Con
|
||||||
}
|
}
|
||||||
|
|
||||||
final StrategySelector strategySelector = registry.getService( StrategySelector.class );
|
final StrategySelector strategySelector = registry.getService( StrategySelector.class );
|
||||||
|
final Object explicitSetting = configurationValues.get( AvailableSettings.CONNECTION_PROVIDER );
|
||||||
|
if ( explicitSetting != null ) {
|
||||||
|
// if we are explicitly supplied a ConnectionProvider to use (in some form) -> use it..
|
||||||
|
if ( explicitSetting instanceof ConnectionProvider ) {
|
||||||
|
return (ConnectionProvider) explicitSetting;
|
||||||
|
}
|
||||||
|
else if ( explicitSetting instanceof Class ) {
|
||||||
|
final Class providerClass = (Class) explicitSetting;
|
||||||
|
LOG.instantiatingExplicitConnectionProvider( providerClass.getName() );
|
||||||
|
return instantiateExplicitConnectionProvider( providerClass );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String providerName = explicitSetting.toString();
|
||||||
|
if ( LEGACY_CONNECTION_PROVIDER_MAPPING.containsKey( providerName ) ) {
|
||||||
|
final String actualProviderName = LEGACY_CONNECTION_PROVIDER_MAPPING.get( providerName );
|
||||||
|
DeprecationLogger.DEPRECATION_LOGGER.connectionProviderClassDeprecated( providerName, actualProviderName );
|
||||||
|
providerName = actualProviderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.instantiatingExplicitConnectionProvider( providerName );
|
||||||
|
final Class providerClass = strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
|
||||||
|
try {
|
||||||
|
return instantiateExplicitConnectionProvider( providerClass );
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new HibernateException( "Could not instantiate connection provider [" + providerName + "]", e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( configurationValues.get( AvailableSettings.DATASOURCE ) != null ) {
|
||||||
|
return new DatasourceConnectionProviderImpl();
|
||||||
|
}
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = null;
|
ConnectionProvider connectionProvider = null;
|
||||||
final String providerName = getConfiguredConnectionProviderName( configurationValues );
|
|
||||||
if ( providerName != null ) {
|
|
||||||
connectionProvider = instantiateExplicitConnectionProvider( providerName, strategySelector );
|
|
||||||
}
|
|
||||||
else if ( configurationValues.get( AvailableSettings.DATASOURCE ) != null ) {
|
|
||||||
connectionProvider = new DatasourceConnectionProviderImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( connectionProvider == null ) {
|
if ( connectionProvider == null ) {
|
||||||
if ( c3p0ConfigDefined( configurationValues ) ) {
|
if ( c3p0ConfigDefined( configurationValues ) ) {
|
||||||
|
@ -170,29 +192,13 @@ public class ConnectionProviderInitiator implements StandardServiceInitiator<Con
|
||||||
return connectionProvider;
|
return connectionProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getConfiguredConnectionProviderName( Map configurationValues ) {
|
private ConnectionProvider instantiateExplicitConnectionProvider(Class providerClass) {
|
||||||
String providerName = (String) configurationValues.get( AvailableSettings.CONNECTION_PROVIDER );
|
try {
|
||||||
if ( LEGACY_CONNECTION_PROVIDER_MAPPING.containsKey( providerName ) ) {
|
return (ConnectionProvider) providerClass.newInstance();
|
||||||
final String actualProviderName = LEGACY_CONNECTION_PROVIDER_MAPPING.get( providerName );
|
}
|
||||||
DeprecationLogger.DEPRECATION_LOGGER.connectionProviderClassDeprecated( providerName, actualProviderName );
|
catch (Exception e) {
|
||||||
providerName = actualProviderName;
|
throw new HibernateException( "Could not instantiate connection provider [" + providerClass.getName() + "]", e );
|
||||||
}
|
}
|
||||||
return providerName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConnectionProvider instantiateExplicitConnectionProvider(
|
|
||||||
String providerName,
|
|
||||||
StrategySelector strategySelector) {
|
|
||||||
try {
|
|
||||||
LOG.instantiatingExplicitConnectionProvider( providerName );
|
|
||||||
// This relies on selectStrategyImplementor trying
|
|
||||||
// classLoaderService.classForName( name ).
|
|
||||||
// TODO: Maybe we shouldn't rely on that here and do it manually?
|
|
||||||
return strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName ).newInstance();
|
|
||||||
}
|
|
||||||
catch ( Exception e ) {
|
|
||||||
throw new HibernateException( "Could not instantiate connection provider [" + providerName + "]", e );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean c3p0ConfigDefined(Map configValues) {
|
private static boolean c3p0ConfigDefined(Map configValues) {
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.connections;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
|
||||||
|
|
||||||
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class ExplicitConnectionProviderInstanceTest extends BaseUnitTestCase {
|
||||||
|
@Test
|
||||||
|
public void testPassingConnectionProviderInstanceToBootstrap() {
|
||||||
|
StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
|
||||||
|
.applySetting( AvailableSettings.CONNECTION_PROVIDER, TestingConnectionProviderImpl.INSTANCE )
|
||||||
|
.build();
|
||||||
|
try {
|
||||||
|
assert ssr.getService( ConnectionProvider.class ) == TestingConnectionProviderImpl.INSTANCE;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
StandardServiceRegistryBuilder.destroy( ssr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TestingConnectionProviderImpl implements ConnectionProvider {
|
||||||
|
/**
|
||||||
|
* Singleton access
|
||||||
|
*/
|
||||||
|
public static final TestingConnectionProviderImpl INSTANCE = new TestingConnectionProviderImpl();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Connection getConnection() throws SQLException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeConnection(Connection conn) throws SQLException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsAggressiveRelease() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isUnwrappableAs(Class unwrapType) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T unwrap(Class<T> unwrapType) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue