package kr.debop4j.data.ehcache.ogm.test.utils; import kr.debop4j.data.ogm.test.utils.TestableGridDialect; import lombok.extern.slf4j.Slf4j; import net.sf.ehcache.Cache; import org.hibernate.SessionFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.ogm.datastore.ehcache.impl.EhcacheDatastoreProvider; import org.hibernate.ogm.datastore.spi.DatastoreProvider; import org.hibernate.ogm.grid.EntityKey; import java.util.HashMap; import java.util.Map; import static org.hibernate.ogm.datastore.spi.DefaultDatastoreNames.ASSOCIATION_STORE; import static org.hibernate.ogm.datastore.spi.DefaultDatastoreNames.ENTITY_STORE; /** * kr.debop4j.data.ehcache.ogm.test.utils.EhcacheTestHelper * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 3. 29. 오후 10:03 */ @Slf4j public class EhcacheTestHelper implements TestableGridDialect { @Override public boolean assertNumberOfEntities(int numberOfEntities, SessionFactory sessionFactory) { return getEntityCache(sessionFactory).getSize() == numberOfEntities; } @Override public boolean assertNumberOfAssociations(int numberOfAssociations, SessionFactory sessionFactory) { return getAssociationCache(sessionFactory).getSize() == numberOfAssociations; } @Override @SuppressWarnings("unchecked") public Map<String, Object> extractEntityTuple(SessionFactory sessionFactory, EntityKey key) { return (Map<String, Object>) getEntityCache(sessionFactory).get(key).getObjectValue(); } private static Cache getEntityCache(SessionFactory sessionFactory) { EhcacheDatastoreProvider castProvider = getProvider(sessionFactory); return castProvider.getCacheManager().getCache(ENTITY_STORE); } private static EhcacheDatastoreProvider getProvider(SessionFactory sessionFactory) { DatastoreProvider provider = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry() .getService(DatastoreProvider.class); if (!(EhcacheDatastoreProvider.class.isInstance(provider))) { throw new RuntimeException("Not testing with Ehcache, cannot extract underlying cache"); } return EhcacheDatastoreProvider.class.cast(provider); } private static Cache getAssociationCache(SessionFactory sessionFactory) { EhcacheDatastoreProvider castProvider = getProvider(sessionFactory); return castProvider.getCacheManager().getCache(ASSOCIATION_STORE); } /** * TODO - EHCache _is_ transactional. Turn this on. We could turn on XA or Local. * Local will be faster. We will pick this up from the cache config. */ @Override public boolean backendSupportsTransactions() { return false; } @Override public void dropSchemaAndDatabase(SessionFactory sessionFactory) { //Nothing to do } @Override public Map<String, String> getEnvironmentProperties() { Map<String, String> props = new HashMap<String, String>(); // hibernate-search 환경설정 props.put("hibernate.search.default.indexmanager", "near-real-time"); props.put("hibernate.search.default.directory_provider", "filesystem"); props.put("hibernate.search.default.indexBase", ".lucene/indexes"); props.put("hibernate.search.default.locking_strategy", "simple"); // hibernate-search index worker settings props.put("hibernate.search.worker.execution", "async"); props.put("hibernate.search.worker.thread_pool.size", "8"); props.put("hibernate.search.worker.buffer_queue.max", "1000000"); // hibernate-search performance settings props.put("hibernate.search.default.indexwriter.max_buffered_doc", "true"); props.put("hibernate.search.default.indexwriter.max_merge_docs", "100"); props.put("hibernate.search.default.indexwriter.merge_factor", "20"); props.put("hibernate.search.default.indexwriter.term_index_interval", "default"); props.put("hibernate.search.default.indexwriter.ram_buffer_size", "2048"); props.put("hibernate.search.default.exclusive_index_use", "true"); return props; } }