package me.arin.jacass.serializer;
import me.arin.jacass.JacassException;
import me.arin.jacass.Serializer;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class PrimitiveSerializer implements Serializer {
public static final Map<String, SuppportedType> typeMap = new HashMap<String, SuppportedType>();
static {
typeMap.put("java.lang.String", SuppportedType.STRING);
typeMap.put("int", SuppportedType.INT);
typeMap.put("java.lang.Integer", SuppportedType.INT);
typeMap.put("byte", SuppportedType.BYTE);
typeMap.put("java.lang.Byte", SuppportedType.BYTE);
typeMap.put("short", SuppportedType.SHORT);
typeMap.put("java.lang.Short", SuppportedType.SHORT);
typeMap.put("long", SuppportedType.LONG);
typeMap.put("java.lang.Long", SuppportedType.LONG);
typeMap.put("float", SuppportedType.FLOAT);
typeMap.put("java.lang.Float", SuppportedType.FLOAT);
typeMap.put("double", SuppportedType.DOUBLE);
typeMap.put("java.lang.Double", SuppportedType.DOUBLE);
typeMap.put("char", SuppportedType.CHAR);
typeMap.put("java.lang.Character", SuppportedType.CHAR);
typeMap.put("boolean", SuppportedType.BOOLEAN);
typeMap.put("java.lang.Boolean", SuppportedType.BOOLEAN);
}
public static SuppportedType getClassCode(Class cls) {
return typeMap.get(cls.getName());
}
public byte[] toBytes(Class cls, Object value) throws JacassException {
if (null == value) {
return new byte[]{};
}
if ("java.lang.String".equals(cls.getName())) {
return ((String) value).getBytes();
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
try {
SuppportedType classCode = PrimitiveSerializer.getClassCode(cls);
if (classCode == null) {
throw new JacassException("Unsupported type");
}
switch (classCode) {
case INT:
dout.writeInt((Integer) value);
break;
case BYTE:
Byte b = (Byte) value;
dout.writeByte(b.byteValue());
break;
case SHORT:
Short s = (Short) value;
dout.writeShort(s.shortValue());
break;
case LONG:
Long l = (Long) value;
dout.writeLong(l);
break;
case FLOAT:
Float f = (Float) value;
dout.writeFloat(f);
break;
case DOUBLE:
Double d = (Double) value;
dout.writeDouble(d);
break;
case CHAR:
Character c = (Character) value;
dout.writeChar(c);
break;
case BOOLEAN:
Boolean bool = (Boolean) value;
dout.writeBoolean(bool);
break;
default:
dout.writeByte(0);
break;
}
dout.flush();
} catch (IOException e) {
e.printStackTrace();
}
return bout.toByteArray();
}
public byte[] toBytes(Object value) throws JacassException {
return toBytes(value.getClass(), value);
}
public Object fromBytes(byte[] bytes) throws IOException {
return fromBytes(String.class, bytes);
}
public Object fromBytes(Class cls, byte[] bytes) throws IOException {
if ("java.lang.String".equals(cls.getName())) {
return new String(bytes);
}
Object castValue;
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
switch (PrimitiveSerializer.getClassCode(cls)) {
case INT:
castValue = dis.readInt();
break;
case BYTE:
castValue = dis.readByte();
break;
case SHORT:
castValue = dis.readShort();
break;
case LONG:
castValue = dis.readLong();
break;
case FLOAT:
castValue = dis.readFloat();
break;
case DOUBLE:
castValue = dis.readDouble();
break;
case CHAR:
castValue = dis.readChar();
break;
case BOOLEAN:
castValue = dis.readBoolean();
break;
default:
return null;
}
return castValue;
}
}