@Override
public DataSource create(DataSourceFactory dsf, Properties props) throws SQLException {
try {
XADataSource ds = dsf.createXADataSource(getNonPoolProps(props));
DataSourceXAConnectionFactory connFactory = new DataSourceXAConnectionFactory(tm, ds);
PoolableManagedConnectionFactory pcf = new PoolableManagedConnectionFactory(connFactory, null);
GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
BeanConfig.configure(conf, getPoolProps(props));
BeanConfig.configure(pcf, getPrefixed(props, FACTORY_PREFIX));
GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>(pcf, conf);
pcf.setPool(pool);
TransactionRegistry transactionRegistry = connFactory.getTransactionRegistry();
return new ManagedDataSource<PoolableConnection>(pool, transactionRegistry);
}
catch (Throwable e) {
LOG.error("Error creating pooled datasource: " + e.getMessage(), e);
if (e instanceof SQLException) {
throw (SQLException) e;
}
else if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
else {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}