/**
*
*/
package org.jboss.web.tomcat.service.session.persistent;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.catalina.Store;
/**
* A {@link Store} that uses a {@link DataSource} to obtain connections
* for persisting sessions to a relational database.
*
* @author Brian Stansberry
*
* @version $Revision: $
*/
public class DataSourcePersistentStore extends RDBMSStoreBase
{
/**
* The descriptive information about this implementation.
*/
private static final String info = "DataSourceStore/1.0";
private static final String storeName = "DataSourceStore";
// --------------------------------------------------------- Instance Fields
private String jndiName;
private DataSource injecteddatasource;
private DataSource datasource;
/**
* Creates a new DataSourcePersistentStore.
*/
public DataSourcePersistentStore()
{
}
/**
* Creates a new DataSourcePersistentStore that uses the given DataSource.
* This constructor is intended for testing.
*
* @param datasource the datasource
*/
public DataSourcePersistentStore(DataSource datasource)
{
this.injecteddatasource = datasource;
}
// ------------------------------------------------------------- Properties
public String getDataSourceJndiName()
{
return jndiName;
}
public void setDataSourceJndiName(String jndiName)
{
this.jndiName = jndiName;
}
@Override
public String getStoreName()
{
return (storeName);
}
// -------------------------------------------------------------- Protected
@Override
protected Connection getConnection() throws SQLException
{
try
{
Connection conn = null;
if (getConnectionName() != null)
{
conn = datasource.getConnection(getConnectionName(), getConnectionPassword());
}
else
{
conn = datasource.getConnection();
}
conn.setAutoCommit(false);
return conn;
}
catch (SQLException e)
{
// perhaps our datasource has been restarted? Reacquire in case
try
{
findDataSource();
}
catch (Exception e1)
{
getLogger().error("Caught exception reacquiring datasource", e1);
}
throw e;
}
}
@Override
public String getInfo()
{
return info;
}
@Override
protected void releaseConnection(Connection conn)
{
cleanup(conn, null, false);
}
@Override
protected void startStore()
{
findDataSource();
}
private void findDataSource()
{
if (injecteddatasource == null)
{
if (jndiName == null)
{
throw new IllegalStateException("No jndiName has been configured");
}
try
{
datasource = (DataSource) new InitialContext().lookup(jndiName);
getLogger().debug("DataSource found at " + jndiName);
}
catch (NamingException e)
{
throw new IllegalStateException("Caught NamingException looking up DataSource at " + jndiName + " -- " + e
.getLocalizedMessage());
}
}
else
{
datasource = injecteddatasource;
}
}
}