net.spy.memcached.protocol.binary.GetOperationImpl Maven / Gradle / Ivy
The newest version!
package net.spy.memcached.protocol.binary;
import java.util.Collection;
import java.util.Collections;
import net.spy.memcached.ops.GetOperation;
import net.spy.memcached.ops.GetsOperation;
import net.spy.memcached.ops.OperationStatus;
class GetOperationImpl extends OperationImpl
implements GetOperation, GetsOperation {
static final int CMD = 0;
/**
* Length of the extra header stuff for a GET response.
*/
static final int EXTRA_HDR_LEN = 4;
private final String key;
public GetOperationImpl(String k, GetOperation.Callback cb) {
super(CMD, generateOpaque(), cb);
key = k;
}
public GetOperationImpl(String k, GetsOperation.Callback cb) {
super(CMD, generateOpaque(), cb);
key = k;
}
@Override
public void initialize() {
prepareBuffer(key, 0, EMPTY_BYTES);
}
@Override
protected void decodePayload(byte[] pl) {
final int flags = decodeInt(pl, 0);
final byte[] data = new byte[pl.length - EXTRA_HDR_LEN];
System.arraycopy(pl, EXTRA_HDR_LEN, data, 0, pl.length - EXTRA_HDR_LEN);
// Assume we're processing a get unless the cast fails.
try {
GetOperation.Callback cb = (GetOperation.Callback) getCallback();
cb.gotData(key, flags, data);
} catch (ClassCastException e) {
GetsOperation.Callback cb = (GetsOperation.Callback) getCallback();
cb.gotData(key, flags, responseCas, data);
}
getCallback().receivedStatus(STATUS_OK);
}
@Override
protected OperationStatus getStatusForErrorCode(int errCode, byte[] errPl) {
return errCode == ERR_NOT_FOUND ? NOT_FOUND_STATUS : null;
}
public Collection getKeys() {
return Collections.singleton(key);
}
@Override
public boolean isBulkOperation() {
return false;
}
@Override
public boolean isPipeOperation() {
return false;
}
}