in core/src/main/java/com/twitter/elephantbird/util/ThriftToDynamicProto.java [178:221]
private int doSchemaMapping(DescriptorProtos.DescriptorProto.Builder desBuilder,
TStructDescriptor fieldDesc) throws DescriptorValidationException {
int maxThriftId = 0;
for (Field tField : fieldDesc.getFields()) {
maxThriftId = Math.max(tField.getFieldId(), maxThriftId);
if (supportNestedObjects && tField.isMap()) {
String typeName = mapProtoMessageType(fieldDesc, tField);
if (descriptorBuilderMap.get(typeName) == null) {
DescriptorProtos.DescriptorProto.Builder mapBuilder =
mapDescriptorProtoBuilder(tField, typeName);
descriptorBuilderMap.put(typeName, mapBuilder);
addProtoField(desBuilder, tField.getName(), tField.getFieldId() + 1, typeName, true);
}
} else {
Field field = resolveField(tField);
Type protoType = thriftTypeToProtoType(field);
boolean isContainer = isContainer(tField);
if (supportNestedObjects && protoType == Type.TYPE_MESSAGE) {
String typeName = resolveMessageTypeName(field.gettStructDescriptor());
// Protobuf field ids start at 1. Thrift starts at 0.
addProtoField(desBuilder,
tField.getName(),
tField.getFieldId() + 1,
typeName,
isContainer);
} else if (protoType != null) {
if (supportNestedObjects
|| (!supportNestedObjects && !hasNestedObject(tField))) {
addProtoField(desBuilder,
tField.getName(),
tField.getFieldId() + 1,
protoType,
isContainer);
}
}
}
}
return maxThriftId;
}