package org.exoplatform.services.jcr.lab.infinispan;
import org.exoplatform.services.jcr.BaseStandaloneTest;
import org.infinispan.AdvancedCache;
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.manager.DefaultCacheManager;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author <a href="mailto:aboughzela@exoplatform.com">Aymen Boughzela</a>
* @version ${Revision}
* @date 19/02/16
*/
public class TestISPNWriteLock extends BaseStandaloneTest
{
AdvancedCache<String, Object> advancedCache;
private static final int CHILDS_COUNT = 2;
private static final int THREAD_COUNT = CHILDS_COUNT;
private ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
private AtomicInteger counter = new AtomicInteger(0);
public void setUp() throws Exception
{
super.setUp();
Cache<String, Object> cache = new DefaultCacheManager("conf/standalone/test-infinispan-config.xml").getCache();
advancedCache = cache.getAdvancedCache();
}
public void testPutCache() throws Exception
{
advancedCache.withFlags(Flag.SKIP_REMOTE_LOOKUP, Flag.IGNORE_RETURN_VALUES, Flag.CACHE_MODE_LOCAL).put("a", new HashSet());
for (int j = 0; j < CHILDS_COUNT; j++)
{
final int index = j;
executorService.execute(new Runnable()
{
public void run()
{
try
{
putCache("a", "input" + index);
}
catch (Exception e)
{
e.printStackTrace();
fail("Error while adding child node: " + e.getMessage());
}
finally
{
counter.incrementAndGet();
}
}
});
}
do
{
Thread.sleep(300);
}
while (counter.get() < CHILDS_COUNT);
Set<Object> foundObjects = (Set<Object>)advancedCache.get("a");
assertEquals(CHILDS_COUNT, foundObjects == null ? 0 : foundObjects.size());
}
public void putCache(String key, String value) throws Exception
{
advancedCache.getTransactionManager().begin();
Object existentObject = advancedCache.withFlags(Flag.FORCE_WRITE_LOCK).get(key);
Set<Object> newSet = new HashSet<Object>();
if (existentObject instanceof Set)
{
newSet.addAll((Set<Object>)existentObject);
}
newSet.add(value);
advancedCache.withFlags(Flag.SKIP_REMOTE_LOOKUP, Flag.IGNORE_RETURN_VALUES, Flag.CACHE_MODE_LOCAL).put("a", newSet);
advancedCache.getTransactionManager().commit();
}
public void tearDown()
{
}
@Override
protected String getRepositoryName()
{
return null;
}
}