use of io.agroal.api.AgroalDataSource in project hibernate-orm by hibernate.
the class AgroalConnectionProvider method configure.
@Override
@SuppressWarnings("unchecked")
public void configure(Map props) throws HibernateException {
LOGGER.debug("Configuring Agroal");
try {
AgroalPropertiesReader agroalProperties = new AgroalPropertiesReader(CONFIG_PREFIX).readProperties(props);
agroalProperties.modify().connectionPoolConfiguration(cp -> cp.connectionFactoryConfiguration(cf -> {
copyProperty(props, AvailableSettings.DRIVER, cf::driverClassName, Function.identity());
copyProperty(props, AvailableSettings.URL, cf::jdbcUrl, Function.identity());
copyProperty(props, AvailableSettings.USER, cf::principal, NamePrincipal::new);
copyProperty(props, AvailableSettings.PASS, cf::credential, SimplePassword::new);
copyProperty(props, AvailableSettings.AUTOCOMMIT, cf::autoCommit, Boolean::valueOf);
resolveIsolationSetting(props, cf);
return cf;
}));
agroalDataSource = AgroalDataSource.from(agroalProperties);
} catch (Exception e) {
throw new HibernateException(e);
}
LOGGER.debug("Agroal Configured");
}
use of io.agroal.api.AgroalDataSource in project indy by Commonjava.
the class ConnectionPoolProvider method init.
public void init() throws IndyLifecycleException {
logger.info("Starting connection pool binding...");
Properties properties = System.getProperties();
properties.setProperty(INITIAL_CONTEXT_FACTORY, CPInitialContextFactory.class.getName());
System.setProperties(properties);
InitialContext ctx;
try {
ctx = new InitialContext();
} catch (NamingException e) {
throw new IndyLifecycleException("Failed to create JNDI InitialContext for binding datasources", e);
}
Map<String, ConnectionPoolInfo> poolConfigs = config.getPools();
logger.info("Creating bindings for {} pools from config: {}", poolConfigs.size(), config);
for (ConnectionPoolInfo poolInfo : poolConfigs.values()) {
try {
AgroalPropertiesReader propertiesReader = new AgroalPropertiesReader(ConnectionPoolConfig.DS_PROPERTY_PREFIX);
AgroalDataSourceConfiguration config = propertiesReader.readProperties(poolInfo.getProperties()).get();
config.setMetricsEnabled(poolInfo.isUseMetrics());
AgroalDataSource ds = AgroalDataSource.from(config, new AgroalDataSourceLogger(poolInfo.getName()));
if (poolInfo.isUseMetrics()) {
registerMetrics(ds.getMetrics(), poolInfo.getName());
}
if (poolInfo.isUseHealthChecks()) {
registerHealthChecks(ds, poolInfo.getName());
}
String jndiName = "java:/comp/env/jdbc/" + poolInfo.getName();
logger.info("Binding datasource: {}", jndiName);
ctx.rebind(jndiName, ds);
} catch (NamingException e) {
throw new IndyLifecycleException("Failed to bind datasource: " + poolInfo.getName(), e);
} catch (SQLException e) {
throw new IndyLifecycleException("Failed to start datasource: " + poolInfo.getName(), e);
}
}
}
use of io.agroal.api.AgroalDataSource in project wildfly by wildfly.
the class DataSourceService method start.
@Override
public void start(StartContext context) throws StartException {
Class<?> providerClass = driverInjector.getOptionalValue();
if (xa) {
if (!XADataSource.class.isAssignableFrom(providerClass)) {
throw AgroalLogger.SERVICE_LOGGER.invalidXAConnectionProvider();
}
} else {
if (providerClass != null && !DataSource.class.isAssignableFrom(providerClass) && !Driver.class.isAssignableFrom(providerClass)) {
throw AgroalLogger.SERVICE_LOGGER.invalidConnectionProvider();
}
}
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().connectionProviderClass(providerClass);
if (jta || xa) {
TransactionManager transactionManager = ContextTransactionManager.getInstance();
TransactionSynchronizationRegistry transactionSynchronizationRegistry = transactionSynchronizationRegistryInjector.getValue();
if (transactionManager == null || transactionSynchronizationRegistry == null) {
throw AgroalLogger.SERVICE_LOGGER.missingTransactionManager();
}
TransactionIntegration txIntegration = new NarayanaTransactionIntegration(transactionManager, transactionSynchronizationRegistry, jndiName, connectable);
dataSourceConfiguration.connectionPoolConfiguration().transactionIntegration(txIntegration);
}
AuthenticationContext authenticationContext = authenticationContextInjector.getOptionalValue();
if (authenticationContext != null) {
try {
// Probably some other thing should be used as URI. Using jndiName for consistency with the datasources subsystem (simplicity as a bonus)
URI targetURI = new URI(jndiName);
NameCallback nameCallback = new NameCallback("Username: ");
PasswordCallback passwordCallback = new PasswordCallback("Password: ", false);
CredentialCallback credentialCallback = new CredentialCallback(GSSKerberosCredential.class);
AuthenticationConfiguration authenticationConfiguration = AUTH_CONFIG_CLIENT.getAuthenticationConfiguration(targetURI, authenticationContext, -1, "jdbc", "jboss");
AUTH_CONFIG_CLIENT.getCallbackHandler(authenticationConfiguration).handle(new Callback[] { nameCallback, passwordCallback, credentialCallback });
// if a GSSKerberosCredential was found, add the enclosed GSSCredential and KerberosTicket to the private set in the Subject.
if (credentialCallback.getCredential() != null) {
GSSKerberosCredential kerberosCredential = credentialCallback.getCredential(GSSKerberosCredential.class);
// use the GSSName to build a kerberos principal
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().principal(new NamePrincipal(kerberosCredential.getGssCredential().getName().toString()));
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().credential(kerberosCredential.getKerberosTicket());
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().credential(kerberosCredential.getGssCredential());
}
// use the name / password from the callbacks
if (nameCallback.getName() != null) {
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().principal(new NamePrincipal(nameCallback.getName()));
}
if (passwordCallback.getPassword() != null) {
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().credential(new SimplePassword(new String(passwordCallback.getPassword())));
}
} catch (URISyntaxException | UnsupportedCallbackException | IOException | GSSException e) {
throw AgroalLogger.SERVICE_LOGGER.invalidAuthentication(e, dataSourceName);
}
}
ExceptionSupplier<CredentialSource, Exception> credentialSourceExceptionExceptionSupplier = credentialSourceSupplierInjector.getOptionalValue();
if (credentialSourceExceptionExceptionSupplier != null) {
try {
String password = new String(credentialSourceExceptionExceptionSupplier.get().getCredential(PasswordCredential.class).getPassword(ClearPassword.class).getPassword());
dataSourceConfiguration.connectionPoolConfiguration().connectionFactoryConfiguration().credential(new SimplePassword(password));
} catch (Exception e) {
throw AgroalLogger.SERVICE_LOGGER.invalidCredentialSourceSupplier(e, dataSourceName);
}
}
try {
agroalDataSource = AgroalDataSource.from(dataSourceConfiguration, new LoggingDataSourceListener(dataSourceName));
ContextNames.BindInfo bindInfo = ContextNames.bindInfoFor(jndiName);
BinderService binderService = new BinderService(bindInfo.getBindName());
binderService.getManagedObjectInjector().inject(new ImmediateManagedReferenceFactory(agroalDataSource));
context.getChildTarget().addService(bindInfo.getBinderServiceName(), binderService).addDependency(bindInfo.getParentContextServiceName(), ServiceBasedNamingStore.class, binderService.getNamingStoreInjector()).install();
if (xa) {
AgroalLogger.SERVICE_LOGGER.startedXADataSource(dataSourceName, jndiName);
} else {
AgroalLogger.SERVICE_LOGGER.startedDataSource(dataSourceName, jndiName);
}
} catch (SQLException e) {
agroalDataSource = null;
if (xa) {
throw AgroalLogger.SERVICE_LOGGER.xaDatasourceStartException(e, dataSourceName);
} else {
throw AgroalLogger.SERVICE_LOGGER.datasourceStartException(e, dataSourceName);
}
}
}
Aggregations