DataSourceFactory.java
/*
* Copyright 2018 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dashbuilder.dataprovider.sql.util;
import java.util.Properties;
import org.apache.tomcat.dbcp.dbcp2.managed.BasicManagedDataSource;
import org.dashbuilder.dataprovider.sql.DatabaseTestSettings;
/**
* Creates instances of {@link PoolingDataSourceWrapper} that can be used for testing purposes.
*/
public final class DataSourceFactory {
private DataSourceFactory() {
throw new UnsupportedOperationException(DataSourceFactory.class.getSimpleName() + " should not be instantiated.");
}
/**
* Creates a new instance of {@link PoolingDataSourceWrapper}.
* @param datasourceName data source JNDI name
* @param driverProperties properties that should be passed to JDBC driver
* @return a new PoolingDataSourceWrapper instance
*/
public static PoolingDataSourceWrapper setupPoolingDataSource(String datasourceName,
Properties driverProperties) {
return setupPoolingDataSource(datasourceName, driverProperties, new Properties());
}
/**
* Creates a new instance of {@link PoolingDataSourceWrapper}.
* @param datasourceName data source JNDI name
* @param driverProperties properties that should be passed to JDBC driver
* @param poolingProperties properties of {@link BasicManagedDataSource} pooling data source
* @return a new PoolingDataSourceWrapper instance
*/
public static PoolingDataSourceWrapper setupPoolingDataSource(String datasourceName,
Properties driverProperties,
Properties poolingProperties) {
Properties sanitizedDriverProperties = new Properties();
String driverClass = driverProperties.getProperty("driverClassName");
String databaseProvider = DatabaseProvider.fromDriverClassName(driverClass);
for (String propertyName : new String[]{"user", "password"}) {
sanitizedDriverProperties.put(propertyName, driverProperties.getProperty(propertyName));
}
if (databaseProvider.equals(DatabaseTestSettings.H2)) {
for (String propertyName : new String[]{"url", "driverClassName"}) {
sanitizedDriverProperties.put(propertyName, driverProperties.getProperty(propertyName));
}
} else {
if (databaseProvider.equals(DatabaseTestSettings.ORACLE)) {
sanitizedDriverProperties.put("driverType", "thin");
sanitizedDriverProperties.put("URL", driverProperties.getProperty("url"));
} else if (databaseProvider.equals(DatabaseTestSettings.DB2)) {
// http://docs.codehaus.org/display/BTM/JdbcXaSupportEvaluation#JdbcXaSupportEvaluation-IBMDB2
for (String propertyName : new String[]{"databaseName", "serverName", "portNumber", "url"}) {
sanitizedDriverProperties.put(propertyName, driverProperties.getProperty(propertyName));
}
sanitizedDriverProperties.put("driverType", "4");
sanitizedDriverProperties.put("currentSchema", driverProperties.getProperty("defaultSchema"));
sanitizedDriverProperties.put("ResultSetHoldability", "1");
sanitizedDriverProperties.put("DowngradeHoldCursorsUnderXa", "true");
} else if (databaseProvider.equals(DatabaseTestSettings.SQLSERVER)) {
for (String propertyName : new String[]{"serverName", "portNumber", "databaseName"}) {
sanitizedDriverProperties.put(propertyName, driverProperties.getProperty(propertyName));
}
sanitizedDriverProperties.put("URL", driverProperties.getProperty("url"));
} else if (databaseProvider.equals(DatabaseTestSettings.MYSQL)
|| databaseProvider.equals(DatabaseTestSettings.MARIADB)
|| databaseProvider.equals(DatabaseTestSettings.SYBASE)
|| databaseProvider.equals(DatabaseTestSettings.POSTGRES)) {
// || databaseProvider == DatabaseProvider.POSTGRES_PLUS) {
for (String propertyName : new String[]{"databaseName", "portNumber", "serverName", "url"}) {
sanitizedDriverProperties.put(propertyName, driverProperties.getProperty(propertyName));
}
} else {
throw new RuntimeException("Unknown driver class: " + driverClass);
}
}
String xaDataSourceClassName = driverProperties.getProperty("className");
return new PoolingDataSourceWrapperImpl(datasourceName, xaDataSourceClassName, sanitizedDriverProperties, poolingProperties);
}
}