/**********************************************************************************
* $URL: $
* $Id: SakaiBasicDataSource.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2008 Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.tomcat.jdbc.pool;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.DataSourceFactory;
import org.apache.tomcat.jdbc.pool.PoolProperties;
/**
* <p>
* SakaiBasicDataSource extends apache tomcat's DataSource ...
* </p>
*/
public class SakaiBasicDataSource extends DataSource
{
/** Our logger. */
private static Log M_log = LogFactory.getLog(SakaiBasicDataSource.class);
/** Configuration: to rollback each connection when returned to the pool. */
protected boolean m_rollbackOnReturn = false;
//Needed for DBCP compat
private boolean poolPreparedStatements;
private int maxOpenPreparedStatements;
public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) {
M_log.info("MaxOpenPreparedStatments not used");
this.maxOpenPreparedStatements = maxOpenPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
M_log.info("PoolPreparedStatements not used");
this.poolPreparedStatements = poolPreparedStatements;
}
/**
* Set the default transaction isolation level from a string value, based on the settings and values in java.sql.Connection
*
* @param defaultTransactionIsolation
*/
public void setDefaultTransactionIsolationString(String defaultTransactionIsolation)
{
if ((defaultTransactionIsolation == null) || (defaultTransactionIsolation.trim().length() == 0))
{
setDefaultTransactionIsolation(DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION);
}
else if (defaultTransactionIsolation.trim().equalsIgnoreCase("TRANSACTION_NONE"))
{
setDefaultTransactionIsolation(Connection.TRANSACTION_NONE);
}
else if (defaultTransactionIsolation.trim().equalsIgnoreCase("TRANSACTION_READ_UNCOMMITTED"))
{
setDefaultTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
else if (defaultTransactionIsolation.trim().equalsIgnoreCase("TRANSACTION_READ_COMMITTED"))
{
setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
}
else if (defaultTransactionIsolation.trim().equalsIgnoreCase("TRANSACTION_REPEATABLE_READ"))
{
setDefaultTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
}
else if (defaultTransactionIsolation.trim().equalsIgnoreCase("TRANSACTION_SERIALIZABLE"))
{
setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
}
else
{
setDefaultTransactionIsolation(DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION);
M_log.warn("invalid transaction isolation level: " + defaultTransactionIsolation);
}
}
/**
* Set the rollback on borrow configuration.
*
* @param value
* if true, rollback each connection when borrowed from the pool, if false, do not.
*/
public synchronized void setRollbackOnBorrow(boolean value)
{
m_rollbackOnReturn = value;
}
/**
* @exception SQLException
* if the object pool cannot be created.
*/
protected void init() throws SQLException
{
M_log.info("init()");
// Load the JDBC driver class
PoolProperties connectionPool = (PoolProperties) createPool().getPoolProperties();
String driverClassName = getDriverClassName();
//Validate the class
if (driverClassName != null)
{
try
{
Class.forName(driverClassName);
}
catch (Throwable t)
{
String message = "Cannot load JDBC driver class '" + driverClassName + "'";
M_log.warn(message, t);
throw new SQLException(message,t);
}
}
// Can't test without a validationQuery
if (getValidationQuery() == null)
{
connectionPool.setTestOnBorrow(false);
connectionPool.setTestOnReturn(false);
connectionPool.setTestWhileIdle(false);
}
// connectionPool.setJmxEnabled(jmxEnabled);
// Set up statement pool, if desired
// What did this do??
/*
GenericKeyedObjectPoolFactory statementPoolFactory = null;
if (isPoolPreparedStatements())
{
statementPoolFactory = new GenericKeyedObjectPoolFactory(null, -1, // unlimited maxActive (per key)
GenericKeyedObjectPool.WHEN_EXHAUSTED_FAIL, 0, // maxWait
1, // maxIdle (per key)
maxOpenPreparedStatements);
}
*/
// Set up the driver connection factory we will use
if (getUsername() == null) {
M_log.warn("Tomcat DataSource configured without a 'username'");
}
String password = createPool().getPoolProperties().getUsername();
if (password == null) {
M_log.warn("Tomcat DataSource configured without a 'password'");
}
setPoolProperties(connectionPool);
//Does it need any of this??
/*
DriverConnectionFactory driverConnectionFactory = new DriverConnectionFactory(driver, url, connectionProperties);
// Set up the poolable connection factory we will use
PoolableConnectionFactory connectionFactory = null;
try
{
connectionFactory = new SakaiPoolableConnectionFactory(driverConnectionFactory, connectionPool, statementPoolFactory,
validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog,
,null, m_rollbackOnReturn);
if (connectionFactory == null)
{
throw new SQLException("Cannot create PoolableConnectionFactory");
}
// Sakai: validateConnectionFactory(connectionFactory);
}
catch (RuntimeException e)
{
throw e;
}
catch (Exception e)
{
throw new SQLException("Cannot create PoolableConnectionFactory (" + e.getMessage() + ")", e);
}
// Create and return the pooling data source to manage the connections
dataSource = new PoolingDataSource(connectionPool);
((PoolingDataSource) dataSource).setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed());
dataSource.setLogWriter(logWriter);
try
{
for (int i = 0; i < initialSize; i++)
{
connectionPool.addObject();
}
}
catch (Exception e)
{
throw new SQLException("Error preloading the connection pool", e);
}
*/
}
}