Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,14 @@
public interface MultiTenancySettings {

/**
* Specifies a {@link MultiTenantConnectionProvider}
* to use. Since {@code MultiTenantConnectionProvider} is also a service, it may be configured
* Specifies a {@link MultiTenantConnectionProvider} to use, either:
* <ul>
* <li>an instance of {@code MultiTenantConnectionProvider},
* <li>a {@link Class} representing a class that implements {@code MultiTenantConnectionProvider}, or
* <li>the name of a class that implements {@code MultiTenantConnectionProvider}.
* </ul>
*
* Since {@code MultiTenantConnectionProvider} is also a service, it may be configured
* directly via the {@link org.hibernate.boot.registry.StandardServiceRegistryBuilder}.
*
* @since 4.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
Expand All @@ -24,6 +23,7 @@
import org.hibernate.resource.beans.internal.Helper;
import org.hibernate.service.spi.ServiceRegistryImplementor;

import static java.lang.Integer.parseInt;
import static java.sql.Connection.TRANSACTION_NONE;
import static java.sql.Connection.TRANSACTION_READ_COMMITTED;
import static java.sql.Connection.TRANSACTION_READ_UNCOMMITTED;
Expand Down Expand Up @@ -90,8 +90,8 @@ public ConnectionProvider initiateService(
return null;
}

final BeanContainer beanContainer = Helper.getBeanContainer( registry );
final StrategySelector strategySelector = registry.requireService( StrategySelector.class );
final var beanContainer = Helper.getBeanContainer( registry );
final var strategySelector = registry.requireService( StrategySelector.class );
final Object explicitSetting = configurationValues.get( CONNECTION_PROVIDER );
if ( explicitSetting != null ) {
// if we are explicitly supplied a ConnectionProvider to use (in some form) -> use it..
Expand All @@ -118,17 +118,15 @@ private static Class<? extends ConnectionProvider> connectionProviderClass(Class
throw new ConnectionProviderConfigurationException( "Class '" + providerClass.getName()
+ "' does not implement 'ConnectionProvider'" );
}
@SuppressWarnings("unchecked")
final Class<? extends ConnectionProvider> connectionProviderClass =
(Class<? extends ConnectionProvider>) providerClass;
@SuppressWarnings("unchecked") // Safe, we just checked
final var connectionProviderClass = (Class<? extends ConnectionProvider>) providerClass;
return connectionProviderClass;
}

private ConnectionProvider instantiateNamedConnectionProvider(
String providerName, StrategySelector strategySelector, BeanContainer beanContainer) {
LOG.instantiatingExplicitConnectionProvider( providerName );
final Class<? extends ConnectionProvider> providerClass =
strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
final var providerClass = strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
try {
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
}
Expand All @@ -143,8 +141,7 @@ private ConnectionProvider instantiateConnectionProvider(
return new DataSourceConnectionProvider();
}

final Class<? extends ConnectionProvider> singleRegisteredProvider =
getSingleRegisteredProvider( strategySelector );
final var singleRegisteredProvider = getSingleRegisteredProvider( strategySelector );
if ( singleRegisteredProvider != null ) {
try {
return singleRegisteredProvider.getConstructor().newInstance();
Expand Down Expand Up @@ -188,8 +185,7 @@ private ConnectionProvider noAppropriateConnectionProvider() {
}

private Class<? extends ConnectionProvider> getSingleRegisteredProvider(StrategySelector strategySelector) {
final Collection<Class<? extends ConnectionProvider>> implementors =
strategySelector.getRegisteredStrategyImplementors( ConnectionProvider.class );
final var implementors = strategySelector.getRegisteredStrategyImplementors( ConnectionProvider.class );
return implementors != null && implementors.size() == 1
? implementors.iterator().next()
: null;
Expand Down Expand Up @@ -245,7 +241,7 @@ private static ConnectionProvider instantiateProvider(StrategySelector selector,
* @return The connection properties.
*/
public static Properties getConnectionProperties(Map<String, Object> properties) {
final Properties result = new Properties();
final var result = new Properties();
for ( var entry : properties.entrySet() ) {
if ( entry.getValue() instanceof String value ) {
final String key = entry.getKey();
Expand Down Expand Up @@ -343,7 +339,7 @@ else if ( ISOLATION_VALUE_MAP.containsKey( string ) ) {
else {
// it could be a String representation of the isolation numeric value
try {
final int isolationLevel = Integer.parseInt( string );
final int isolationLevel = parseInt( string );
checkIsolationLevel( isolationLevel );
return isolationLevel;
}
Expand Down Expand Up @@ -397,8 +393,8 @@ public static String toIsolationNiceName(Integer isolation) {

public static String extractSetting(Map<String, Object> settings, String... names) {
for ( String name : names ) {
if ( settings.containsKey(name) ) {
return (String) settings.get(name);
if ( settings.containsKey( name ) ) {
return (String) settings.get( name );
}
}
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.JdbcSettings;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
import org.hibernate.engine.jdbc.connections.spi.DataSourceBasedMultiTenantConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.resource.beans.internal.Helper;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceRegistryImplementor;

import org.jboss.logging.Logger;
import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_CONNECTION_PROVIDER;

/**
* A service initiator for the {@link MultiTenantConnectionProvider} service.
*
* @author Steve Ebersole
*/
public class MultiTenantConnectionProviderInitiator implements StandardServiceInitiator<MultiTenantConnectionProvider<?>> {
private static final Logger log = Logger.getLogger( MultiTenantConnectionProviderInitiator.class );

/**
* Singleton access
Expand All @@ -39,7 +39,7 @@

@Override
public MultiTenantConnectionProvider<?> initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
if ( !configurationValues.containsKey( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER ) ) {
if ( !configurationValues.containsKey( MULTI_TENANT_CONNECTION_PROVIDER ) ) {
return Helper.getBean(
Helper.getBeanContainer( registry ),
MultiTenantConnectionProvider.class,
Expand All @@ -49,46 +49,48 @@
);
}

final Object configValue = configurationValues.get( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER );
final Object configValue = configurationValues.get( MULTI_TENANT_CONNECTION_PROVIDER );
if ( configValue == null ) {
// if they also specified the data source *name*, then lets assume they want
// if they also specified the data source *name*, then let's assume they want
// DataSourceBasedMultiTenantConnectionProviderImpl
final Object dataSourceConfigValue = configurationValues.get( AvailableSettings.DATASOURCE );
if ( dataSourceConfigValue instanceof String ) {
return new DataSourceBasedMultiTenantConnectionProviderImpl<>();
}

return null;
final Object dataSourceConfigValue = configurationValues.get( JdbcSettings.DATASOURCE );
return dataSourceConfigValue instanceof String
? new DataSourceBasedMultiTenantConnectionProviderImpl<>()
: null;
}

if ( configValue instanceof MultiTenantConnectionProvider<?> multiTenantConnectionProvider ) {
else if ( configValue instanceof MultiTenantConnectionProvider<?> multiTenantConnectionProvider ) {
return multiTenantConnectionProvider;
}
else {
final Class<MultiTenantConnectionProvider<?>> implClass;
if ( configValue instanceof Class ) {
@SuppressWarnings("unchecked")
Class<MultiTenantConnectionProvider<?>> clazz = (Class<MultiTenantConnectionProvider<?>>) configValue;
implClass = clazz;
final var providerClass = providerClass( registry, configValue );
try {
return providerClass.newInstance();

Check notice

Code scanning / CodeQL

Deprecated method or constructor invocation Note

Invoking
Class.newInstance
should be avoided because it has been deprecated.
}
else {
final String className = configValue.toString();
final ClassLoaderService classLoaderService = registry.requireService( ClassLoaderService.class );
try {
implClass = classLoaderService.classForName( className );
}
catch (ClassLoadingException cle) {
log.warn( "Unable to locate specified class [" + className + "]", cle );
throw new ServiceException( "Unable to locate specified multi-tenant connection provider [" + className + "]" );
}
catch (Exception e) {
throw new ServiceException( "Unable to instantiate specified multi-tenant connection provider [" + providerClass.getName() + "]", e );
}
}
}

private static Class<? extends MultiTenantConnectionProvider<?>> providerClass(
ServiceRegistryImplementor registry, Object configValue) {
if ( configValue instanceof Class<?> configType ) {
if ( !MultiTenantConnectionProvider.class.isAssignableFrom( configType ) ) {
throw new ConnectionProviderConfigurationException( "Class '" + configType.getName()
+ "' does not implement 'MultiTenantConnectionProvider'" );
}
@SuppressWarnings("unchecked") // Safe, we just checked
final var providerClass = (Class<? extends MultiTenantConnectionProvider<?>>) configType;
return providerClass;
}
else {
final String className = configValue.toString();
final var classLoaderService = registry.requireService( ClassLoaderService.class );
try {
return implClass.newInstance();
return classLoaderService.classForName( className );
}
catch (Exception e) {
log.warn( "Unable to instantiate specified class [" + implClass.getName() + "]", e );
throw new ServiceException( "Unable to instantiate specified multi-tenant connection provider [" + implClass.getName() + "]" );
catch (ClassLoadingException cle) {
throw new ServiceException( "Unable to locate specified multi-tenant connection provider [" + className + "]", cle );
}
}
}
Expand Down
Loading