package org.infinispan.notifications.cachelistener.filter;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import org.infinispan.metadata.Metadata;
import org.infinispan.notifications.cachelistener.CacheEntryListenerInvocation;
/**
* A service provider for filter indexing services. This is supposed to perform the filtering operation in a more
* efficient way than directly executing the filter by calling the {@link org.infinispan.notifications.cachelistener.filter.CacheEventFilterConverter#filterAndConvert(Object,
* Object, Metadata, Object, Metadata, EventType)} method. Implementations are discovered via the {@link
* java.util.ServiceLoader} or {@link org.infinispan.commons.util.ServiceFinder} mechanism. Implementations may have
* their dependencies injected using the {@link org.infinispan.factories.annotations.Inject} annotation.
*
* @author anistor@redhat.com
* @since 7.2
*/
public interface FilterIndexingServiceProvider {
/**
* Start the provider. This is called after the dependencies are injected.
*/
void start();
/**
* Reports whether this provider supports the given filter type.
*
* @param indexedFilter an indexable filter
* @return {@code true} if the filter is supported, {@code false} otherwise
*/
boolean supportsFilter(IndexedFilter<?, ?, ?> indexedFilter);
/**
* Starts handling an invocation that uses an {@link IndexedFilter}.
*
* @param invocation the invocation to handle
* @param <K> cache key type
* @param <V> cache value type
* @return the wrapped invocation
*/
<K, V> DelegatingCacheEntryListenerInvocation<K, V> interceptListenerInvocation(CacheEntryListenerInvocation<K, V> invocation);
<K, V> void registerListenerInvocations(boolean isClustered, boolean isPrimaryOnly, boolean filterAndConvert,
IndexedFilter<?, ?, ?> indexedFilter,
Map<Class<? extends Annotation>, List<DelegatingCacheEntryListenerInvocation<K, V>>> listeners);
/**
* Stop the provider.
*/
void stop();
}