package org.infinispan.marshall.exts;
import static org.infinispan.commons.marshall.Ids.TRIANGLE_ACK_EXTERNALIZER;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Set;
import org.infinispan.commands.remote.CacheRpcCommand;
import org.infinispan.commands.write.BackupAckCommand;
import org.infinispan.commands.write.BackupMultiKeyAckCommand;
import org.infinispan.commands.write.ExceptionAckCommand;
import org.infinispan.commons.marshall.AdvancedExternalizer;
import org.infinispan.commons.util.Util;
import org.infinispan.util.ByteString;
/**
* Externalizer for the triangle acknowledges.
* <p>
* It doesn't use the {@link org.infinispan.marshall.DeltaAwareObjectOutput} like the {@link
* CacheRpcCommandExternalizer}.
*
* @author Pedro Ruivo
* @since 9.0
*/
public class TriangleAckExternalizer implements AdvancedExternalizer<CacheRpcCommand> {
public Set<Class<? extends CacheRpcCommand>> getTypeClasses() {
//noinspection unchecked
return Util.asSet(BackupAckCommand.class, ExceptionAckCommand.class, BackupMultiKeyAckCommand.class);
}
public Integer getId() {
return TRIANGLE_ACK_EXTERNALIZER;
}
public void writeObject(ObjectOutput output, CacheRpcCommand object) throws IOException {
output.writeByte(object.getCommandId());
ByteString.writeObject(output, object.getCacheName());
object.writeTo(output);
}
public CacheRpcCommand readObject(ObjectInput input) throws IOException, ClassNotFoundException {
switch (input.readByte()) {
case BackupAckCommand.COMMAND_ID:
return backupAckCommand(input);
case ExceptionAckCommand.COMMAND_ID:
return exceptionAckCommand(input);
case BackupMultiKeyAckCommand.COMMAND_ID:
return backupMultiKeyAckCommand(input);
default:
throw new IllegalStateException();
}
}
private BackupMultiKeyAckCommand backupMultiKeyAckCommand(ObjectInput input)
throws IOException, ClassNotFoundException {
BackupMultiKeyAckCommand command = new BackupMultiKeyAckCommand(ByteString.readObject(input));
command.readFrom(input);
return command;
}
private ExceptionAckCommand exceptionAckCommand(ObjectInput input) throws IOException, ClassNotFoundException {
ExceptionAckCommand command = new ExceptionAckCommand(ByteString.readObject(input));
command.readFrom(input);
return command;
}
private BackupAckCommand backupAckCommand(ObjectInput input) throws IOException, ClassNotFoundException {
BackupAckCommand command = new BackupAckCommand(ByteString.readObject(input));
command.readFrom(input);
return command;
}
}