use of org.pentaho.database.DatabaseDialectException in project pentaho-platform by pentaho.
the class PooledDatasourceHelper method convert.
@VisibleForTesting
static DataSource convert(IDatabaseConnection databaseConnection, Supplier<IDatabaseDialectService> dialectSupplier) throws DBDatasourceServiceException {
// From Spring
DriverManagerDataSource basicDatasource = new DriverManagerDataSource();
IDatabaseDialect dialect = Optional.ofNullable(dialectSupplier.get()).orElseThrow(() -> new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0001_DATASOURCE_CANNOT_LOAD_DIALECT_SVC"))).getDialect(databaseConnection);
if (databaseConnection.getDatabaseType() == null && dialect == null) {
// We do not have enough information to create a DataSource. Throwing exception
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0001_DATASOURCE_CREATE_ERROR_NO_DIALECT", databaseConnection.getName()));
}
if (databaseConnection.getDatabaseType().getShortName().equals("GENERIC")) {
// $NON-NLS-1$
String driverClassName = databaseConnection.getAttributes().get(GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS);
if (!StringUtils.isEmpty(driverClassName)) {
initDriverClass(basicDatasource, dialect, driverClassName, databaseConnection.getName());
} else {
// We do not have enough information to create a DataSource. Throwing exception
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0002_DATASOURCE_CREATE_ERROR_NO_CLASSNAME", databaseConnection.getName()));
}
} else {
if (!StringUtils.isEmpty(dialect.getNativeDriver())) {
initDriverClass(basicDatasource, dialect, dialect.getNativeDriver(), databaseConnection.getName());
} else {
// We do not have enough information to create a DataSource. Throwing exception
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0003_DATASOURCE_CREATE_ERROR_NO_DRIVER", databaseConnection.getName()));
}
}
try {
basicDatasource.setUrl(dialect.getURLWithExtraOptions(databaseConnection));
} catch (DatabaseDialectException e) {
basicDatasource.setUrl(null);
}
basicDatasource.setUsername(databaseConnection.getUsername());
basicDatasource.setPassword(databaseConnection.getPassword());
return basicDatasource;
}
use of org.pentaho.database.DatabaseDialectException in project data-access by pentaho.
the class DatasourceInMemoryServiceHelper method getConnection.
public static SQLConnection getConnection(String connectionName) throws DatasourceServiceException {
IDatabaseConnection connection = null;
try {
ConnectionServiceImpl service = new ConnectionServiceImpl();
connection = service.getConnectionByName(connectionName);
DatabaseDialectService dialectService = new DatabaseDialectService();
IDatabaseDialect dialect = dialectService.getDialect(connection);
String driverClass = null;
if (connection.getDatabaseType().getShortName().equals("GENERIC")) {
driverClass = connection.getAttributes().get(GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS);
} else {
driverClass = dialect.getNativeDriver();
}
return new SQLConnection(driverClass, dialect.getURLWithExtraOptions(connection), connection.getUsername(), connection.getPassword(), null);
} catch (ConnectionServiceException e1) {
return null;
} catch (DatabaseDialectException e) {
return null;
}
}
use of org.pentaho.database.DatabaseDialectException in project pentaho-platform by pentaho.
the class PooledDatasourceHelper method setupPooledDataSource.
public static PoolingDataSource setupPooledDataSource(IDatabaseConnection databaseConnection) throws DBDatasourceServiceException {
PoolingDataSource poolingDataSource = null;
String driverClass = null;
String url = null;
try {
if (databaseConnection.getAccessType().equals(DatabaseAccessType.JNDI)) {
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0008_UNABLE_TO_POOL_DATASOURCE_IT_IS_JNDI", databaseConnection.getName()));
}
ICacheManager cacheManager = PentahoSystem.getCacheManager(null);
IDatabaseDialectService databaseDialectService = PentahoSystem.get(IDatabaseDialectService.class);
if (databaseDialectService == null) {
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0005_UNABLE_TO_POOL_DATASOURCE_NO_DIALECT_SERVICE", databaseConnection.getName()));
}
IDatabaseDialect dialect = databaseDialectService.getDialect(databaseConnection);
if (dialect == null || dialect.getDatabaseType() == null) {
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0004_UNABLE_TO_POOL_DATASOURCE_NO_DIALECT", databaseConnection.getName()));
}
if (databaseConnection.getDatabaseType().getShortName().equals("GENERIC")) {
// $NON-NLS-1$
driverClass = databaseConnection.getAttributes().get(GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS);
if (StringUtils.isEmpty(driverClass)) {
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0006_UNABLE_TO_POOL_DATASOURCE_NO_CLASSNAME", databaseConnection.getName()));
}
} else {
driverClass = dialect.getNativeDriver();
if (StringUtils.isEmpty(driverClass)) {
throw new DBDatasourceServiceException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0007_UNABLE_TO_POOL_DATASOURCE_NO_DRIVER", databaseConnection.getName()));
}
}
try {
url = dialect.getURLWithExtraOptions(databaseConnection);
} catch (DatabaseDialectException e) {
url = null;
}
// Read default connection pooling parameter
// $NON-NLS-1$
String maxdleConn = PentahoSystem.getSystemSetting("dbcp-defaults/max-idle-conn", null);
// $NON-NLS-1$
String minIdleConn = PentahoSystem.getSystemSetting("dbcp-defaults/min-idle-conn", null);
// $NON-NLS-1$
String maxActConn = PentahoSystem.getSystemSetting("dbcp-defaults/max-act-conn", null);
String validQuery = null;
// $NON-NLS-1$
String whenExhaustedAction = PentahoSystem.getSystemSetting("dbcp-defaults/when-exhausted-action", null);
// $NON-NLS-1$
String wait = PentahoSystem.getSystemSetting("dbcp-defaults/wait", null);
// $NON-NLS-1$
String testWhileIdleValue = PentahoSystem.getSystemSetting("dbcp-defaults/test-while-idle", null);
// $NON-NLS-1$
String testOnBorrowValue = PentahoSystem.getSystemSetting("dbcp-defaults/test-on-borrow", null);
// $NON-NLS-1$
String testOnReturnValue = PentahoSystem.getSystemSetting("dbcp-defaults/test-on-return", null);
// property initialization
boolean testWhileIdle = !StringUtil.isEmpty(testWhileIdleValue) ? Boolean.parseBoolean(testWhileIdleValue) : false;
boolean testOnBorrow = !StringUtil.isEmpty(testOnBorrowValue) ? Boolean.parseBoolean(testOnBorrowValue) : false;
boolean testOnReturn = !StringUtil.isEmpty(testOnReturnValue) ? Boolean.parseBoolean(testOnReturnValue) : false;
int maxActiveConnection = !StringUtil.isEmpty(maxActConn) ? Integer.parseInt(maxActConn) : -1;
long waitTime = !StringUtil.isEmpty(wait) ? Integer.parseInt(wait) : -1;
byte whenExhaustedActionType = !StringUtil.isEmpty(whenExhaustedAction) ? Byte.parseByte(whenExhaustedAction) : GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
int minIdleConnection = !StringUtil.isEmpty(minIdleConn) ? Integer.parseInt(minIdleConn) : -1;
int maxIdleConnection = !StringUtil.isEmpty(maxdleConn) ? Integer.parseInt(maxdleConn) : -1;
// setting properties according to user specifications
Map<String, String> attributes = databaseConnection.getConnectionPoolingProperties();
if (attributes.containsKey(IDBDatasourceService.MAX_ACTIVE_KEY) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.MAX_ACTIVE_KEY))) {
maxActiveConnection = Integer.parseInt(attributes.get(IDBDatasourceService.MAX_ACTIVE_KEY));
}
if (attributes.containsKey(IDBDatasourceService.MAX_WAIT_KEY) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.MAX_WAIT_KEY))) {
waitTime = Integer.parseInt(attributes.get(IDBDatasourceService.MAX_WAIT_KEY));
}
if (attributes.containsKey(IDBDatasourceService.MIN_IDLE_KEY) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.MIN_IDLE_KEY))) {
minIdleConnection = Integer.parseInt(attributes.get(IDBDatasourceService.MIN_IDLE_KEY));
}
if (attributes.containsKey(IDBDatasourceService.MAX_IDLE_KEY) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.MAX_IDLE_KEY))) {
maxIdleConnection = Integer.parseInt(attributes.get(IDBDatasourceService.MAX_IDLE_KEY));
}
if (attributes.containsKey(IDBDatasourceService.QUERY_KEY)) {
validQuery = attributes.get(IDBDatasourceService.QUERY_KEY);
}
if (attributes.containsKey(IDBDatasourceService.TEST_ON_BORROW)) {
testOnBorrow = Boolean.parseBoolean(attributes.get(IDBDatasourceService.TEST_ON_BORROW));
}
if (attributes.containsKey(IDBDatasourceService.TEST_ON_RETURN)) {
testOnReturn = Boolean.parseBoolean(attributes.get(IDBDatasourceService.TEST_ON_RETURN));
}
if (attributes.containsKey(IDBDatasourceService.TEST_WHILE_IDLE)) {
testWhileIdle = Boolean.parseBoolean(attributes.get(IDBDatasourceService.TEST_WHILE_IDLE));
}
poolingDataSource = new PoolingDataSource();
if (dialect instanceof IDriverLocator) {
if (!((IDriverLocator) dialect).initialize(driverClass)) {
throw new DriverNotInitializedException(Messages.getInstance().getErrorString("PooledDatasourceHelper.ERROR_0009_UNABLE_TO_POOL_DATASOURCE_CANT_INITIALIZE", databaseConnection.getName(), driverClass));
}
} else {
Class.forName(driverClass);
}
// As the name says, this is a generic pool; it returns basic Object-class objects.
GenericObjectPool pool = new GenericObjectPool(null);
// if removedAbandoned = true, then an AbandonedObjectPool object will take GenericObjectPool's place
if (attributes.containsKey(IDBDatasourceService.REMOVE_ABANDONED) && true == Boolean.parseBoolean(attributes.get(IDBDatasourceService.REMOVE_ABANDONED))) {
AbandonedConfig config = new AbandonedConfig();
config.setRemoveAbandoned(Boolean.parseBoolean(attributes.get(IDBDatasourceService.REMOVE_ABANDONED)));
if (attributes.containsKey(IDBDatasourceService.LOG_ABANDONED)) {
config.setLogAbandoned(Boolean.parseBoolean(attributes.get(IDBDatasourceService.LOG_ABANDONED)));
}
if (attributes.containsKey(IDBDatasourceService.REMOVE_ABANDONED_TIMEOUT) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.REMOVE_ABANDONED_TIMEOUT))) {
config.setRemoveAbandonedTimeout(Integer.parseInt(attributes.get(IDBDatasourceService.REMOVE_ABANDONED_TIMEOUT)));
}
pool = new AbandonedObjectPool(null, config);
}
pool.setWhenExhaustedAction(whenExhaustedActionType);
// Tuning the connection pool
pool.setMaxActive(maxActiveConnection);
pool.setMaxIdle(maxIdleConnection);
pool.setMaxWait(waitTime);
pool.setMinIdle(minIdleConnection);
pool.setTestWhileIdle(testWhileIdle);
pool.setTestOnReturn(testOnReturn);
pool.setTestOnBorrow(testOnBorrow);
pool.setTestWhileIdle(testWhileIdle);
if (attributes.containsKey(IDBDatasourceService.TIME_BETWEEN_EVICTION_RUNS_MILLIS) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.TIME_BETWEEN_EVICTION_RUNS_MILLIS))) {
pool.setTimeBetweenEvictionRunsMillis(Long.parseLong(attributes.get(IDBDatasourceService.TIME_BETWEEN_EVICTION_RUNS_MILLIS)));
}
/*
* ConnectionFactory creates connections on behalf of the pool. Here, we use the DriverManagerConnectionFactory
* because that essentially uses DriverManager as the source of connections.
*/
ConnectionFactory factory = null;
if (url.startsWith("jdbc:mysql:") || (url.startsWith("jdbc:mariadb:"))) {
Properties props = new Properties();
props.put("user", databaseConnection.getUsername());
props.put("password", databaseConnection.getPassword());
props.put("socketTimeout", "0");
props.put("connectTimeout", "5000");
factory = new DriverManagerConnectionFactory(url, props);
} else {
factory = new DriverManagerConnectionFactory(url, databaseConnection.getUsername(), databaseConnection.getPassword());
}
boolean defaultReadOnly = attributes.containsKey(IDBDatasourceService.DEFAULT_READ_ONLY) ? Boolean.parseBoolean(attributes.get(IDBDatasourceService.TEST_WHILE_IDLE)) : // default to false
false;
boolean defaultAutoCommit = attributes.containsKey(IDBDatasourceService.DEFAULT_AUTO_COMMIT) ? Boolean.parseBoolean(attributes.get(IDBDatasourceService.DEFAULT_AUTO_COMMIT)) : // default to true
true;
KeyedObjectPoolFactory kopf = null;
if (attributes.containsKey(IDBDatasourceService.POOL_PREPARED_STATEMENTS) && true == Boolean.parseBoolean(attributes.get(IDBDatasourceService.POOL_PREPARED_STATEMENTS))) {
// unlimited
int maxOpenPreparedStatements = -1;
if (attributes.containsKey(IDBDatasourceService.MAX_OPEN_PREPARED_STATEMENTS) && NumberUtils.isNumber(attributes.get(IDBDatasourceService.MAX_OPEN_PREPARED_STATEMENTS))) {
maxOpenPreparedStatements = Integer.parseInt(attributes.get(IDBDatasourceService.MAX_OPEN_PREPARED_STATEMENTS));
}
kopf = new GenericKeyedObjectPoolFactory(null, pool.getMaxActive(), pool.getWhenExhaustedAction(), pool.getMaxWait(), pool.getMaxIdle(), maxOpenPreparedStatements);
}
/*
* Puts pool-specific wrappers on factory connections. For clarification: "[PoolableConnection]Factory," not
* "Poolable[ConnectionFactory]."
*/
PoolableConnectionFactory pcf = new PoolableConnectionFactory(// ConnectionFactory
factory, // ObjectPool
pool, // KeyedObjectPoolFactory
kopf, // String (validation query)
validQuery, // boolean (default to read-only?)
defaultReadOnly, // boolean (default to auto-commit statements?)
defaultAutoCommit);
if (attributes.containsKey(IDBDatasourceService.DEFAULT_TRANSACTION_ISOLATION) && !IDBDatasourceService.TRANSACTION_ISOLATION_NONE_VALUE.equalsIgnoreCase(attributes.get(IDBDatasourceService.DEFAULT_TRANSACTION_ISOLATION))) {
Isolation isolationLevel = Isolation.valueOf(attributes.get(IDBDatasourceService.DEFAULT_TRANSACTION_ISOLATION));
if (isolationLevel != null) {
pcf.setDefaultTransactionIsolation(isolationLevel.value());
}
}
if (attributes.containsKey(IDBDatasourceService.DEFAULT_CATALOG)) {
pcf.setDefaultCatalog(attributes.get(IDBDatasourceService.DEFAULT_CATALOG));
}
/*
* initialize the pool to X connections
*/
Logger.debug(PooledDatasourceHelper.class, "Pool defaults to " + maxActiveConnection + " max active/" + maxIdleConnection + "max idle" + "with " + waitTime + // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
"wait time" + // $NON-NLS-1$
" idle connections.");
String prePopulatePoolStr = PentahoSystem.getSystemSetting("dbcp-defaults/pre-populate-pool", null);
if (Boolean.parseBoolean(prePopulatePoolStr)) {
for (int i = 0; i < maxIdleConnection; ++i) {
pool.addObject();
}
if (Logger.getLogLevel() <= ILogger.DEBUG) {
Logger.debug(PooledDatasourceHelper.class, "Pool has been pre-populated with " + maxIdleConnection + " connections");
}
}
Logger.debug(PooledDatasourceHelper.class, "Pool now has " + pool.getNumActive() + " active/" + pool.getNumIdle() + // $NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
" idle connections.");
/*
* All of this is wrapped in a DataSource, which client code should already know how to handle (since it's the
* same class of object they'd fetch via the container's JNDI tree
*/
poolingDataSource.setPool(pool);
if (attributes.containsKey(IDBDatasourceService.ACCESS_TO_UNDERLYING_CONNECTION_ALLOWED)) {
poolingDataSource.setAccessToUnderlyingConnectionAllowed(Boolean.parseBoolean(attributes.get(IDBDatasourceService.ACCESS_TO_UNDERLYING_CONNECTION_ALLOWED)));
}
// store the pool, so we can get to it later
cacheManager.putInRegionCache(IDBDatasourceService.JDBC_POOL, databaseConnection.getName(), pool);
return (poolingDataSource);
} catch (Exception e) {
throw new DBDatasourceServiceException(e);
}
}
use of org.pentaho.database.DatabaseDialectException in project data-access by pentaho.
the class ConnectionServiceImpl method testConnection.
public boolean testConnection(IDatabaseConnection connection) throws ConnectionServiceException {
ensureDataAccessPermission();
if (connection != null) {
sanitizer.sanitizeConnectionParameters(connection);
if (connection.getPassword() == null) {
// Can have an empty password but not a null one
// $NON-NLS-1$
connection.setPassword("");
}
IDatabaseDialect dialect = dialectService.getDialect(connection);
String driverClass = null;
if (connection.getDatabaseType().getShortName().equals("GENERIC")) {
driverClass = connection.getAttributes().get(GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS);
} else {
driverClass = dialect.getNativeDriver();
}
IPentahoConnection pentahoConnection = null;
try {
if (connection.getAccessType().equals(DatabaseAccessType.JNDI)) {
pentahoConnection = PentahoConnectionFactory.getConnection(IPentahoConnection.SQL_DATASOURCE, connection.getDatabaseName(), null, this);
} else {
if (connection.isUsingConnectionPool()) {
Properties props = new Properties();
props.put(IPentahoConnection.CONNECTION_NAME, connection.getName());
props.put(IPentahoConnection.CONNECTION, connection);
pentahoConnection = PentahoConnectionFactory.getConnection(IPentahoConnection.SQL_DATASOURCE, props, null, this);
} else {
pentahoConnection = PentahoConnectionFactory.getConnection(IPentahoConnection.SQL_DATASOURCE, driverClass, dialect.getURLWithExtraOptions(connection), connection.getUsername(), getConnectionPassword(connection.getName(), connection.getPassword()), null, this);
}
}
} catch (DatabaseDialectException e) {
throw new ConnectionServiceException(e);
}
if (pentahoConnection != null) {
// make sure we have a native connection behind the SQLConnection object
// if the native connection is null, the test of the connection failed
boolean testedOk = ((SQLConnection) pentahoConnection).getNativeConnection() != null;
pentahoConnection.close();
return testedOk;
} else {
return false;
}
} else {
// $NON-NLS-1$
String message = Messages.getErrorString("ConnectionServiceImpl.ERROR_0008_UNABLE_TO_TEST_NULL_CONNECTION");
logger.error(message);
// $NON-NLS-1$
throw new ConnectionServiceException(Response.SC_BAD_REQUEST, message);
}
}
use of org.pentaho.database.DatabaseDialectException in project data-access by pentaho.
the class InMemoryConnectionServiceImpl method getConnection.
/**
* NOTE: caller is responsible for closing connection
*
* @param ds
* @return
* @throws DataSourceManagementException
*/
private static java.sql.Connection getConnection(IDatabaseConnection connection) throws ConnectionServiceException {
java.sql.Connection conn = null;
String driverClass = connection.getAccessType().getClass().toString();
if (StringUtils.isEmpty(driverClass)) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0020_CONNECTION_ATTEMPT_FAILED"));
throw new ConnectionServiceException(Messages.getErrorString(// $NON-NLS-1$
"ConnectionServiceInMemoryDelegate.ERROR_0020_CONNECTION_ATTEMPT_FAILED"));
}
Class<?> driverC = null;
try {
driverC = Class.forName(driverClass);
} catch (ClassNotFoundException e) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0021_DRIVER_NOT_FOUND_IN_CLASSPATH", driverClass), e);
throw new ConnectionServiceException(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0021_DRIVER_NOT_FOUND_IN_CLASSPATH"), // $NON-NLS-1$
e);
}
if (!Driver.class.isAssignableFrom(driverC)) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0021_DRIVER_NOT_FOUND_IN_CLASSPATH", driverClass));
throw new ConnectionServiceException(Messages.getErrorString(// $NON-NLS-1$
"ConnectionServiceInMemoryDelegate.ERROR_0021_DRIVER_NOT_FOUND_IN_CLASSPATH"));
}
Driver driver = null;
try {
driver = driverC.asSubclass(Driver.class).newInstance();
} catch (InstantiationException e) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0022_UNABLE_TO_INSTANCE_DRIVER", driverClass), e);
throw new ConnectionServiceException(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0022_UNABLE_TO_INSTANCE_DRIVER"), // $NON-NLS-1$
e);
} catch (IllegalAccessException e) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0022_UNABLE_TO_INSTANCE_DRIVER", driverClass), e);
throw new ConnectionServiceException(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0022_UNABLE_TO_INSTANCE_DRIVER"), // $NON-NLS-1$
e);
}
try {
DriverManager.registerDriver(driver);
DatabaseDialectService dialectService = new DatabaseDialectService();
IDatabaseDialect dialect = dialectService.getDialect(connection);
conn = DriverManager.getConnection(dialect.getURLWithExtraOptions(connection), connection.getUsername(), connection.getPassword());
return conn;
} catch (SQLException e) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0023_UNABLE_TO_CONNECT"), e);
throw new ConnectionServiceException(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0023_UNABLE_TO_CONNECT"), // $NON-NLS-1$
e);
} catch (DatabaseDialectException e) {
logger.error(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0023_UNABLE_TO_CONNECT"), e);
throw new ConnectionServiceException(Messages.getErrorString("ConnectionServiceInMemoryDelegate.ERROR_0023_UNABLE_TO_CONNECT"), // $NON-NLS-1$
e);
}
}
Aggregations