package org.infinispan.client.hotrod.impl.query; import org.infinispan.client.hotrod.exceptions.HotRodClientException; import org.infinispan.client.hotrod.impl.RemoteCacheImpl; import org.infinispan.client.hotrod.marshall.ProtoStreamMarshaller; import org.infinispan.protostream.SerializationContext; import org.infinispan.query.dsl.Query; import org.infinispan.query.dsl.QueryBuilder; import org.infinispan.query.dsl.impl.BaseQueryFactory; import org.infinispan.query.remote.client.MarshallerRegistration; import org.infinispan.query.remote.client.QueryRequest; /** * @author anistor@redhat.com * @since 6.0 */ public final class RemoteQueryFactory extends BaseQueryFactory { private final RemoteCacheImpl cache; private final SerializationContext serializationContext; public RemoteQueryFactory(RemoteCacheImpl cache) { serializationContext = ProtoStreamMarshaller.getSerializationContext(cache.getRemoteCacheManager()); this.cache = cache; try { if (!serializationContext.canMarshall(QueryRequest.class)) { MarshallerRegistration.registerMarshallers(serializationContext); } } catch (Exception e) { throw new HotRodClientException("Failed to initialise the Protobuf serialization context", e); } } @Override public Query create(String queryString) { return new RemoteQuery(this, cache, serializationContext, queryString); } @Override public QueryBuilder from(Class<?> entityType) { String typeName = serializationContext.getMarshaller(entityType).getTypeName(); return new RemoteQueryBuilder(this, cache, serializationContext, typeName); } @Override public QueryBuilder from(String entityType) { // just check that the type name is valid serializationContext.getMarshaller(entityType); return new RemoteQueryBuilder(this, cache, serializationContext, entityType); } }