package kr.debop4j.data.ogm.test.utils.jpa; import kr.debop4j.data.ogm.test.utils.BaseOGMTest; import kr.debop4j.data.ogm.test.utils.TestHelper; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.hibernate.cfg.Environment; import org.hibernate.ejb.HibernateEntityManagerFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.ogm.jpa.HibernateOgmPersistence; import org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform; import org.hibernate.service.jta.platform.spi.JtaPlatform; import org.junit.After; import org.junit.Before; import javax.persistence.EntityManagerFactory; import javax.persistence.SharedCacheMode; import javax.persistence.ValidationMode; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.transaction.TransactionManager; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.*; /** * kr.debop4j.data.ogm.test.utils.jpa.JpaTestBase * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 4. 12. 오전 11:22 */ @Slf4j public abstract class JpaTestBase extends BaseOGMTest { @Getter private EntityManagerFactory factory; @Getter private TransactionManager transactionManager; public abstract Class<?>[] getEntities(); @Before public void createFactory() throws MalformedURLException { GetterPersistenceUnitInfo info = new GetterPersistenceUnitInfo(); info.setClassLoader(Thread.currentThread().getContextClassLoader()); //we explicitly list them to avoid scanning info.setExcludeUnlistedClasses(true); info.setJtaDataSource(new NoopDatasource()); List<String> classNames = new ArrayList<String>(); for (Class<?> clazz : getEntities()) { classNames.add(clazz.getName()); } info.setManagedClassNames(classNames); info.setNonJtaDataSource(null); info.setPersistenceProviderClassName(HibernateOgmPersistence.class.getName()); info.setPersistenceUnitName("default"); final URL persistenceUnitRootUrl = new File("").toURL(); info.setPersistenceUnitRootUrl(persistenceUnitRootUrl); info.setPersistenceXMLSchemaVersion("2.0"); info.setProperties(new Properties()); info.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE); info.setTransactionType(PersistenceUnitTransactionType.JTA); info.setValidationMode(ValidationMode.AUTO); info.getProperties().setProperty(Environment.JTA_PLATFORM, JBossStandAloneJtaPlatform.class.getName() ); // MassIndexerFactoryIntegrator is defined at 4.3.0 // info.getProperties().setProperty(MassIndexerFactoryIntegrator.MASS_INDEXER_FACTORY_CLASSNAME, OgmMassIndexerFactory.class.getName()); for (Map.Entry<String, String> entry : TestHelper.getEnvironmentProperties().entrySet()) { info.getProperties().setProperty(entry.getKey(), entry.getValue()); } refineInfo(info); factory = new HibernateOgmPersistence().createContainerEntityManagerFactory(info, Collections.EMPTY_MAP); transactionManager = extractJBossTransactionManager(factory); } // can be overridden by subclasses protected void refineInfo(GetterPersistenceUnitInfo info) { } /** Get JBoss TM out of Hibernate */ public static TransactionManager extractJBossTransactionManager(EntityManagerFactory factory) { if (log.isDebugEnabled()) log.debug("TransactionManager를 꺼냅니다."); SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) ((HibernateEntityManagerFactory) factory).getSessionFactory(); return sessionFactory.getServiceRegistry().getService(JtaPlatform.class).retrieveTransactionManager(); } protected final void commitOrRollback(boolean operationSuccessful) throws Exception { if (operationSuccessful) { getTransactionManager().commit(); } else { getTransactionManager().rollback(); } } @After public void closeFactory() { if (factory == null) return; if (factory.isOpen()) { TestHelper.dropSchemaAndDatabase(factory); factory.close(); factory = null; } else { factory = null; } } }