package org.infinispan.query.helper;
import static org.testng.AssertJUnit.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
public class TestableCluster<K, V> {
private final List<EmbeddedCacheManager> cacheManagers = new ArrayList<>();
private final List<Cache<K, V>> caches = new ArrayList<>();
private final String configurationResourceName;
public TestableCluster(String configurationResourceName) {
this.configurationResourceName = configurationResourceName;
}
public synchronized EmbeddedCacheManager startNewNode() {
EmbeddedCacheManager cacheManager;
try {
cacheManager = TestCacheManagerFactory.fromXml(configurationResourceName);
} catch (IOException e) {
throw new RuntimeException(e);
}
cacheManagers.add(cacheManager);
Cache<K, V> cache = cacheManager.getCache();
caches.add(cache);
waitForStableTopology(cache, caches);
return cacheManager;
}
public synchronized Cache<K, V> getCache(int nodeId) {
return caches.get(nodeId);
}
public synchronized void killAll() {
TestingUtil.killCacheManagers(cacheManagers);
caches.clear();
cacheManagers.clear();
}
public synchronized Iterable<Cache<K, V>> iterateAllCaches() {
return new ArrayList<Cache<K, V>>(caches);
}
public synchronized void killNode(Cache<K, V> cache) {
EmbeddedCacheManager cacheManager = cache.getCacheManager();
TestingUtil.killCacheManagers(cacheManager);
assertTrue(caches.remove(cache));
assertTrue(cacheManagers.remove(cacheManager));
waitForStableTopology(cache, caches);
}
private static <K, V> void waitForStableTopology(Cache<K, V> cache, List<Cache<K, V>> caches) {
if (cache.getCacheConfiguration().clustering().cacheMode() != CacheMode.LOCAL) {
TestingUtil.waitForNoRebalance(caches);
}
}
}