/*
* Copyright 2007 The Fornax Project Team, including the original
* author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sculptor.framework.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import org.springframework.orm.jpa.SharedEntityManagerCreator;
/**
* Base class for transactional spring-based DBUnit tests in a JPA environment.
*
* <p>
* Override the method {@link #getDataSetFile} to specify XML file with DBUnit
* test data.
*
* @author Patrik Nordwall
* @author Oliver Ringel
*
*/
public abstract class AbstractDbUnitJpaTests extends AbstractDbUnitAnnotationAwareTransactionalTests {
private EntityManager entityManager;
private static boolean buildSchemaExecuted = false;
public AbstractDbUnitJpaTests() {
}
@PersistenceUnit
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
this.entityManager = SharedEntityManagerCreator.createSharedEntityManager(entityManagerFactory);
}
protected EntityManager getEntityManager() {
return entityManager;
}
@Override
public void tearDownDatabaseTester() throws Exception {
// commented out because of locking problems with OrderedDeleteAllOperation
// DbUnitDataSourceUtils.tearDownDatabaseTester();
}
/**
* flushes the entity manager to get the correct result via jdbc
*/
protected void flush() {
entityManager.flush();
}
protected void clear() {
entityManager.clear();
}
/**
* Using a separate JDBC connection causes locking problems with different rdbms
* (hsqldb 2.x introduced a new transaction, locking and isolation level handling)
*/
@Override
protected int countRowsInTable(String tableName, String additionalCondition) {
flush();
clear();
Query query = entityManager.createNativeQuery("select count(*) from " + tableName + " " + additionalCondition);
Number rowCount = (Number) query.getSingleResult();
return rowCount.intValue();
}
@Override
protected void buildSchema() {
if (!buildSchemaExecuted) {
executeScript("file:src/test/generated/resources/dbunit/ddl.sql");
executeScript("file:src/test/generated/resources/dbunit/ddl_additional.sql");
buildSchemaExecuted = true;
}
};
/**
* Execute some SQL scripts before setup the database
* (Workaround for DataNucleus and OpenJPA together with DBUnit).
*
* @throws Exception
*/
protected boolean executeScript(String scriptFile) {
if (getApplicationContext().getResource(scriptFile).exists()) {
executeSqlScript(scriptFile, true);
return true;
}
return false;
}
}