package org.infinispan.marshall.exts; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Set; import org.infinispan.commands.CancelCommand; import org.infinispan.commands.CreateCacheCommand; import org.infinispan.commands.RemoveCacheCommand; import org.infinispan.commands.control.LockControlCommand; import org.infinispan.commands.read.DistributedExecuteCommand; import org.infinispan.commands.remote.CacheRpcCommand; import org.infinispan.commands.remote.ClusteredGetAllCommand; import org.infinispan.commands.remote.ClusteredGetCommand; import org.infinispan.commands.remote.SingleRpcCommand; import org.infinispan.commands.remote.recovery.CompleteTransactionCommand; import org.infinispan.commands.remote.recovery.GetInDoubtTransactionsCommand; import org.infinispan.commands.remote.recovery.GetInDoubtTxInfoCommand; import org.infinispan.commands.remote.recovery.TxCompletionNotificationCommand; import org.infinispan.commands.tx.CommitCommand; import org.infinispan.commands.tx.PrepareCommand; import org.infinispan.commands.tx.RollbackCommand; import org.infinispan.commands.tx.VersionedCommitCommand; import org.infinispan.commands.tx.VersionedPrepareCommand; import org.infinispan.commands.tx.totalorder.TotalOrderCommitCommand; import org.infinispan.commands.tx.totalorder.TotalOrderNonVersionedPrepareCommand; import org.infinispan.commands.tx.totalorder.TotalOrderRollbackCommand; import org.infinispan.commands.tx.totalorder.TotalOrderVersionedCommitCommand; import org.infinispan.commands.tx.totalorder.TotalOrderVersionedPrepareCommand; import org.infinispan.commands.write.BackupPutMapRpcCommand; import org.infinispan.commands.write.BackupWriteRpcCommand; import org.infinispan.commons.marshall.AbstractExternalizer; import org.infinispan.commons.util.Util; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.marshall.core.Ids; import org.infinispan.statetransfer.StateRequestCommand; import org.infinispan.statetransfer.StateResponseCommand; import org.infinispan.stream.impl.StreamRequestCommand; import org.infinispan.stream.impl.StreamResponseCommand; import org.infinispan.stream.impl.StreamSegmentResponseCommand; import org.infinispan.util.ByteString; import org.infinispan.xsite.SingleXSiteRpcCommand; import org.infinispan.xsite.XSiteAdminCommand; import org.infinispan.xsite.statetransfer.XSiteStatePushCommand; import org.infinispan.xsite.statetransfer.XSiteStateTransferControlCommand; /** * Externalizer in charge of marshalling cache specific commands. At read time, * this marshaller is able to locate the right cache marshaller and provide * it any externalizers implementations that follow. * * @author Galder ZamarreƱo * @since 5.1 */ public final class CacheRpcCommandExternalizer extends AbstractExternalizer<CacheRpcCommand> { private final GlobalComponentRegistry gcr; private final ReplicableCommandExternalizer cmdExt; public CacheRpcCommandExternalizer(GlobalComponentRegistry gcr, ReplicableCommandExternalizer cmdExt) { this.cmdExt = cmdExt; this.gcr = gcr; } @Override public Set<Class<? extends CacheRpcCommand>> getTypeClasses() { //noinspection unchecked Set<Class<? extends CacheRpcCommand>> coreCommands = Util.asSet(DistributedExecuteCommand.class, LockControlCommand.class, StateRequestCommand.class, StateResponseCommand.class, ClusteredGetCommand.class, SingleRpcCommand.class, CommitCommand.class, PrepareCommand.class, RollbackCommand.class, RemoveCacheCommand.class, TxCompletionNotificationCommand.class, GetInDoubtTransactionsCommand.class, GetInDoubtTxInfoCommand.class, CompleteTransactionCommand.class, VersionedPrepareCommand.class, CreateCacheCommand.class, CancelCommand.class, VersionedCommitCommand.class, XSiteAdminCommand.class, TotalOrderNonVersionedPrepareCommand.class, TotalOrderVersionedPrepareCommand.class, TotalOrderCommitCommand.class, TotalOrderVersionedCommitCommand.class, TotalOrderRollbackCommand.class, XSiteStateTransferControlCommand.class, XSiteStatePushCommand.class, SingleXSiteRpcCommand.class, ClusteredGetAllCommand.class, StreamRequestCommand.class, StreamSegmentResponseCommand.class, StreamResponseCommand.class, BackupWriteRpcCommand.class, BackupPutMapRpcCommand.class); // Only interested in cache specific replicable commands coreCommands.addAll(gcr.getModuleProperties().moduleCacheRpcCommands()); return coreCommands; } @Override public void writeObject(ObjectOutput output, CacheRpcCommand command) throws IOException { //header: type + method id. cmdExt.writeCommandHeader(output, command); ByteString cacheName = command.getCacheName(); ByteString.writeObject(output, cacheName); // Take the cache marshaller and generate the payload for the rest of // the command using that cache marshaller and the write the bytes in // the original payload. marshallParameters(command, output); } private void marshallParameters(CacheRpcCommand cmd, ObjectOutput oo) throws IOException { cmdExt.writeCommandParameters(oo, cmd); } @Override public CacheRpcCommand readObject(ObjectInput input) throws IOException, ClassNotFoundException { //header byte type = input.readByte(); byte methodId = (byte) input.readShort(); ByteString cacheName = ByteString.readObject(input); //create the object input CacheRpcCommand cacheRpcCommand = cmdExt.fromStream(methodId, type, cacheName); cmdExt.readCommandParameters(input, cacheRpcCommand); return cacheRpcCommand; } @Override public Integer getId() { return Ids.CACHE_RPC_COMMAND; } }