/*
* Copyright (C) 2011 eXo Platform SAS.
*
* 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.exoplatform.services.jdbc.impl;
import junit.framework.TestCase;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.container.xml.ValueParam;
import org.exoplatform.container.xml.ValuesParam;
import org.exoplatform.services.jdbc.DataSourceProvider;
import org.exoplatform.services.transaction.TransactionService;
import java.io.PrintWriter;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.InvalidTransactionException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import javax.transaction.xa.XAResource;
/**
* @author <a href="mailto:nfilotto@exoplatform.com">Nicolas Filotto</a>
* @version $Id$
*
*/
public class TestDataSourceProviderImpl extends TestCase
{
private static String DS_NAME = "TestDataSourceProviderImpl-DS";
private String oldFactoryName;
private MyDataSource mds;
/**
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
super.setUp();
oldFactoryName = System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.exoplatform.services.naming.SimpleContextFactory");
new InitialContext().bind(DS_NAME, mds = new MyDataSource());
}
/**
* @see junit.framework.TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception
{
try
{
new InitialContext().unbind(DS_NAME);
}
finally
{
if (oldFactoryName == null)
{
System.clearProperty(Context.INITIAL_CONTEXT_FACTORY);
}
else
{
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, oldFactoryName);
}
super.tearDown();
}
}
public void testIsManaged() throws Exception
{
DataSourceProvider dsp = new DataSourceProviderImpl(null);
assertFalse(dsp.isManaged(DS_NAME));
InitParams params = new InitParams();
dsp = new DataSourceProviderImpl(params);
assertFalse(dsp.isManaged(DS_NAME));
ValueParam paramConf = new ValueParam();
paramConf.setName(DataSourceProviderImpl.PARAM_ALWAYS_MANAGED);
paramConf.setValue("true");
params.addParameter(paramConf);
dsp = new DataSourceProviderImpl(params);
assertTrue(dsp.isManaged(DS_NAME));
paramConf.setValue("false");
dsp = new DataSourceProviderImpl(params);
assertFalse(dsp.isManaged(DS_NAME));
ValuesParam paramsConf = new ValuesParam();
paramsConf.setName(DataSourceProviderImpl.PARAM_MANAGED_DS);
ArrayList<String> values = new ArrayList<String>();
values.add(DS_NAME);
values.add(" ds-foo1, ds-foo2 ");
values.add("ds-foo3");
paramsConf.setValues(values);
params.addParameter(paramsConf);
dsp = new DataSourceProviderImpl(params);
assertTrue(dsp.isManaged(DS_NAME));
assertTrue(dsp.isManaged("ds-foo1"));
assertTrue(dsp.isManaged("ds-foo2"));
assertTrue(dsp.isManaged("ds-foo3"));
}
public void testGetDataSource() throws Exception
{
DataSourceProvider dsp = new DataSourceProviderImpl(null);
DataSource ds = dsp.getDataSource(DS_NAME);
assertNotNull(ds);
Connection con = ds.getConnection();
con.commit();
assertTrue(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertTrue(mds.con.committed);
MyTransactionService mts = new MyTransactionService();
mts.tm.setStatus(Status.STATUS_ACTIVE);
dsp = new DataSourceProviderImpl(null, mts);
ds = dsp.getDataSource(DS_NAME);
assertNotNull(ds);
con = ds.getConnection();
con.commit();
assertTrue(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertTrue(mds.con.committed);
mts.tm.setStatus(Status.STATUS_NO_TRANSACTION);
con = ds.getConnection();
con.commit();
assertTrue(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertTrue(mds.con.committed);
InitParams params = new InitParams();
ValueParam paramConf = new ValueParam();
paramConf.setName(DataSourceProviderImpl.PARAM_ALWAYS_MANAGED);
paramConf.setValue("true");
params.addParameter(paramConf);
dsp = new DataSourceProviderImpl(params, mts);
ds = dsp.getDataSource(DS_NAME);
assertNotNull(ds);
mts.tm.setStatus(Status.STATUS_ACTIVE);
con = ds.getConnection();
con.commit();
assertFalse(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertFalse(mds.con.committed);
mts.tm.setStatus(Status.STATUS_NO_TRANSACTION);
con = ds.getConnection();
con.commit();
assertTrue(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertTrue(mds.con.committed);
paramConf = new ValueParam();
paramConf.setName(DataSourceProviderImpl.PARAM_CHECK_TX);
paramConf.setValue("false");
params.addParameter(paramConf);
dsp = new DataSourceProviderImpl(params, mts);
ds = dsp.getDataSource(DS_NAME);
assertNotNull(ds);
mts.tm.setStatus(Status.STATUS_ACTIVE);
con = ds.getConnection();
con.commit();
assertFalse(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertFalse(mds.con.committed);
mts.tm.setStatus(Status.STATUS_NO_TRANSACTION);
con = ds.getConnection();
con.commit();
assertFalse(mds.con.committed);
con = ds.getConnection(null, null);
con.commit();
assertFalse(mds.con.committed);
}
private static class MyDataSource implements DataSource
{
public MyConnection con;
/**
* @see javax.sql.CommonDataSource#getLogWriter()
*/
public PrintWriter getLogWriter() throws SQLException
{
return null;
}
/**
* @see javax.sql.CommonDataSource#getLoginTimeout()
*/
public int getLoginTimeout() throws SQLException
{
return 0;
}
/**
* @see javax.sql.CommonDataSource#setLogWriter(java.io.PrintWriter)
*/
public void setLogWriter(PrintWriter arg0) throws SQLException
{
}
/**
* @see javax.sql.CommonDataSource#setLoginTimeout(int)
*/
public void setLoginTimeout(int arg0) throws SQLException
{
}
/**
* @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
*/
public boolean isWrapperFor(Class<?> arg0) throws SQLException
{
return false;
}
/**
* @see java.sql.Wrapper#unwrap(java.lang.Class)
*/
public <T> T unwrap(Class<T> arg0) throws SQLException
{
return null;
}
/**
* @see javax.sql.DataSource#getConnection()
*/
public Connection getConnection() throws SQLException
{
return con = new MyConnection();
}
/**
* @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
*/
public Connection getConnection(String username, String password) throws SQLException
{
return con = new MyConnection();
}
/**
* @see javax.sql.CommonDataSource#getParentLogger()
*/
public Logger getParentLogger() throws SQLFeatureNotSupportedException
{
return null;
}
}
private static class MyConnection implements Connection
{
public boolean committed;
/**
* @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
*/
public boolean isWrapperFor(Class<?> iface) throws SQLException
{
return false;
}
/**
* @see java.sql.Wrapper#unwrap(java.lang.Class)
*/
public <T> T unwrap(Class<T> iface) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String)
*/
public PreparedStatement prepareStatement(String sql) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String)
*/
public CallableStatement prepareCall(String sql) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#nativeSQL(java.lang.String)
*/
public String nativeSQL(String sql) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#setAutoCommit(boolean)
*/
public void setAutoCommit(boolean autoCommit) throws SQLException
{
}
/**
* @see java.sql.Connection#commit()
*/
public void commit() throws SQLException
{
committed = true;
}
/**
* @see java.sql.Connection#rollback()
*/
public void rollback() throws SQLException
{
}
/**
* @see java.sql.Connection#close()
*/
public void close() throws SQLException
{
}
/**
* @see java.sql.Connection#setReadOnly(boolean)
*/
public void setReadOnly(boolean readOnly) throws SQLException
{
}
/**
* @see java.sql.Connection#setCatalog(java.lang.String)
*/
public void setCatalog(String catalog) throws SQLException
{
}
/**
* @see java.sql.Connection#setTransactionIsolation(int)
*/
public void setTransactionIsolation(int level) throws SQLException
{
}
/**
* @see java.sql.Connection#clearWarnings()
*/
public void clearWarnings() throws SQLException
{
}
/**
* @see java.sql.Connection#createArrayOf(java.lang.String, java.lang.Object[])
*/
public Array createArrayOf(String arg0, Object[] arg1) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createBlob()
*/
public Blob createBlob() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createClob()
*/
public Clob createClob() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createNClob()
*/
public NClob createNClob() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createSQLXML()
*/
public SQLXML createSQLXML() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createStatement()
*/
public Statement createStatement() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createStatement(int, int)
*/
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int, int)
*/
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String, int, int)
*/
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#setTypeMap(java.util.Map)
*/
public void setTypeMap(Map<String, Class<?>> map) throws SQLException
{
}
/**
* @see java.sql.Connection#setSavepoint()
*/
public Savepoint setSavepoint() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#setSavepoint(java.lang.String)
*/
public Savepoint setSavepoint(String name) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#rollback(java.sql.Savepoint)
*/
public void rollback(Savepoint savepoint) throws SQLException
{
}
/**
* @see java.sql.Connection#releaseSavepoint(java.sql.Savepoint)
*/
public void releaseSavepoint(Savepoint savepoint) throws SQLException
{
}
/**
* @see java.sql.Connection#createStatement(int, int, int)
*/
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#createStruct(java.lang.String, java.lang.Object[])
*/
public Struct createStruct(String arg0, Object[] arg1) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getAutoCommit()
*/
public boolean getAutoCommit() throws SQLException
{
return false;
}
/**
* @see java.sql.Connection#isClosed()
*/
public boolean isClosed() throws SQLException
{
return false;
}
/**
* @see java.sql.Connection#isReadOnly()
*/
public boolean isReadOnly() throws SQLException
{
return false;
}
/**
* @see java.sql.Connection#getCatalog()
*/
public String getCatalog() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getClientInfo()
*/
public Properties getClientInfo() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getClientInfo(java.lang.String)
*/
public String getClientInfo(String arg0) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getMetaData()
*/
public DatabaseMetaData getMetaData() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getTransactionIsolation()
*/
public int getTransactionIsolation() throws SQLException
{
return 0;
}
/**
* @see java.sql.Connection#getWarnings()
*/
public SQLWarning getWarnings() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getTypeMap()
*/
public Map<String, Class<?>> getTypeMap() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#getHoldability()
*/
public int getHoldability() throws SQLException
{
return 0;
}
/**
* @see java.sql.Connection#isValid(int)
*/
public boolean isValid(int arg0) throws SQLException
{
return false;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int, int, int)
*/
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String, int, int, int)
*/
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int)
*/
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int[])
*/
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, java.lang.String[])
*/
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#setClientInfo(java.util.Properties)
*/
public void setClientInfo(Properties arg0) throws SQLClientInfoException
{
}
/**
* @see java.sql.Connection#setClientInfo(java.lang.String, java.lang.String)
*/
public void setClientInfo(String arg0, String arg1) throws SQLClientInfoException
{
}
/**
* @see java.sql.Connection#setHoldability(int)
*/
public void setHoldability(int holdability) throws SQLException
{
}
/**
* @see java.sql.Connection#setSchema(java.lang.String)
*/
public void setSchema(String schema) throws SQLException
{
// TODO Auto-generated method stub
}
/**
* @see java.sql.Connection#getSchema()
*/
public String getSchema() throws SQLException
{
return null;
}
/**
* @see java.sql.Connection#abort(java.util.concurrent.Executor)
*/
public void abort(Executor executor) throws SQLException
{
}
/**
* @see java.sql.Connection#setNetworkTimeout(java.util.concurrent.Executor, int)
*/
public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException
{
}
/**
* @see java.sql.Connection#getNetworkTimeout()
*/
public int getNetworkTimeout() throws SQLException
{
return 0;
}
}
private static class MyTransactionService implements TransactionService
{
public MyTransactionManager tm = new MyTransactionManager();
/**
* @see org.exoplatform.services.transaction.TransactionService#getTransactionManager()
*/
public TransactionManager getTransactionManager()
{
return tm;
}
/**
* @see org.exoplatform.services.transaction.TransactionService#getUserTransaction()
*/
public UserTransaction getUserTransaction()
{
return null;
}
/**
* @see org.exoplatform.services.transaction.TransactionService#getDefaultTimeout()
*/
public int getDefaultTimeout()
{
return 0;
}
/**
* @see org.exoplatform.services.transaction.TransactionService#setTransactionTimeout(int)
*/
public void setTransactionTimeout(int seconds) throws SystemException
{
}
/**
* @see org.exoplatform.services.transaction.TransactionService#enlistResource(javax.transaction.xa.XAResource)
*/
public boolean enlistResource(XAResource xares) throws RollbackException, SystemException, IllegalStateException
{
return false;
}
/**
* @see org.exoplatform.services.transaction.TransactionService#delistResource(javax.transaction.xa.XAResource)
*/
public boolean delistResource(XAResource xares) throws RollbackException, SystemException, IllegalStateException
{
return false;
}
}
private static class MyTransactionManager implements TransactionManager
{
private int status;
public void setStatus(int status)
{
this.status = status;
}
/**
* @see javax.transaction.TransactionManager#begin()
*/
public void begin() throws NotSupportedException, SystemException
{
}
/**
* @see javax.transaction.TransactionManager#commit()
*/
public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException,
SecurityException, IllegalStateException, SystemException
{
}
/**
* @see javax.transaction.TransactionManager#getStatus()
*/
public int getStatus() throws SystemException
{
return status;
}
/**
* @see javax.transaction.TransactionManager#getTransaction()
*/
public Transaction getTransaction() throws SystemException
{
return null;
}
/**
* @see javax.transaction.TransactionManager#resume(javax.transaction.Transaction)
*/
public void resume(Transaction tobj) throws InvalidTransactionException, IllegalStateException, SystemException
{
}
/**
* @see javax.transaction.TransactionManager#rollback()
*/
public void rollback() throws IllegalStateException, SecurityException, SystemException
{
}
/**
* @see javax.transaction.TransactionManager#setRollbackOnly()
*/
public void setRollbackOnly() throws IllegalStateException, SystemException
{
}
/**
* @see javax.transaction.TransactionManager#setTransactionTimeout(int)
*/
public void setTransactionTimeout(int seconds) throws SystemException
{
}
/**
* @see javax.transaction.TransactionManager#suspend()
*/
public Transaction suspend() throws SystemException
{
return null;
}
}
}