package org.corfudb.protocols.wireprotocol;
import io.netty.buffer.ByteBuf;
import lombok.*;
import java.util.*;
/**
* Created by mwei on 8/9/16.
*/
@Builder
@AllArgsConstructor
public class WriteRequest implements ICorfuPayload<WriteRequest>, IMetadata {
@Getter
final WriteMode writeMode;
@Getter
final Map<UUID, Long> streamAddresses;
@Getter
final ILogData data;
@SuppressWarnings("unchecked")
public WriteRequest(ByteBuf buf) {
writeMode = ICorfuPayload.fromBuffer(buf, WriteMode.class);
if (writeMode == WriteMode.REPLEX_STREAM) {
streamAddresses = ICorfuPayload.mapFromBuffer(buf, UUID.class, Long.class);
} else { streamAddresses = null; }
data = ICorfuPayload.fromBuffer(buf, LogData.class);
}
public WriteRequest(WriteMode writeMode, Map<UUID, Long> streamAddresses, ByteBuf buf) {
this(writeMode, DataType.DATA, streamAddresses, buf);
}
public WriteRequest(WriteMode writeMode, DataType dataType, Map<UUID, Long> streamAddresses, ByteBuf buf) {
this.writeMode = writeMode;
this.streamAddresses = streamAddresses;
this.data = new LogData(dataType, buf);
}
public WriteRequest(ILogData data) {
writeMode = WriteMode.NORMAL;
this.data = data;
streamAddresses = null;
}
@Override
public void doSerialize(ByteBuf buf) {
ICorfuPayload.serialize(buf, writeMode);
if (writeMode == WriteMode.REPLEX_STREAM) {
ICorfuPayload.serialize(buf, streamAddresses);
}
ICorfuPayload.serialize(buf, data);
}
@Override
public EnumMap<LogUnitMetadataType, Object> getMetadataMap() {
return data.getMetadataMap();
}
// This class sets defaults for the builder pattern.
public static class WriteRequestBuilder {
private WriteMode writeMode = WriteMode.NORMAL;
}
}