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.distribution.DistributionManager; import org.infinispan.stream.impl.local.KeyStreamSupplier; import org.infinispan.stream.impl.local.LocalCacheStream; import org.infinispan.util.AbstractDelegatingCacheSet; /** * Abstract cache key 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 AbstractDelegatingKeyCacheSet<K, V> extends AbstractDelegatingCacheSet<K> { private final Cache<K, V> cache; private final CacheSet<K> set; protected AbstractDelegatingKeyCacheSet(Cache<K, V> cache, CacheSet<K> set) { this.cache = cache; this.set = set; } @Override protected final CacheSet<K> delegate() { return set; } @Override public CacheStream<K> stream() { return getStream(false); } @Override public CacheStream<K> parallelStream() { return getStream(true); } protected CacheStream<K> getStream(boolean parallel) { DistributionManager dm = cache.getAdvancedCache().getDistributionManager(); CloseableSpliterator<K> closeableSpliterator = spliterator(); CacheStream<K> stream = new LocalCacheStream<>(new KeyStreamSupplier<>(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; } }