package org.infinispan.stream.impl.interceptor; import java.util.stream.StreamSupport; import org.infinispan.Cache; import org.infinispan.CacheSet; import org.infinispan.CacheStream; import org.infinispan.commons.util.CloseableSpliterator; import org.infinispan.container.entries.CacheEntry; import org.infinispan.distribution.DistributionManager; import org.infinispan.stream.impl.local.EntryStreamSupplier; import org.infinispan.stream.impl.local.LocalCacheStream; import org.infinispan.util.AbstractDelegatingCacheSet; /** * Abstract cache entry set that delegates to the underlying cache for stream usage * @param <K> key type of the cache * @param <V> value type of the cache */ public abstract class AbstractDelegatingEntryCacheSet<K, V> extends AbstractDelegatingCacheSet<CacheEntry<K, V>> { private final Cache<K, V> cache; private final CacheSet<CacheEntry<K, V>> set; protected AbstractDelegatingEntryCacheSet(Cache<K, V> cache, CacheSet<CacheEntry<K, V>> set) { this.cache = cache; this.set = set; } @Override protected final CacheSet<CacheEntry<K, V>> delegate() { return set; } @Override public CacheStream<CacheEntry<K, V>> stream() { return getStream(false); } @Override public CacheStream<CacheEntry<K, V>> parallelStream() { return getStream(true); } protected CacheStream<CacheEntry<K, V>> getStream(boolean parallel) { DistributionManager dm = cache.getAdvancedCache().getDistributionManager(); CloseableSpliterator<CacheEntry<K, V>> closeableSpliterator = spliterator(); CacheStream<CacheEntry<K, V>> stream = new LocalCacheStream<>(new EntryStreamSupplier<>(cache, dm != null ? dm.getWriteConsistentHash() : null, () -> StreamSupport.stream(closeableSpliterator, false)), parallel, cache.getAdvancedCache().getComponentRegistry()); // We rely on the fact that on close returns the same instance stream.onClose(closeableSpliterator::close); return stream; } }