package org.infinispan.query.indexmanager;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.concurrent.CompletableFuture;
import org.hibernate.search.spi.SearchIntegrator;
import org.infinispan.Cache;
import org.infinispan.commands.ReplicableCommand;
import org.infinispan.commands.remote.BaseRpcCommand;
import org.infinispan.commons.CacheException;
import org.infinispan.commons.marshall.MarshallUtil;
import org.infinispan.query.SearchManager;
import org.infinispan.query.backend.QueryInterceptor;
import org.infinispan.query.impl.CommandInitializer;
import org.infinispan.query.impl.ComponentRegistryUtils;
import org.infinispan.query.impl.CustomQueryCommand;
import org.infinispan.query.impl.SearchManagerImpl;
import org.infinispan.query.logging.Log;
import org.infinispan.util.ByteString;
import org.infinispan.util.logging.LogFactory;
/**
* Base class for index commands
*
* @author gustavonalle
* @since 7.0
*/
public abstract class AbstractUpdateCommand extends BaseRpcCommand implements ReplicableCommand, CustomQueryCommand {
protected static final Log log = LogFactory.getLog(AbstractUpdateCommand.class, Log.class);
protected SearchIntegrator searchFactory;
protected String indexName;
protected byte[] serializedModel;
protected QueryInterceptor queryInterceptor;
protected AbstractUpdateCommand(ByteString cacheName) {
super(cacheName);
}
@Override
public abstract CompletableFuture<Object> invokeAsync() throws Throwable;
@Override
public abstract byte getCommandId();
@Override
public void writeTo(ObjectOutput output) throws IOException {
if (indexName == null) {
output.writeBoolean(false);
} else {
output.writeBoolean(true);
output.writeUTF(indexName);
}
MarshallUtil.marshallByteArray(serializedModel, output);
}
@Override
public void readFrom(ObjectInput input) throws IOException, ClassNotFoundException {
boolean hasIndexName = input.readBoolean();
if (hasIndexName) {
indexName = input.readUTF();
}
serializedModel = MarshallUtil.unmarshallByteArray(input);
}
@Override
public boolean isReturnValueExpected() {
return false;
}
/**
* This is invoked only on the receiving node, before {@link #perform(org.infinispan.context.InvocationContext)}.
*/
@Override
public void fetchExecutionContext(CommandInitializer ci) {
String name = cacheName.toString();
if (ci.getCacheManager().cacheExists(name)) {
Cache cache = ci.getCacheManager().getCache(name);
SearchManager searchManager = new SearchManagerImpl(cache.getAdvancedCache());
searchFactory = searchManager.unwrap(SearchIntegrator.class);
queryInterceptor = ComponentRegistryUtils.getQueryInterceptor(cache);
} else {
throw new CacheException("Cache named '" + name + "' does not exist on this CacheManager, or was not started");
}
}
@Override
public boolean canBlock() {
return true;
}
public String getIndexName() {
return indexName;
}
protected void setSerializedWorkList(byte[] serializedModel) {
this.serializedModel = serializedModel;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
}