package me.prettyprint.cassandra.serializers;
import static me.prettyprint.hector.api.ddl.ComparatorType.BYTESTYPE;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import me.prettyprint.hector.api.Serializer;
import me.prettyprint.hector.api.ddl.ComparatorType;
/**
* A base class for serializer implementations. Takes care of the default
* implementations of to/fromBytesList and to/fromBytesMap. Extenders of this
* class only need to implement the toBytes and fromBytes.
*
* @author Ed Anuff
*
* @param <T>
*/
public abstract class AbstractSerializer<T> implements Serializer<T> {
@Override
public abstract ByteBuffer toByteBuffer(T obj);
@Override
public byte[] toBytes(T obj) {
ByteBuffer bb = toByteBuffer(obj);
byte[] bytes = new byte[bb.remaining()];
bb.get(bytes, 0, bytes.length);
return bytes;
}
@Override
public T fromBytes(byte[] bytes) {
return fromByteBuffer(ByteBuffer.wrap(bytes));
}
/*
* public ByteBuffer toByteBuffer(T obj) { return
* ByteBuffer.wrap(toBytes(obj)); }
*
* public ByteBuffer toByteBuffer(T obj, ByteBuffer byteBuffer, int offset,
* int length) { byteBuffer.put(toBytes(obj), offset, length); return
* byteBuffer; }
*/
@Override
public abstract T fromByteBuffer(ByteBuffer byteBuffer);
/*
* public T fromByteBuffer(ByteBuffer byteBuffer) { return
* fromBytes(byteBuffer.array()); }
*
* public T fromByteBuffer(ByteBuffer byteBuffer, int offset, int length) {
* return fromBytes(Arrays.copyOfRange(byteBuffer.array(), offset, length)); }
*/
@Override
public Set<ByteBuffer> toBytesSet(List<T> list) {
Set<ByteBuffer> bytesList = new HashSet<ByteBuffer>(
computeInitialHashSize(list.size()));
for (T s : list) {
bytesList.add(toByteBuffer(s));
}
return bytesList;
}
@Override
public List<T> fromBytesSet(Set<ByteBuffer> set) {
List<T> objList = new ArrayList<T>(set.size());
for (ByteBuffer b : set) {
objList.add(fromByteBuffer(b));
}
return objList;
}
@Override
public List<ByteBuffer> toBytesList(List<T> list) {
List<ByteBuffer> bytesList = new ArrayList<ByteBuffer>(list.size());
for (T s : list) {
bytesList.add(toByteBuffer(s));
}
return bytesList;
}
@Override
public List<T> fromBytesList(List<ByteBuffer> list) {
List<T> objList = new ArrayList<T>(list.size());
for (ByteBuffer s : list) {
objList.add(fromByteBuffer(s));
}
return objList;
}
@Override
public <V> Map<ByteBuffer, V> toBytesMap(Map<T, V> map) {
Map<ByteBuffer, V> bytesMap = new LinkedHashMap<ByteBuffer, V>(
computeInitialHashSize(map.size()));
for (Entry<T, V> entry : map.entrySet()) {
bytesMap.put(toByteBuffer(entry.getKey()), entry.getValue());
}
return bytesMap;
}
@Override
public <V> Map<T, V> fromBytesMap(Map<ByteBuffer, V> map) {
Map<T, V> objMap = new LinkedHashMap<T, V>(
computeInitialHashSize(map.size()));
for (Entry<ByteBuffer, V> entry : map.entrySet()) {
objMap.put(fromByteBuffer(entry.getKey()), entry.getValue());
}
return objMap;
}
public int computeInitialHashSize(int initialSize) {
return ((int) (initialSize / 0.75)) + 1;
}
public ComparatorType getComparatorType() {
return BYTESTYPE;
}
}