in core/src/main/java/com/twitter/elephantbird/thrift/TStructDescriptor.java [166:220]
private Field(TFieldIdEnum fieldIdEnum, FieldMetaData fieldMetaData, String fieldName,
Type genericType) {
this.fieldIdEnum = fieldIdEnum;
this.fieldMetaData = fieldMetaData;
this.fieldId = fieldIdEnum == null ? 1 : fieldIdEnum.getThriftFieldId();
this.fieldName = fieldName;
this.ttype = getTTypeFromJavaType(genericType);
Type firstTypeArg = null;
Type secondTypeArg = null;
if (genericType instanceof ParameterizedType) {
Type[] typeArgs = ((ParameterizedType) genericType).getActualTypeArguments();
firstTypeArg = typeArgs.length > 0 ? typeArgs[0] : null;
secondTypeArg = typeArgs.length > 1 ? typeArgs[1] : null;
}
switch (ttype) {
case TType.LIST:
listElemField = new Field(null, null, fieldName + "_list_elem", firstTypeArg);
break;
case TType.MAP:
mapKeyField = new Field(null, null, fieldName + "_map_key", firstTypeArg);
mapValueField = new Field(null, null, fieldName + "_map_value", secondTypeArg);
break;
case TType.SET:
setElemField = new Field(null, null, fieldName + "_set_elem", firstTypeArg);
break;
case TType.ENUM:
enumClass = (Class<? extends TEnum>)genericType;
enumMap = extractEnumMap(enumClass);
ImmutableMap.Builder<Integer, TEnum> builder = ImmutableMap.builder();
for(TEnum e : enumMap.values()) {
builder.put(e.getValue(), e);
}
enumIdMap = builder.build();
break;
case TType.STRUCT:
tStructDescriptor = getInstance((Class<? extends TBase<?, ?>>) genericType);
break;
case TType.STRING:
isBuffer = !genericType.equals(String.class);
break;
default:
// this is ok. TType.INT, TType.BYTE, etc.
}
}