/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.resource.adapter.jdbc.local;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.resource.ResourceException;
import javax.resource.spi.ConnectionManager;
import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.ManagedConnectionFactory;
import javax.transaction.TransactionManager;
import org.jboss.deployers.spi.DeploymentException;
import org.jboss.logging.Logger;
import org.jboss.resource.connectionmanager.CachedConnectionManager;
import org.jboss.resource.connectionmanager.InternalManagedConnectionPool;
import org.jboss.resource.connectionmanager.JBossManagedConnectionPool;
import org.jboss.resource.connectionmanager.TxConnectionManager;
import org.jboss.resource.connectionmanager.CachedConnectionManagerReference;
import org.jboss.util.naming.NonSerializableFactory;
import org.jboss.util.naming.Util;
/**
* This is a pojo that instantiates a Local tx connection pool.
* It provides same functionality as ds.xml files
*
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @version $Revision: 77478 $
*/
public class LocalTxDataSource
{
protected static Logger log = Logger.getLogger(LocalTxDataSource.class.getName());
public LocalTxDataSource()
{
}
private CachedConnectionManager cachedConnectionManager;
private TransactionManager transactionManager;
private String jndiName;
private InternalManagedConnectionPool.PoolParams poolParams = new InternalManagedConnectionPool.PoolParams();
private LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
private JBossManagedConnectionPool.OnePool pool = new JBossManagedConnectionPool.OnePool(mcf, poolParams, false, log);
private TxConnectionManager connectionManager;
private Object datasource;
protected Hashtable initialContextProperties;
protected InitialContext initialContext;
public class ConnectionManagerDelegate implements ConnectionManager
{
private static final long serialVersionUID = 1L;
public Object allocateConnection(ManagedConnectionFactory mcf, ConnectionRequestInfo cxRequestInfo) throws ResourceException
{
return connectionManager.allocateConnection(mcf, cxRequestInfo);
}
}
public void setInitialContextProperties(Hashtable initialContextProperties)
{
this.initialContextProperties = initialContextProperties;
}
public void start() throws Exception
{
if (initialContextProperties == null) initialContext = new InitialContext();
else initialContext = new InitialContext(initialContextProperties);
connectionManager = new TxConnectionManager(cachedConnectionManager, pool, transactionManager);
connectionManager.setLocalTransactions(true);
connectionManager.setInterleaving(false);
pool.setConnectionListenerFactory(connectionManager);
datasource = connectionManager.getPoolingStrategy().getManagedConnectionFactory().createConnectionFactory(new ConnectionManagerDelegate());
bindConnectionFactory();
}
/**
* Bind the connection factory into jndi
*/
protected void bindConnectionFactory() throws Exception
{
InitialContext ctx = initialContext;
try
{
Name name = ctx.getNameParser("").parse(jndiName);
String key = name.toString();
if( true == true && name.size() > 1 )
{
int size = name.size() - 1;
Util.createSubcontext(initialContext, name.getPrefix(size));
}
NonSerializableFactory.rebind(initialContext, key, datasource);
log.info("Bound datasource to JNDI name '" + jndiName + "'");
}
catch (NamingException ne)
{
throw new DeploymentException("Could not bind ConnectionFactory into jndi: " + jndiName, ne);
}
finally
{
ctx.close();
}
}
protected void unbindConnectionFactory() throws Exception
{
InitialContext ctx = initialContext;
try
{
ctx.unbind(jndiName);
NonSerializableFactory.unbind(jndiName);
log.info("Unbound datasource for JNDI name '" + jndiName + "'");
}
catch (NamingException ne)
{
log.error("Could not unbind datasource from jndi: " + jndiName, ne);
}
finally
{
ctx.close();
}
}
public Object getDatasource()
{
return datasource;
}
public void setCachedConnectionManager(CachedConnectionManagerReference cachedConnectionManager)
{
this.cachedConnectionManager = cachedConnectionManager.getCachedConnectionManager();
}
public TransactionManager getTransactionManager()
{
return transactionManager;
}
public void setTransactionManager(TransactionManager transactionManager)
{
this.transactionManager = transactionManager;
}
public String getJndiName()
{
return jndiName;
}
public void setJndiName(String jndiName)
{
this.jndiName = jndiName;
}
public int getMinSize()
{
return poolParams.minSize;
}
public void setMinSize(int minSize)
{
poolParams.minSize = minSize;
}
public int getMaxSize()
{
return poolParams.maxSize;
}
public void setMaxSize(int maxSize)
{
poolParams.maxSize = maxSize;
}
public int getBlockingTimeout()
{
return poolParams.blockingTimeout;
}
public void setBlockingTimeout(int blockingTimeout)
{
poolParams.blockingTimeout = blockingTimeout;
}
public long getIdleTimeout()
{
return poolParams.idleTimeout;
}
public void setIdleTimeout(long idleTimeout)
{
poolParams.idleTimeout = idleTimeout;
}
public String getDriverClass()
{
return mcf.getDriverClass();
}
public void setDriverClass(final String driverClass)
{
mcf.setDriverClass(driverClass);
}
public String getConnectionURL()
{
return mcf.getConnectionURL();
}
public void setConnectionURL(final String connectionURL)
{
mcf.setConnectionURL(connectionURL);
}
public void setUserName(final String userName)
{
mcf.setUserName(userName);
}
public void setPassword(final String password)
{
mcf.setPassword(password);
}
public void setPreparedStatementCacheSize(int size)
{
mcf.setPreparedStatementCacheSize(size);
}
public int getPreparedStatementCacheSize()
{
return mcf.getPreparedStatementCacheSize();
}
public boolean getSharePreparedStatements()
{
return mcf.getSharePreparedStatements();
}
public void setSharePreparedStatements(boolean sharePS)
{
mcf.setSharePreparedStatements(sharePS);
}
public boolean getTxQueryTimeout()
{
return mcf.isTransactionQueryTimeout();
}
public void setTxQueryTimeout(boolean qt)
{
mcf.setTransactionQueryTimeout(qt);
}
public String getTransactionIsolation()
{
return mcf.getTransactionIsolation();
}
public void setTransactionIsolation(String transactionIsolation)
{
mcf.setTransactionIsolation(transactionIsolation);
}
public String getNewConnectionSQL()
{
return mcf.getNewConnectionSQL();
}
public void setNewConnectionSQL(String newConnectionSQL)
{
mcf.setNewConnectionSQL(newConnectionSQL);
}
public String getCheckValidConnectionSQL()
{
return mcf.getCheckValidConnectionSQL();
}
public void setCheckValidConnectionSQL(String checkValidConnectionSQL)
{
mcf.setCheckValidConnectionSQL(checkValidConnectionSQL);
}
public String getTrackStatements()
{
return mcf.getTrackStatements();
}
public void setTrackStatements(String value)
{
mcf.setTrackStatements(value);
}
public String getExceptionSorterClassName()
{
return mcf.getExceptionSorterClassName();
}
public void setExceptionSorterClassName(String exceptionSorterClassName)
{
mcf.setExceptionSorterClassName(exceptionSorterClassName);
}
public String getValidConnectionCheckerClassName()
{
return mcf.getValidConnectionCheckerClassName();
}
public void setValidConnectionCheckerClassName(String value)
{
mcf.setValidConnectionCheckerClassName(value);
}
}