use of net.morimekta.util.Binary in project providence by morimekta.
the class TProtocolSerializerTest method assertConsistent.
@SuppressWarnings("unchecked")
public <Providence extends PMessage<Providence, ProvidenceField>, ProvidenceField extends PField, Thrift extends TBase<Thrift, ThriftField>, ThriftField extends TFieldIdEnum> void assertConsistent(String prefix, Providence providence, Thrift thrift) {
if (providence.descriptor().getVariant() == PMessageVariant.UNION) {
TUnion<?, ThriftField> t_union = (TUnion) thrift;
PUnion<?, ProvidenceField> p_union = (PUnion) providence;
ThriftField t_field = t_union.getSetField();
PField p_field = p_union.unionField();
assertEquals(p_field.getId(), t_field.getThriftFieldId());
} else {
for (PField field : providence.descriptor().getFields()) {
ThriftField thriftField = thrift.fieldForId(field.getId());
String fieldPath = (prefix.isEmpty() ? "" : prefix + ".") + field.getName();
assertEquals("has " + fieldPath, providence.has(field.getId()), thrift.isSet(thriftField));
if (providence.has(field.getId())) {
switch(field.getType()) {
case MESSAGE:
assertConsistent(fieldPath, (PMessage) providence.get(field.getId()), (TBase) thrift.getFieldValue(thriftField));
break;
case ENUM:
{
PEnumValue<?> pe = providence.get(field.getId());
TEnum te = (TEnum) thrift.getFieldValue(thriftField);
assertEquals(fieldPath, pe.asInteger(), te.getValue());
break;
}
case BINARY:
{
Binary pBin = providence.get(field.getId());
byte[] tBytes = (byte[]) thrift.getFieldValue(thriftField);
Binary tBin = Binary.wrap(tBytes);
assertEquals(fieldPath, pBin, tBin);
break;
}
case MAP:
{
Map pm = providence.get(field.getId());
Map tm = (Map) thrift.getFieldValue(thriftField);
assertEquals(fieldPath + " size", pm.size(), tm.size());
// TODO: Compare actual content.
break;
}
case SET:
{
Set ps = providence.get(field.getId());
Set ts = (Set) thrift.getFieldValue(thriftField);
assertEquals(fieldPath + " size", ps.size(), ts.size());
// TODO: Compare actual content.
break;
}
case LIST:
{
List pl = providence.get(field.getId());
List tl = (List) thrift.getFieldValue(thriftField);
assertEquals(fieldPath + " size", pl.size(), tl.size());
for (int i = 0; i < pl.size(); ++i) {
String itemPath = fieldPath + "[" + i + "]";
Object pi = pl.get(i);
Object ti = tl.get(i);
if (pi instanceof PMessage) {
assertConsistent(itemPath, (PMessage) pi, (TBase) ti);
} else if (pi instanceof Set) {
// TODO: Compare actual content.
} else if (pi instanceof List) {
// TODO: Compare actual content.
} else if (pi instanceof Map) {
// TODO: Compare actual content.
} else if (pi instanceof Binary) {
Binary pb = (Binary) pi;
Binary tb = Binary.wrap(((ByteBuffer) ti).array());
assertEquals(itemPath, pb, tb);
} else if (pi instanceof PEnumValue) {
PEnumValue pe = (PEnumValue) pi;
TEnum te = (TEnum) ti;
assertEquals(itemPath, pe.asInteger(), te.getValue());
} else {
assertEquals(itemPath, pi, ti);
}
}
break;
}
default:
assertEquals(fieldPath, providence.get(field.getId()), thrift.getFieldValue(thriftField));
break;
}
}
}
}
}
use of net.morimekta.util.Binary in project providence by morimekta.
the class MessageFieldArgument method apply.
@Override
@SuppressWarnings("unchecked")
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
if (message.has(field)) {
switch(field.getType()) {
case BOOL:
{
boolean value = message.get(field);
if (type == Types.BOOLEAN || type == Types.BIT) {
statement.setBoolean(position, value);
} else {
statement.setInt(position, value ? 1 : 0);
}
break;
}
case BYTE:
{
statement.setByte(position, message.get(field));
break;
}
case I16:
{
statement.setShort(position, message.get(field));
break;
}
case I32:
{
if (type == Types.TIMESTAMP) {
Timestamp timestamp = new Timestamp(1000L * (int) message.get(field));
statement.setTimestamp(position, timestamp);
} else {
statement.setInt(position, message.get(field));
}
break;
}
case I64:
{
if (type == Types.TIMESTAMP) {
Timestamp timestamp = new Timestamp(message.get(field));
statement.setTimestamp(position, timestamp);
} else {
statement.setLong(position, message.get(field));
}
break;
}
case DOUBLE:
{
statement.setDouble(position, message.get(field));
break;
}
case STRING:
{
statement.setString(position, message.get(field));
break;
}
case BINARY:
{
Binary binary = message.get(field);
switch(type) {
case Types.BINARY:
case Types.VARBINARY:
{
statement.setBytes(position, binary.get());
break;
}
case Types.BLOB:
{
statement.setBlob(position, binary.getInputStream());
break;
}
case Types.CHAR:
case Types.VARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
{
statement.setString(position, binary.toBase64());
break;
}
default:
throw new ResultSetException("Unknown binary field type: " + type + " for " + field, null, ctx);
}
break;
}
case ENUM:
{
PEnumValue value = message.get(field);
statement.setInt(position, value.asInteger());
break;
}
case MESSAGE:
{
PMessage value = message.get(field);
switch(type) {
case Types.BINARY:
case Types.VARBINARY:
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
BINARY.serialize(out, value);
statement.setBytes(position, out.toByteArray());
} catch (IOException e) {
throw new ResultSetException(e.getMessage(), e, ctx);
}
break;
}
case Types.BLOB:
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
BINARY.serialize(out, value);
statement.setBlob(position, new ByteArrayInputStream(out.toByteArray()));
} catch (IOException e) {
throw new ResultSetException(e.getMessage(), e, ctx);
}
break;
}
case Types.CHAR:
case Types.VARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
{
StringWriter writer = new StringWriter();
try {
JSON.serialize(new PrintWriter(writer), value);
statement.setString(position, writer.getBuffer().toString());
} catch (IOException e) {
throw new ResultSetException(e.getMessage(), e, ctx);
}
break;
}
case Types.CLOB:
{
StringWriter writer = new StringWriter();
try {
JSON.serialize(new PrintWriter(writer), value);
statement.setClob(position, new StringReader(writer.getBuffer().toString()));
} catch (IOException e) {
throw new ResultSetException(e.getMessage(), e, ctx);
}
break;
}
default:
throw new ResultSetException("Unknown message field type: " + type + " for " + field, null, ctx);
}
break;
}
default:
throw new ResultSetException("Unhandled field type in SQL: " + field, null, ctx);
}
} else {
statement.setNull(position, type);
}
}
Aggregations