package org.infinispan.stream; import static org.testng.AssertJUnit.assertEquals; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.stream.Stream; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.TransactionManager; import org.infinispan.Cache; import org.infinispan.container.entries.CacheEntry; import org.infinispan.filter.AcceptAllKeyValueFilter; import org.infinispan.filter.CacheFilters; import org.infinispan.filter.CollectionKeyFilter; import org.infinispan.filter.CompositeKeyValueFilterConverter; import org.infinispan.filter.KeyFilterAsKeyValueFilter; import org.infinispan.filter.KeyValueFilterConverter; import org.infinispan.test.TestingUtil; import org.testng.annotations.Test; /** * Test to verify distributed stream iterator when in a tx * * @author wburns * @since 8.0 */ @Test(groups = {"functional", "smoke"}, testName = "stream.DistributedStreamIteratorTxTest") public class DistributedStreamIteratorTxTest extends DistributedStreamIteratorTest { public DistributedStreamIteratorTxTest() { super(true); } public void testFilterWithExistingTransaction() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException { Map<Object, String> values = putValueInEachCache(3); Cache<Object, String> cache = cache(0, CACHE_NAME); TransactionManager tm = TestingUtil.extractComponent(cache, TransactionManager.class); tm.begin(); try { Object key = "filtered-key"; cache.put(key, "filtered-value"); Iterator<CacheEntry<Object, String>> iterator = cache.getAdvancedCache().cacheEntrySet().stream(). filter(CacheFilters.predicate(new KeyFilterAsKeyValueFilter<>(new CollectionKeyFilter<>( Collections.singleton(key))))).iterator(); Map<Object, String> results = mapFromIterator(iterator); assertEquals(values, results); } finally { tm.rollback(); } } @Test public void testConverterWithExistingTransaction() throws NotSupportedException, SystemException { Map<Object, String> values = putValuesInCache(); Cache<Object, String> cache = cache(0, CACHE_NAME); TransactionManager tm = TestingUtil.extractComponent(cache, TransactionManager.class); tm.begin(); try { Object key = "converted-key"; String value = "converted-value"; values.put(key, value); cache.put(key, "converted-value"); try (Stream<CacheEntry<Object, String>> stream = cache.getAdvancedCache().cacheEntrySet().stream(). filter(CacheFilters.predicate(AcceptAllKeyValueFilter.getInstance())). map(CacheFilters.function(new StringTruncator(2, 5)))) { Map<Object, String> results = mapFromStream(stream); assertEquals(values.size(), results.size()); for (Map.Entry<Object, String> entry : values.entrySet()) { assertEquals(entry.getValue().substring(2, 7), results.get(entry.getKey())); } } } finally { tm.rollback(); } } @Test public void testKeyFilterConverterWithExistingTransaction() throws NotSupportedException, SystemException { Map<Object, String> values = putValuesInCache(); Cache<Object, String> cache = cache(0, CACHE_NAME); TransactionManager tm = TestingUtil.extractComponent(cache, TransactionManager.class); tm.begin(); try { Iterator<Map.Entry<Object, String>> iter = values.entrySet().iterator(); Map.Entry<Object, String> extraEntry = iter.next(); while (iter.hasNext()) { iter.next(); iter.remove(); } Object key = "converted-key"; String value = "converted-value"; values.put(key, value); cache.put(key, "converted-value"); Collection<Object> acceptedKeys = new ArrayList<>(); acceptedKeys.add(key); acceptedKeys.add(extraEntry.getKey()); KeyValueFilterConverter<Object, String, String> filterConverter = new CompositeKeyValueFilterConverter<>( new KeyFilterAsKeyValueFilter<>(new CollectionKeyFilter<>(acceptedKeys, true)), new StringTruncator(2, 5)); try (Stream<CacheEntry<Object, String>> stream = CacheFilters.filterAndConvert( cache.getAdvancedCache().cacheEntrySet().stream(), filterConverter)) { Map<Object, String> results = mapFromStream(stream); assertEquals(values.size(), results.size()); for (Map.Entry<Object, String> entry : values.entrySet()) { assertEquals(entry.getValue().substring(2, 7), results.get(entry.getKey())); } } } finally { tm.rollback(); } } }