package org.infinispan.query.remote.impl.filter; import java.io.IOException; import org.infinispan.Cache; import org.infinispan.commons.CacheException; import org.infinispan.factories.annotations.Inject; import org.infinispan.notifications.cachelistener.filter.FilterIndexingServiceProvider; import org.infinispan.notifications.cachelistener.filter.IndexedFilter; import org.infinispan.protostream.ProtobufUtil; import org.infinispan.protostream.SerializationContext; import org.infinispan.query.continuous.impl.IckleContinuousQueryFilterIndexingServiceProvider; import org.infinispan.query.remote.client.ContinuousQueryResult; import org.infinispan.query.remote.impl.ProtobufMetadataManagerImpl; import org.kohsuke.MetaInfServices; /** * @author anistor@redhat.com * @since 8.1 */ @MetaInfServices(FilterIndexingServiceProvider.class) @SuppressWarnings("unused") public final class IckleContinuousQueryProtobufFilterIndexingServiceProvider extends IckleContinuousQueryFilterIndexingServiceProvider { private SerializationContext serCtx; private boolean isCompatMode; public IckleContinuousQueryProtobufFilterIndexingServiceProvider() { super(ContinuousQueryResult.ResultType.JOINING, ContinuousQueryResult.ResultType.UPDATED, ContinuousQueryResult.ResultType.LEAVING); } @Inject protected void injectDependencies(Cache cache) { serCtx = ProtobufMetadataManagerImpl.getSerializationContextInternal(cache.getCacheManager()); isCompatMode = cache.getCacheConfiguration().compatibility().enabled(); } @Override public boolean supportsFilter(IndexedFilter<?, ?, ?> indexedFilter) { return indexedFilter.getClass() == IckleContinuousQueryProtobufCacheEventFilterConverter.class; } @Override protected Object makeFilterResult(Object userContext, Object eventType, Object key, Object instance, Object[] projection, Comparable[] sortProjection) { try { if (isCompatMode) { key = ProtobufUtil.toWrappedByteArray(serCtx, key); if (instance != null) { instance = ProtobufUtil.toWrappedByteArray(serCtx, instance); } } Object result = new ContinuousQueryResult((ContinuousQueryResult.ResultType) eventType, (byte[]) key, (byte[]) instance, projection); if (!isCompatMode) { result = ProtobufUtil.toWrappedByteArray(serCtx, result); } return result; } catch (IOException e) { throw new CacheException(e); } } }