package org.infinispan.query.remote.impl; import java.io.IOException; import org.hibernate.search.spi.SearchIntegrator; import org.infinispan.commons.CacheException; import org.infinispan.objectfilter.impl.ReflectionMatcher; import org.infinispan.objectfilter.impl.syntax.parser.EntityNameResolver; import org.infinispan.protostream.ProtobufUtil; import org.infinispan.protostream.SerializationContext; import org.infinispan.query.dsl.embedded.impl.HibernateSearchPropertyHelper; /** * A sub-class of ReflectionMatcher that is able to lookup classes by their protobuf type name and can work when * compatibility mode is used. * * @author anistor@redhat.com * @since 7.0 */ public final class CompatibilityReflectionMatcher extends ReflectionMatcher { private final SerializationContext serializationContext; CompatibilityReflectionMatcher(SerializationContext serializationContext, SearchIntegrator searchFactory) { super(new HibernateSearchPropertyHelper(searchFactory, getEntityNameResolver(serializationContext))); this.serializationContext = serializationContext; } CompatibilityReflectionMatcher(SerializationContext serializationContext) { super(getEntityNameResolver(serializationContext)); this.serializationContext = serializationContext; } private static EntityNameResolver getEntityNameResolver(SerializationContext serializationContext) { return entityName -> serializationContext.canMarshall(entityName) ? serializationContext.getMarshaller(entityName).getJavaClass() : null; } /** * Marshals the instance using Protobuf. * * @param instance never null * @return the converted/decorated instance */ @Override protected Object convert(Object instance) { try { return ProtobufUtil.toWrappedByteArray(serializationContext, instance); } catch (IOException e) { throw new CacheException(e); } } }