package kr.debop4j.data.ogm.test.utils;
import com.arjuna.ats.arjuna.coordinator.TxControl;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.hibernate.ogm.grid.EntityKey;
import org.hibernate.ogm.util.impl.Log;
import org.hibernate.ogm.util.impl.LoggerFactory;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* TestHelper
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* 13. 3. 29. 오후 4:42
*/
public class TestHelper {
private static final Log log = LoggerFactory.make();
private static final TestableGridDialect helper = createStoreSpecificHelper();
static {
//set 5 hours timeout on transactions: enough for debug, but not too high in case of CI problems.
TxControl.setDefaultTimeout(60 * 60 * 2);
}
public static boolean assertNumberOfEntities(int numberOfEntities, EntityManager em) {
return assertNumberOfEntities(numberOfEntities, em.unwrap(Session.class));
}
private static TestableGridDialect createStoreSpecificHelper() {
for (GridDialectType gridType : GridDialectType.values()) {
Class<?> classForName = gridType.loadTestableGridDialectClass();
if (classForName != null) {
try {
TestableGridDialect attempt = (TestableGridDialect) classForName.newInstance();
log.debugf("Using TestGridDialect %s", classForName);
return attempt;
} catch (Exception e) {
//but other errors are not expected:
log.errorf(e, "Could not load TestGridDialect by name from %s", gridType);
}
}
}
return new HashMapTestHelper();
}
public static GridDialectType getCurrentDialectType() {
return GridDialectType.valueFromHelperClass(helper.getClass());
}
public static boolean assertNumberOfEntities(int numberOfEntities, Session session) {
return assertNumberOfEntities(numberOfEntities, session.getSessionFactory());
}
public static boolean assertNumberOfEntities(int numberOfEntities, SessionFactory sessionFactory) {
return helper.assertNumberOfEntities(numberOfEntities, sessionFactory);
}
public static Map extractEntityTuple(SessionFactory sessionFactory, EntityKey key) {
return helper.extractEntityTuple(sessionFactory, key);
}
public static boolean assertNumberOfAssociations(int numberOfAssociations, SessionFactory sessionFactory) {
boolean result = helper.assertNumberOfAssociations(numberOfAssociations, sessionFactory);
return result;
}
public static boolean backendSupportsTransactions() {
return helper.backendSupportsTransactions();
}
@SuppressWarnings("unchecked")
public static <T> T get(Session session, Class<T> clazz, Serializable id) {
return (T) session.get(clazz, id);
}
public static void dropSchemaAndDatabase(Session session) {
if (session != null) {
dropSchemaAndDatabase(session.getSessionFactory());
}
}
public static void dropSchemaAndDatabase(EntityManagerFactory emf) {
dropSchemaAndDatabase(((HibernateEntityManagerFactory) emf).getSessionFactory());
}
public static void dropSchemaAndDatabase(SessionFactory sessionFactory) {
//if the factory is closed, we don't have access to the service registry
if (sessionFactory != null && !sessionFactory.isClosed()) {
try {
log.info("데이터베이스 데이터와 스키마를 삭제합니다...");
helper.dropSchemaAndDatabase(sessionFactory);
} catch (Exception e) {
log.warn("Exception while dropping schema and database in test", e);
}
}
}
public static Map<String, String> getEnvironmentProperties() {
Map<String, String> environmentProperties = helper.getEnvironmentProperties();
return environmentProperties == null ? new HashMap<String, String>(0) : environmentProperties;
}
public static void initializeHelpers() {
// just to make sure helper is initialized
}
}