use of net.morimekta.providence.descriptor.PMessageDescriptor in project providence by morimekta.
the class MessageRowMapper method map.
@Override
public M map(ResultSet rs, StatementContext ctx) throws SQLException {
PMessageBuilder<M, F> builder = descriptor.builder();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); ++i) {
if (!tableName.isEmpty() && !tableName.equalsIgnoreCase(rs.getMetaData().getTableName(i))) {
continue;
}
String name = rs.getMetaData().getColumnLabel(i).toUpperCase(Locale.US);
F field = fieldNameMapping.get(name);
if (field != null) {
int columnType = rs.getMetaData().getColumnType(i);
switch(field.getType()) {
case BOOL:
{
if (columnType == Types.BOOLEAN || columnType == Types.BIT) {
boolean b = rs.getBoolean(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
} else {
int b = rs.getInt(i);
if (!rs.wasNull()) {
builder.set(field, b != 0);
}
}
break;
}
case BYTE:
{
byte b = rs.getByte(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
break;
}
case I16:
{
short b = rs.getShort(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
break;
}
case I32:
{
if (columnType == Types.TIMESTAMP) {
Timestamp ts = rs.getTimestamp(i);
if (ts != null) {
builder.set(field, (int) (ts.getTime() / 1000L));
}
} else {
int b = rs.getInt(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
}
break;
}
case I64:
{
if (columnType == Types.TIMESTAMP) {
Timestamp ts = rs.getTimestamp(i);
if (ts != null) {
builder.set(field, ts.getTime());
}
} else {
long b = rs.getLong(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
}
break;
}
case DOUBLE:
{
double b = rs.getDouble(i);
if (!rs.wasNull()) {
builder.set(field, b);
}
break;
}
case STRING:
{
builder.set(field, rs.getString(i));
break;
}
case BINARY:
{
switch(columnType) {
case Types.BINARY:
case Types.VARBINARY:
byte[] ts = rs.getBytes(i);
if (ts != null) {
builder.set(field, Binary.copy(ts));
}
break;
case Types.BLOB:
Blob blob = rs.getBlob(i);
if (blob != null) {
try {
builder.set(field, Binary.read(blob.getBinaryStream(), (int) blob.length()));
} catch (IOException e) {
throw new UncheckedIOException(e.getMessage(), e);
}
}
break;
case Types.CHAR:
case Types.VARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
{
String tmp = rs.getString(i);
if (tmp != null) {
builder.set(field, Binary.fromBase64(tmp));
}
break;
}
case Types.NULL:
break;
default:
throw new ResultSetException("Unknown column type " + rs.getMetaData().getColumnTypeName(i) + " for " + descriptor.getType().toString() + " field " + name + " in " + descriptor.getQualifiedName(), null, ctx);
}
break;
}
case ENUM:
{
int val = rs.getInt(i);
if (!rs.wasNull()) {
PEnumDescriptor ed = (PEnumDescriptor) field.getDescriptor();
builder.set(field, ed.findById(val));
}
break;
}
case MESSAGE:
{
try {
PMessageDescriptor<?, ?> md = (PMessageDescriptor) field.getDescriptor();
switch(columnType) {
case Types.BINARY:
case Types.VARBINARY:
byte[] data = rs.getBytes(i);
if (data != null) {
ByteArrayInputStream in = new ByteArrayInputStream(data);
builder.set(field, BINARY.deserialize(in, md));
}
break;
case Types.BLOB:
{
Blob blob = rs.getBlob(i);
if (blob != null) {
builder.set(field, BINARY.deserialize(blob.getBinaryStream(), md));
}
break;
}
case Types.CHAR:
case Types.VARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
{
String tmp = rs.getString(i);
if (tmp != null) {
StringReader reader = new StringReader(tmp);
builder.set(field, JSON.deserialize(reader, md));
}
break;
}
case Types.CLOB:
{
Clob clob = rs.getClob(i);
if (clob != null) {
builder.set(field, JSON.deserialize(clob.getCharacterStream(), md));
}
break;
}
case Types.NULL:
break;
default:
throw new ResultSetException("Unknown column type " + rs.getMetaData().getColumnTypeName(i) + " for " + descriptor.getType().toString() + " field " + name + " in " + descriptor.getQualifiedName(), null, ctx);
}
} catch (IOException e) {
throw new UncheckedIOException(e.getMessage(), e);
}
break;
}
case LIST:
case SET:
case MAP:
{
// ... woot?
}
case VOID:
default:
{
throw new ResultSetException("Unhandled column of type " + rs.getMetaData().getColumnTypeName(i) + " for " + descriptor.getType().toString() + " field " + name + " in " + descriptor.getQualifiedName(), null, ctx);
}
}
}
}
return builder.build();
}
use of net.morimekta.providence.descriptor.PMessageDescriptor in project providence by morimekta.
the class MessageNamedArgumentFinder method find.
@Override
@SuppressWarnings("unchecked")
public Argument find(String name) {
if (!prefix.isEmpty()) {
if (name.startsWith(prefix)) {
name = name.substring(prefix.length());
} else {
return null;
}
}
String[] parts = name.split("[.]");
PMessage leaf = message;
PMessageDescriptor leafDescriptor = message.descriptor();
for (int i = 0; i < parts.length - 1; ++i) {
String part = parts[i];
PField field = leafDescriptor.findFieldByName(part);
if (field == null)
return null;
if (field.getType() != PType.MESSAGE) {
throw new IllegalArgumentException("");
}
leafDescriptor = (PMessageDescriptor) field.getDescriptor();
if (leaf != null) {
leaf = (PMessage) leaf.get(field.getId());
}
}
String leafName = parts[parts.length - 1];
PField field = leafDescriptor.findFieldByName(leafName);
if (field != null) {
if (leaf != null) {
return new MessageFieldArgument(leaf, field, getColumnType(field));
}
return new NullArgument(getColumnType(field));
}
return null;
}
use of net.morimekta.providence.descriptor.PMessageDescriptor in project providence by morimekta.
the class BinaryFormatUtils method readFieldValue.
/**
* Read a field value from stream.
*
* @param in The stream to consume.
* @param fieldInfo The field info about the content.
* @param fieldType The type to generate content for.
* @param strict If the field should be read strictly.
* @return The field value, or null if no type.
* @throws IOException If unable to read from stream or invalid field type.
*/
public static Object readFieldValue(BigEndianBinaryReader in, FieldInfo fieldInfo, PDescriptor fieldType, boolean strict) throws IOException {
if (fieldType != null && forType(fieldType.getType()) != fieldInfo.type) {
throw new SerializerException("Wrong field type for id=%d: expected %s, got %s", fieldInfo.id, asString(forType(fieldType.getType())), asString(fieldInfo.getType()));
}
switch(fieldInfo.type) {
case BinaryType.VOID:
return Boolean.TRUE;
case BinaryType.BOOL:
return in.expectByte() != 0;
case BinaryType.BYTE:
return in.expectByte();
case BinaryType.I16:
return in.expectShort();
case BinaryType.I32:
int val = in.expectInt();
if (fieldType != null && fieldType instanceof PEnumDescriptor) {
@SuppressWarnings("unchecked") PEnumBuilder builder = ((PEnumDescriptor<?>) fieldType).builder();
builder.setById(val);
return builder.build();
} else {
return val;
}
case BinaryType.I64:
return in.expectLong();
case BinaryType.DOUBLE:
return in.expectDouble();
case BinaryType.STRING:
int len = in.expectUInt32();
byte[] data = in.expectBytes(len);
if (fieldType != null && fieldType.getType() == PType.STRING) {
return new String(data, StandardCharsets.UTF_8);
} else {
return Binary.wrap(data);
}
case BinaryType.STRUCT:
{
if (fieldType == null) {
consumeMessage(in);
return null;
}
return readMessage(in, (PMessageDescriptor<?, ?>) fieldType, strict);
}
case BinaryType.MAP:
{
final byte keyT = in.expectByte();
final byte itemT = in.expectByte();
final int size = in.expectUInt32();
PDescriptor keyType = null;
PDescriptor valueType = null;
PMap.Builder<Object, Object> out;
if (fieldType != null) {
@SuppressWarnings("unchecked") PMap<Object, Object> mapType = (PMap<Object, Object>) fieldType;
keyType = mapType.keyDescriptor();
valueType = mapType.itemDescriptor();
out = mapType.builder();
} else {
out = new PMap.DefaultBuilder<>();
}
FieldInfo keyInfo = new FieldInfo(1, keyT);
FieldInfo itemInfo = new FieldInfo(2, itemT);
for (int i = 0; i < size; ++i) {
Object key = readFieldValue(in, keyInfo, keyType, strict);
Object value = readFieldValue(in, itemInfo, valueType, strict);
if (key != null && value != null) {
out.put(key, value);
} else if (strict) {
if (key == null) {
throw new SerializerException("Null key in map");
} else {
throw new SerializerException("Null value in map");
}
}
}
return out.build();
}
case BinaryType.SET:
{
final byte itemT = in.expectByte();
final int size = in.expectUInt32();
PDescriptor entryType = null;
PSet.Builder<Object> out;
if (fieldType != null) {
@SuppressWarnings("unchecked") PSet<Object> setType = (PSet<Object>) fieldType;
entryType = setType.itemDescriptor();
out = setType.builder();
} else {
out = new PSet.DefaultBuilder<>();
}
FieldInfo itemInfo = new FieldInfo(0, itemT);
for (int i = 0; i < size; ++i) {
Object value = readFieldValue(in, itemInfo, entryType, strict);
if (value != null) {
out.add(value);
} else if (strict) {
throw new SerializerException("Null value in set");
}
}
return out.build();
}
case BinaryType.LIST:
{
final byte itemT = in.expectByte();
final int size = in.expectUInt32();
PDescriptor entryType = null;
PList.Builder<Object> out;
if (fieldType != null) {
@SuppressWarnings("unchecked") PList<Object> listType = (PList<Object>) fieldType;
entryType = listType.itemDescriptor();
out = listType.builder();
} else {
out = new PList.DefaultBuilder<>();
}
FieldInfo itemInfo = new FieldInfo(0, itemT);
for (int i = 0; i < size; ++i) {
Object value = readFieldValue(in, itemInfo, entryType, strict);
if (value != null) {
out.add(value);
} else if (strict) {
throw new SerializerException("Null value in list");
}
}
return out.build();
}
default:
throw new SerializerException("unknown data type: " + fieldInfo.getType());
}
}
use of net.morimekta.providence.descriptor.PMessageDescriptor in project providence by morimekta.
the class MessageNamedArgumentFinder method find.
@Nonnull
@Override
@SuppressWarnings("unchecked")
public Optional<Argument> find(String name, StatementContext ctx) {
if (!prefix.isEmpty()) {
if (name.startsWith(prefix)) {
name = name.substring(prefix.length());
} else {
return Optional.empty();
}
}
String[] parts = name.split("[.]");
PMessage leaf = message;
PMessageDescriptor leafDescriptor = message.descriptor();
for (int i = 0; i < parts.length - 1; ++i) {
String part = parts[i];
PField field = leafDescriptor.findFieldByName(part);
if (field == null)
return Optional.empty();
if (field.getType() != PType.MESSAGE) {
throw new IllegalArgumentException("");
}
leafDescriptor = (PMessageDescriptor) field.getDescriptor();
if (leaf != null) {
leaf = (PMessage) leaf.get(field.getId());
}
}
String leafName = parts[parts.length - 1];
PField field = leafDescriptor.findFieldByName(leafName);
if (field != null) {
if (leaf != null) {
return Optional.of(new MessageFieldArgument(leaf, field, getColumnType(field)));
}
return Optional.of(new NullArgument(getColumnType(field)));
}
return Optional.empty();
}
use of net.morimekta.providence.descriptor.PMessageDescriptor in project providence by morimekta.
the class JavaGenerator method generate.
@Override
@SuppressWarnings("resource")
public void generate(@Nonnull ProgramTypeRegistry registry) throws IOException, GeneratorException {
CProgram program = registry.getProgram();
String javaPackage = JUtils.getJavaPackage(program);
JHelper helper = new JHelper(registry);
String path = JUtils.getPackageClassPath(javaPackage);
if (program.getConstants().size() > 0) {
String file = helper.getConstantsClassName(program) + ".java";
OutputStream out = new BufferedOutputStream(getFileManager().create(path, file));
try {
IndentedPrintWriter writer = new IndentedPrintWriter(out);
appendFileHeader(writer, helper, program);
constFomatter(writer, helper).appendProgramClass(program);
writer.flush();
} finally {
try {
getFileManager().finalize(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (javaOptions.hazelcast_portable && program.getConstants().stream().anyMatch(t -> t.getName().equals("FACTORY_ID"))) {
String file = helper.getHazelcastFactoryClassName(program) + ".java";
OutputStream out = new BufferedOutputStream(getFileManager().create(path, file));
try {
IndentedPrintWriter writer = new IndentedPrintWriter(out);
appendFileHeader(writer, helper, program);
hazelcastFomatter(writer, helper).appendProgramClass(program);
writer.flush();
} finally {
try {
getFileManager().finalize(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
for (PDeclaredDescriptor<?> type : program.getDeclaredTypes()) {
String file = JUtils.getClassName(type) + ".java";
OutputStream out = new BufferedOutputStream(getFileManager().create(path, file));
try {
IndentedPrintWriter writer = new IndentedPrintWriter(out);
appendFileHeader(writer, helper, program);
switch(type.getType()) {
case MESSAGE:
messageFormatter(writer, helper).appendMessageClass((PMessageDescriptor<?, ?>) type);
break;
case ENUM:
enumFormatter(writer).appendEnumClass((CEnumDescriptor) type);
break;
default:
throw new GeneratorException("Unhandled declaration type.");
}
writer.flush();
} finally {
try {
getFileManager().finalize(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
for (CService service : program.getServices()) {
String file = JUtils.getClassName(service) + ".java";
OutputStream out = new BufferedOutputStream(getFileManager().create(path, file));
try {
IndentedPrintWriter writer = new IndentedPrintWriter(out);
appendFileHeader(writer, helper, program);
serviceFormatter(writer, helper).appendServiceClass(service);
writer.flush();
} finally {
try {
getFileManager().finalize(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Aggregations