package com.tinkerpop.rexster.protocol.serializer.msgpack.templates;
import com.tinkerpop.rexster.protocol.msg.RexProMessageMeta;
import org.msgpack.packer.Packer;
import org.msgpack.template.AbstractTemplate;
import org.msgpack.template.Templates;
import org.msgpack.type.Value;
import org.msgpack.unpacker.Unpacker;
import java.io.IOException;
import java.util.Map;
/**
* Serializer for message meta fields
*
* @author Blake Eggleston (bdeggleston.github.com)
*/
public class MetaTemplate extends AbstractTemplate<RexProMessageMeta> {
@Override
public void write(Packer pk, RexProMessageMeta v) throws IOException {
write(pk, v, false);
}
public void write(final Packer pk, final RexProMessageMeta v, final boolean required) throws IOException {
RexProMessageMeta meta = v;
if (meta == null) {
meta = new RexProMessageMeta();
}
pk.writeMapBegin(meta.size());
for (Map.Entry pair : meta.entrySet()) {
pk.write(pair.getKey());
pk.write(pair.getValue());
}
pk.writeMapEnd();
}
@Override
public RexProMessageMeta read(Unpacker u, RexProMessageMeta to) throws IOException {
return read(u, to, false);
}
protected Object deserializeObject(Value v) {
if (v == null) {
return null;
} else if (v.isBooleanValue()) {
return v.asBooleanValue().getBoolean();
} else if (v.isFloatValue()) {
return v.asFloatValue().getDouble();
} else if (v.isIntegerValue()) {
return v.asIntegerValue().getInt();
} else {
return v.asRawValue().getString();
}
}
public RexProMessageMeta read(final Unpacker u, final RexProMessageMeta to, final boolean required) throws IOException {
if (!required && u.trySkipNil()) {
return null;
}
RexProMessageMeta meta;
if (to != null) {
meta = to;
meta.clear();
} else {
meta = new RexProMessageMeta();
}
int n = u.readMapBegin();
for (int i=0; i<n; i++) {
final String key = u.read(Templates.TString);
final Object val = deserializeObject(u.read(Templates.TValue));
meta.put(key, val);
}
u.readMapEnd();
return meta;
}
public static MetaTemplate instance = new MetaTemplate();
static public MetaTemplate getInstance() {
return instance;
}
}