package voldemort.server.protocol.vold;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import voldemort.VoldemortException;
import voldemort.store.Store;
import voldemort.utils.ByteArray;
import voldemort.versioning.Versioned;
public class GetAllRequestHandler extends ClientRequestHandler {
private static final Logger logger = Logger.getLogger(VoldemortNativeRequestHandler.class);
List<ByteArray> keys;
Map<ByteArray, byte[]> transforms;
Map<ByteArray, List<Versioned<byte[]>>> results;
public GetAllRequestHandler(Store<ByteArray, byte[], byte[]> store, int protocolVersion) {
super(store, protocolVersion);
}
public static boolean isCompleteRequest(DataInputStream inputStream,
ByteBuffer buffer,
int protocolVersion) throws IOException,
VoldemortException {
int numKeys = inputStream.readInt();
// Read the keys to skip the bytes.
for(int i = 0; i < numKeys; i++) {
if(!ClientRequestHandler.skipByteArray(inputStream, buffer))
return false;
}
if(protocolVersion > 2) {
boolean hasTransform = inputStream.readBoolean();
if(hasTransform) {
int numTrans = inputStream.readInt();
for(int i = 0; i < numTrans; i++) {
if(!ClientRequestHandler.skipByteArray(inputStream, buffer))
return false;
ClientRequestHandler.readTransforms(inputStream);
}
}
}
return true;
}
@Override
public boolean parseRequest(DataInputStream inputStream) throws IOException {
int numKeys = inputStream.readInt();
keys = new ArrayList<ByteArray>(numKeys);
for(int i = 0; i < numKeys; i++)
keys.add(ClientRequestHandler.readKey(inputStream));
if(protocolVersion > 2) {
if(inputStream.readBoolean()) {
int size = inputStream.readInt();
transforms = new HashMap<ByteArray, byte[]>(size);
for(int i = 0; i < size; i++) {
transforms.put(ClientRequestHandler.readKey(inputStream),
ClientRequestHandler.readTransforms(inputStream));
}
}
}
return true;
}
@Override
public void processRequest() throws VoldemortException {
results = store.getAll(keys, transforms);
}
@Override
public void writeResponse(DataOutputStream outputStream) throws IOException {
outputStream.writeShort(0);
outputStream.writeInt(results.size());
for(Map.Entry<ByteArray, List<Versioned<byte[]>>> entry: results.entrySet()) {
// write the key
outputStream.writeInt(entry.getKey().length());
outputStream.write(entry.getKey().get());
// write the values
ClientRequestHandler.writeResults(outputStream, entry.getValue());
}
}
@Override
public int getResponseSize() {
int size = 2 + 4;
for(Map.Entry<ByteArray, List<Versioned<byte[]>>> entry: results.entrySet()) {
// write the key
size += 4 + entry.getKey().length();
// write the values
size += ClientRequestHandler.getResultsSize(entry.getValue());
}
return size;
}
public String getDebugMessage() {
StringBuilder sb = new StringBuilder();
sb.append("Operation GETALL ");
for(Map.Entry<ByteArray, List<Versioned<byte[]>>> entry: results.entrySet()) {
sb.append(ClientRequestHandler.getDebugMessageForKey(entry.getKey()));
sb.append(ClientRequestHandler.getDebugMessageForValue(entry.getValue()));
}
return sb.toString();
}
}