public final void writeFieldValue(Object value)
throws IOException
{
if(value instanceof String) {
writeOctet('S');
writeLongstr((String)value);
}
else if(value instanceof LongString) {
writeOctet('S');
writeLongstr((LongString)value);
}
else if(value instanceof Integer) {
writeOctet('I');
writeLong((Integer) value);
}
else if(value instanceof BigDecimal) {
writeOctet('D');
BigDecimal decimal = (BigDecimal)value;
writeOctet(decimal.scale());
BigInteger unscaled = decimal.unscaledValue();
if(unscaled.bitLength() > 32) /*Integer.SIZE in Java 1.5*/
throw new IllegalArgumentException
("BigDecimal too large to be encoded");
writeLong(decimal.unscaledValue().intValue());
}
else if(value instanceof Date) {
writeOctet('T');
writeTimestamp((Date)value);
}
else if(value instanceof Map) {
writeOctet('F');
// Ignore the warnings here. We hate erasure
// (not even a little respect)
// (We even have trouble recognising it.)
@SuppressWarnings("unchecked")
Map<String,Object> map = (Map<String,Object>) value;
writeTable(map);
}
else if (value instanceof Byte) {
writeOctet('b');
out.writeByte((Byte)value);
}
else if(value instanceof Double) {
writeOctet('d');
out.writeDouble((Double)value);
}
else if(value instanceof Float) {
writeOctet('f');
out.writeFloat((Float)value);
}
else if(value instanceof Long) {
writeOctet('l');
out.writeLong((Long)value);
}
else if(value instanceof Short) {
writeOctet('s');
out.writeShort((Short)value);
}
else if(value instanceof Boolean) {
writeOctet('t');
out.writeBoolean((Boolean)value);
}
else if(value instanceof byte[]) {
writeOctet('x');
writeLong(((byte[])value).length);
out.write((byte[])value);
}
else if(value == null) {
writeOctet('V');
}
else if(value instanceof List) {
writeOctet('A');
writeArray((List<?>)value);
}
else if(value instanceof Object[]) {
writeOctet('A');
writeArray((Object[])value);
}
else {
throw new IllegalArgumentException
("Invalid value type: " + value.getClass().getName());
}
}