/*
* Copyright (C) 2010 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.etk.component.database;
import junit.framework.TestCase;
import org.etk.component.base.naming.InitialContextInitializer;
import org.etk.component.database.creator.DBConnectionInfo;
import org.etk.component.database.creator.DBCreator;
import org.etk.kernel.container.ApplicationContainer;
import org.etk.kernel.container.configuration.ConfigurationManager;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
/**
* @author <a href="anatoliy.bazko@exoplatform.org">Anatoliy Bazko</a>
* @version $Id: TestDBCreator.java 4584 2011-07-01 13:39:07Z tolusha $
*/
public class TestDBCreator extends TestCase
{
protected DBCreator dbCreator;
private InitialContextInitializer initContext;
private ApplicationContainer container;
@Override
public void setUp() throws Exception
{
container = ApplicationContainer.getInstance();
dbCreator = (DBCreator)container.getComponentInstanceOfType(DBCreator.class);
initContext = (InitialContextInitializer)container.getComponentInstanceOfType(InitialContextInitializer.class);
}
public void testDBCreate() throws Exception
{
assertNotNull(dbCreator);
DBConnectionInfo dbInfo = dbCreator.createDatabase("testdb");
DBConnectionInfo dbInfo1 = dbCreator.getDBConnectionInfo("testdb");
Map<String, String> connProps = dbInfo.getProperties();
Map<String, String> connProps1 = dbInfo1.getProperties();
assertEquals(connProps.get("driverClassName"), connProps1.get("driverClassName"));
assertEquals(connProps.get("username"), connProps1.get("username"));
assertEquals(connProps.get("url"), connProps1.get("url"));
assertEquals(connProps.get("password"), connProps1.get("password"));
Map<String, String> refAddr = dbInfo.getProperties();
initContext.getInitialContextBinder().bind("testjdbcjcr", "javax.sql.DataSource", "org.apache.commons.dbcp.BasicDataSourceFactory", null, refAddr);
DataSource ds = (DataSource)initContext.getInitialContext().lookup("testjdbcjcr");
assertNotNull(ds);
Connection conn = ds.getConnection();
assertNotNull(conn);
}
public void testDBCreateWithSpecificProperties() throws Exception
{
assertNotNull(dbCreator);
String serverUrl = "jdbc:hsqldb:file:target/temp/data/dbcreator_test";
Map<String, String> connectionProperties = new HashMap<String, String>();
connectionProperties.put("driverClassName", "org.hsqldb.jdbcDriver");
connectionProperties.put("username", "sa");
connectionProperties.put("password", "");
ConfigurationManager cm = (ConfigurationManager)container.getComponentInstanceOfType(ConfigurationManager.class);
DBCreator dbCreator = new DBCreator(serverUrl, connectionProperties, "classpath:/dbcreator/test.sql", "sa", "", cm);
DBConnectionInfo dbInfo = dbCreator.createDatabase("testdb");
DBConnectionInfo dbInfo1 = dbCreator.getDBConnectionInfo("testdb");
Map<String, String> connProps = dbInfo.getProperties();
Map<String, String> connProps1 = dbInfo1.getProperties();
assertEquals(connProps.get("driverClassName"), connProps1.get("driverClassName"));
assertEquals(connProps.get("username"), connProps1.get("username"));
assertEquals(connProps.get("url"), connProps1.get("url"));
assertEquals(connProps.get("password"), connProps1.get("password"));
Map<String, String> refAddr = dbInfo.getProperties();
initContext.getInitialContextBinder().bind("testjdbcjcr2", "javax.sql.DataSource", "org.apache.commons.dbcp.BasicDataSourceFactory", null, refAddr);
DataSource ds = (DataSource)initContext.getInitialContext().lookup("testjdbcjcr2");
assertNotNull(ds);
Connection conn = ds.getConnection();
assertNotNull(conn);
}
public void testDBCreateMultiThread() throws Exception
{
DBCreateThread[] queue = new DBCreateThread[100];
for (int i = 0; i < queue.length; i++)
{
queue[i] = new DBCreateThread(i);
queue[i].start();
}
for (int i = 0; i < queue.length; i++)
{
queue[i].join();
}
for (int i = 0; i < queue.length; i++)
{
DataSource ds = (DataSource)initContext.getInitialContext().lookup("testjdbcjcr_" + i);
assertNotNull(ds);
Connection conn = ds.getConnection();
assertNotNull(conn);
}
}
class DBCreateThread extends Thread
{
private final int threadNumber;
DBCreateThread(int threadNumber)
{
this.threadNumber = threadNumber;
}
/**
* {@inheritDoc}
*/
@Override
public void run()
{
try
{
DBConnectionInfo dbInfo = dbCreator.createDatabase("testdb_" + threadNumber);
Map<String, String> refAddr = dbInfo.getProperties();
initContext.getInitialContextBinder().bind("testjdbcjcr_" + threadNumber, "javax.sql.DataSource",
"org.apache.commons.dbcp.BasicDataSourceFactory", null, refAddr);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}