package org.akaza.openclinica.templates; import org.akaza.openclinica.dao.core.SQLFactory; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.apache.commons.dbcp.BasicDataSource; import org.dbunit.DataSourceBasedDBTestCase; import org.dbunit.database.DatabaseConfig; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; import java.util.Locale; import java.util.Properties; public abstract class HibernateOcDbTestCase extends DataSourceBasedDBTestCase { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); // public static PlatformTransactionManager transactionManager; protected static ApplicationContext context; protected static Properties properties = new Properties(); public static String dbName; public static String dbUrl; public static String dbUserName; public static String dbPassword; public static String dbDriverClassName; public static String locale; public BasicDataSource ds ; protected static PlatformTransactionManager transactionManager; static { loadProperties(); dbName = properties.getProperty("dbName"); dbUrl = properties.getProperty("url"); dbUserName = properties.getProperty("username"); dbPassword = properties.getProperty("password"); dbDriverClassName = properties.getProperty("driver"); locale = properties.getProperty("locale"); initializeLocale(); initializeQueriesInXml(); context = new ClassPathXmlApplicationContext( new String[] { "classpath*:applicationContext-core-s*.xml", "classpath*:org/akaza/openclinica/applicationContext-core-db.xml", "classpath*:org/akaza/openclinica/applicationContext-core-email.xml", "classpath*:org/akaza/openclinica/applicationContext-core-hibernate.xml", "classpath*:org/akaza/openclinica/applicationContext-core-service.xml", " classpath*:org/akaza/openclinica/applicationContext-core-timer.xml", "classpath*:org/akaza/openclinica/applicationContext-security.xml" }); transactionManager = (PlatformTransactionManager) context.getBean("transactionManager"); transactionManager.getTransaction(new DefaultTransactionDefinition()); } public HibernateOcDbTestCase() { } @Override protected void setUp() throws Exception { /* loadProperties(); dbName = properties.getProperty("dbName"); dbUrl = properties.getProperty("url"); dbUserName = properties.getProperty("username"); dbPassword = properties.getProperty("password"); dbDriverClassName = properties.getProperty("driver"); locale = properties.getProperty("locale"); initializeLocale(); initializeQueriesInXml();*/ // setUpContext(); // TODO Auto-generated method stub super.setUp(); } private void setUpContext() { // Loading the applicationContext under test/resources first allows // test.properties to be loaded first.Hence we can // use different settings. /* context = new ClassPathXmlApplicationContext( new String[] { "classpath*:applicationContext-core-s*.xml", "classpath*:org/akaza/openclinica/applicationContext-core-db.xml", "classpath*:org/akaza/openclinica/applicationContext-core-email.xml", "classpath*:org/akaza/openclinica/applicationContext-core-hibernate.xml", "classpath*:org/akaza/openclinica/applicationContext-core-scheduler.xml", "classpath*:org/akaza/openclinica/applicationContext-core-service.xml", " classpath*:org/akaza/openclinica/applicationContext-core-timer.xml", "classpath*:org/akaza/openclinica/applicationContext-security.xml" }); transactionManager = (PlatformTransactionManager) context.getBean("transactionManager"); transactionManager.getTransaction(new DefaultTransactionDefinition());*/ } @Override protected void setUpDatabaseConfig(DatabaseConfig config) { config.setProperty(DatabaseConfig.FEATURE_ALLOW_EMPTY_FIELDS, "true"); } @Override protected IDataSet getDataSet() throws Exception { FlatXmlDataSetBuilder setBuilder = new FlatXmlDataSetBuilder(); return setBuilder.build(HibernateOcDbTestCase.class.getResourceAsStream(getTestDataFilePath())); } @Override public DataSource getDataSource() { ds = new BasicDataSource(); ds.setAccessToUnderlyingConnectionAllowed(true); ds.setDriverClassName(dbDriverClassName); ds.setUsername(dbUserName); ds.setPassword(dbPassword); ds.setUrl(dbUrl); return ds; } public ApplicationContext getContext() { return context; } public static void loadProperties() { try { properties.load(HibernateOcDbTestCase.class.getResourceAsStream(getPropertiesFilePath())); } catch (Exception ioExc) { ioExc.printStackTrace(); } } protected static void initializeLocale() { ResourceBundleProvider.updateLocale(new Locale(locale)); } /** * Instantiates SQLFactory and all the xml files that contain the queries * that are used in our dao class */ protected static void initializeQueriesInXml() { String baseDir = System.getProperty("basedir"); if (baseDir == null || "".equalsIgnoreCase(baseDir)) { throw new IllegalStateException( "The system properties basedir were not made available to the application. Therefore we cannot locate the test properties file."); } // @pgawade 05-Nov-2010 Updated the path of directory storing xml files // containing sql queries // SQLFactory.JUNIT_XML_DIR = // baseDir + File.separator + "src" + File.separator + "main" + // File.separator + "webapp" + File.separator + "properties" + // File.separator; //Revisit this later /* SQLFactory.JUNIT_XML_DIR = baseDir + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "properties" + File.separator; */ // @pgawade 10272010 - Added the ResourceLoader instance as a parameter // to run method of SQLFactory // SQLFactory.getnstance().run(dbName); SQLFactory.getInstance().run(dbName, context); } private static String getPropertiesFilePath() { return "/datainfo.properties"; } /** * Gets the path and the name of the xml file holding the data. Example if * your Class Name is called * org.akaza.openclinica.service.rule.expression.TestExample.java you need * an xml data file in resources folder under same path + testdata + same * Class Name .xml * org/akaza/openclinica/service/rule/expression/testdata/TestExample.xml * * @return path to data file */ private String getTestDataFilePath() { StringBuffer path = new StringBuffer("/"); path.append(getClass().getPackage().getName().replace(".", "/")); path.append("/testdata/"); path.append(getClass().getSimpleName() + ".xml"); return path.toString(); } public String getDbName() { return dbName; } @Override public void tearDown(){ try { transactionManager.commit( transactionManager.getTransaction(new DefaultTransactionDefinition())); super.tearDown(); // transactionManager = null; if(ds!=null) ds.getConnection().close(); // getDataSource().getConnection().close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }