Preconditions.checkNotNull(method, "method is null");
Preconditions.checkNotNull(catalog, "catalog is null");
this.method = method;
ThriftMethod thriftMethod = method.getAnnotation(ThriftMethod.class);
Preconditions.checkArgument(thriftMethod != null, "Method is not annotated with @ThriftMethod");
Preconditions.checkArgument(!Modifier.isStatic(method.getModifiers()), "Method %s is static", method.toGenericString());
if (thriftMethod.value().length() == 0) {
name = method.getName();
}
else {
name = thriftMethod.value();
}
this.qualifiedName = serviceName + "." + name;
documentation = ThriftCatalog.getThriftDocumentation(method);
returnType = catalog.getThriftType(method.getGenericReturnType());
ImmutableList.Builder<ThriftFieldMetadata> builder = ImmutableList.builder();
Type[] parameterTypes = method.getGenericParameterTypes();
String[] parameterNames = extractParameterNames(method);
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
for (int index = 0; index < parameterTypes.length; index++) {
ThriftField thriftField = null;
for (Annotation annotation : parameterAnnotations[index]) {
if (annotation instanceof ThriftField) {
thriftField = (ThriftField) annotation;
break;
}
}
short parameterId = Short.MIN_VALUE;
String parameterName = null;
Requiredness parameterRequiredness = Requiredness.UNSPECIFIED;
if (thriftField != null) {
parameterId = thriftField.value();
parameterRequiredness = thriftField.requiredness();
if (!thriftField.name().isEmpty()) {
parameterName = thriftField.name();
}
}
if (parameterId == Short.MIN_VALUE) {
parameterId = (short) (index + 1);
}
if (parameterName == null) {
parameterName = parameterNames[index];
}
Type parameterType = parameterTypes[index];
ThriftType thriftType = catalog.getThriftType(parameterType);
ThriftInjection parameterInjection = new ThriftParameterInjection(parameterId, parameterName, index, parameterType);
if (parameterRequiredness == Requiredness.UNSPECIFIED) {
// There is only one field injection used to build metadata for method parameters, and if a
// single injection point has UNSPECIFIED requiredness, that resolves to NONE.
parameterRequiredness = Requiredness.NONE;
}
ThriftFieldMetadata fieldMetadata = new ThriftFieldMetadata(
parameterId,
parameterRequiredness,
thriftType,
parameterName,
THRIFT_FIELD,
ImmutableList.of(parameterInjection),
Optional.<ThriftConstructorInjection>absent(),
Optional.<ThriftMethodInjection>absent(),
Optional.<ThriftExtraction>absent(),
Optional.<TypeCoercion>absent()
);
builder.add(fieldMetadata);
}
parameters = builder.build();
exceptions = buildExceptionMap(catalog, thriftMethod);
this.oneway = thriftMethod.oneway();
}