package info.jerrinot.hazelcast;
import com.hazelcast.nio.serialization.ClassDefinition;
import com.hazelcast.nio.serialization.ClassDefinitionSetter;
import com.hazelcast.nio.serialization.Data;
import com.hazelcast.storage.DataRef;
import com.hazelcast.storage.Storage;
import info.jerrinot.nettyloc.ByteBuf;
import info.jerrinot.nettyloc.PooledByteBufAllocator;
public class NettyStorage implements Storage<DataRef> {
private PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
@Override
public DataRef put(int hash, Data data) {
byte[] buffer = data.getBuffer();
ByteBuf byteBuf = allocator.directBuffer(buffer.length);
byteBuf.writeBytes(buffer);
ClassDefinition classDefinition = data.getClassDefinition();
return new NettyDataRef(byteBuf, data.getType(), classDefinition);
}
@Override
public Data get(int hash, DataRef ref) {
NettyDataRef nettyDataRef = (NettyDataRef) ref;
ByteBuf byteBuf = null;
try {
byteBuf = nettyDataRef.getByteBuf();
byteBuf.retain();
int type = nettyDataRef.getType();
byte[] buffer = new byte[byteBuf.capacity()];
byteBuf.readBytes(buffer);
Data data = new Data(type, buffer);
ClassDefinitionSetter.setClassDefinition(nettyDataRef.getClassDefinition(), data);
return data;
} finally {
if (byteBuf != null) {
byteBuf.release();
}
}
}
@Override
public void remove(int hash, DataRef ref) {
NettyDataRef nettyDataRef = (NettyDataRef) ref;
nettyDataRef.getByteBuf().release();
}
@Override
public void destroy() {
throw new UnsupportedOperationException("Not implemented yet");
}
}