package org.hibernate.test.cache.infinispan.util;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
import org.infinispan.commons.executors.CachedThreadPoolExecutorFactory;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.TransportConfigurationBuilder;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.fwk.TestResourceTracker;
import org.infinispan.transaction.TransactionMode;
import org.infinispan.util.TimeService;
import java.util.Map;
import java.util.Properties;
/**
* Factory that should be overridden in tests.
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class TestInfinispanRegionFactory extends InfinispanRegionFactory {
protected static final String PREFIX = TestInfinispanRegionFactory.class.getName() + ".";
public static final String TRANSACTIONAL = PREFIX + "transactional";
public static final String CACHE_MODE = PREFIX + "cacheMode";
public static final String TIME_SERVICE = PREFIX + "timeService";
public static final String PENDING_PUTS_SIMPLE = PREFIX + "pendingPuts.simple";
private final boolean transactional;
private final CacheMode cacheMode;
private final TimeService timeService;
private final boolean pendingPutsSimple;
public TestInfinispanRegionFactory(Properties properties) {
transactional = (boolean) properties.getOrDefault(TRANSACTIONAL, false);
cacheMode = (CacheMode) properties.getOrDefault(CACHE_MODE, null);
timeService = (TimeService) properties.getOrDefault(TIME_SERVICE, null);
pendingPutsSimple = (boolean) properties.getOrDefault(PENDING_PUTS_SIMPLE, true);
}
@Override
protected EmbeddedCacheManager createCacheManager(ConfigurationBuilderHolder holder) {
// If the cache manager has been provided by calling setCacheManager, don't create a new one
EmbeddedCacheManager cacheManager = getCacheManager();
if (cacheManager != null) {
return cacheManager;
}
amendConfiguration(holder);
cacheManager = new DefaultCacheManager(holder, true);
if (timeService != null) {
cacheManager.getGlobalComponentRegistry().registerComponent(timeService, TimeService.class);
cacheManager.getGlobalComponentRegistry().rewire();
}
return cacheManager;
}
protected void amendConfiguration(ConfigurationBuilderHolder holder) {
holder.getGlobalConfigurationBuilder().globalJmxStatistics().allowDuplicateDomains(true);
TransportConfigurationBuilder transport = holder.getGlobalConfigurationBuilder().transport();
transport.nodeName(TestResourceTracker.getNextNodeName());
transport.clusterName(TestResourceTracker.getCurrentTestName());
// minimize number of threads using unlimited cached thread pool
transport.remoteCommandThreadPool().threadPoolFactory(CachedThreadPoolExecutorFactory.create());
transport.transportThreadPool().threadPoolFactory(CachedThreadPoolExecutorFactory.create());
for (Map.Entry<String, ConfigurationBuilder> cfg : holder.getNamedConfigurationBuilders().entrySet()) {
amendCacheConfiguration(cfg.getKey(), cfg.getValue());
}
// disable simple cache for testing as we need to insert interceptors
if (!pendingPutsSimple) {
holder.getNamedConfigurationBuilders().get(InfinispanRegionFactory.DEF_PENDING_PUTS_RESOURCE).simpleCache(false);
}
}
protected void amendCacheConfiguration(String cacheName, ConfigurationBuilder configurationBuilder) {
if (cacheName.equals(InfinispanRegionFactory.DEF_PENDING_PUTS_RESOURCE)) {
return;
}
if (transactional) {
if (!cacheName.endsWith("query") && !cacheName.equals(DEF_TIMESTAMPS_RESOURCE) && !cacheName.endsWith(InfinispanRegionFactory.DEF_PENDING_PUTS_RESOURCE)) {
configurationBuilder.transaction().transactionMode(TransactionMode.TRANSACTIONAL).useSynchronization(true);
}
} else {
configurationBuilder.transaction().transactionMode(TransactionMode.NON_TRANSACTIONAL);
}
if (cacheMode != null) {
if (configurationBuilder.clustering().cacheMode().isInvalidation()) {
configurationBuilder.clustering().cacheMode(cacheMode);
}
}
}
@Override
public long nextTimestamp() {
if (timeService == null) {
return super.nextTimestamp();
} else {
return timeService.wallClockTime();
}
}
}