package org.infinispan.stream.impl; import java.util.Collection; import java.util.function.Supplier; import java.util.stream.Stream; import org.infinispan.container.entries.CacheEntry; import org.infinispan.factories.ComponentRegistry; /** * A terminal operation for a {@link org.infinispan.CacheStream} that allows tracking keys during a rehash event. * @param <K> key type for the entry returned * @param <R> return type when not utilizing rehash aware * @param <R2> value type for the entry returned */ public interface KeyTrackingTerminalOperation<K, R, R2> extends SegmentAwareOperation { /** * Collector used to collect items from intermediate responses of operations * @param <C> type of collected item */ interface IntermediateCollector<C> { /** * Called back when a response is sent back to the invoker * @param response the returned data */ void sendDataResonse(C response); } /** * Invoked when a key aware operation is desired without rehash being enabled. * @param response the collector that will be called back for any intermediate results * @return the final response from the remote node */ Collection<R> performOperation(IntermediateCollector<Collection<R>> response); /** * Invoked when a key and rehash aware operation is desired. * @param response the collector that will be called back for any intermediate results * @return the final response from the remote node */ Collection<CacheEntry<K, R2>> performOperationRehashAware( IntermediateCollector<Collection<CacheEntry<K, R2>>> response); /** * This method is to be invoked only locally after a key tracking operation has been serialized to a new node * @param supplier the supplier to use */ void setSupplier(Supplier<? extends Stream<?>> supplier); /** * Handles injection of components for various intermediate and this operation. * @param registry component registry to use */ void handleInjection(ComponentRegistry registry); }