in dubbo-api-docs/dubbo-api-docs-core/src/main/java/org/apache/dubbo/apidocs/core/DubboApiDocsAnnotationScanner.java [186:284]
private void processApiDocAnnotation(Method method, List<ApiCacheItem> moduleApiList, ApiModule moduleAnn,
boolean async, ModuleCacheItem moduleCacheItem, String apiVersion, String apiGroup) {
ApiDoc dubboApi = method.getAnnotation(ApiDoc.class);
// API basic information in API list in module
ApiCacheItem apiListItem = new ApiCacheItem();
moduleApiList.add(apiListItem);
// API method name
apiListItem.setApiName(method.getName());
// API name
apiListItem.setApiDocName(dubboApi.value());
// API description
apiListItem.setDescription(dubboApi.description());
// API version
apiListItem.setApiVersion(apiVersion);
// API group
apiListItem.setApiGroup(apiGroup);
// Description of API return data
apiListItem.setApiRespDec(dubboApi.responseClassDescription());
// API Method params class desc, skip method name
String desc = getMethodParamsDesc(method);
apiListItem.setParamsDesc(desc);
// API details in cache, contain interface parameters and response information
ApiCacheItem apiParamsAndResp = new ApiCacheItem();
String key = String.format("%s.%s%s", moduleAnn.apiInterface().getCanonicalName(), method.getName(), desc);
DubboApiDocsCache.addApiParamsAndResp(key, apiParamsAndResp);
Class<?>[] argsClass = method.getParameterTypes();
Annotation[][] argsAnns = method.getParameterAnnotations();
Parameter[] parameters = method.getParameters();
Type[] parametersTypes = method.getGenericParameterTypes();
List<ApiParamsCacheItem> paramList = new ArrayList<>(argsClass.length);
apiParamsAndResp.setAsync(async);
apiParamsAndResp.setApiName(method.getName());
apiParamsAndResp.setApiDocName(dubboApi.value());
apiParamsAndResp.setApiVersion(apiVersion);
apiParamsAndResp.setApiGroup(apiGroup);
apiParamsAndResp.setApiRespDec(dubboApi.responseClassDescription());
apiParamsAndResp.setDescription(dubboApi.description());
apiParamsAndResp.setApiModelClass(moduleCacheItem.getModuleClassName());
apiParamsAndResp.setParams(paramList);
apiParamsAndResp.setResponse(ClassTypeUtil.calss2Json(method.getGenericReturnType(), method.getReturnType()));
StringBuilder methodParamInfoSb = new StringBuilder();
for (int i = 0; i < argsClass.length; i++) {
Class<?> argClass = argsClass[i];
Type parameterType = parametersTypes[i];
methodParamInfoSb.append(METHOD_PARAM_INDEX_BOUNDARY_LEFT).append(i)
.append(METHOD_PARAM_INDEX_BOUNDARY_RIGHT).append(argClass.getCanonicalName());
if (i + 1 < argsClass.length) {
methodParamInfoSb.append(METHOD_PARAMETER_SEPARATOR);
}
Annotation[] argAnns = argsAnns[i];
ApiParamsCacheItem paramListItem = new ApiParamsCacheItem();
paramList.add(paramListItem);
paramListItem.setParamType(argClass.getCanonicalName());
paramListItem.setParamIndex(i);
RequestParam requestParam = null;
// Handling @RequestParam annotations on parameters
for (Annotation ann : argAnns) {
if (ann instanceof RequestParam) {
requestParam = (RequestParam) ann;
}
}
ParamBean paramBean = this.processHtmlType(argClass, requestParam, null);
Parameter methodParameter = parameters[i];
if (paramBean == null) {
// Not a basic type, handling properties in method parameters
List<ParamBean> apiParamsList = processField(argClass, parameterType, methodParameter);
if (apiParamsList != null && !apiParamsList.isEmpty()) {
paramListItem.setParamInfo(apiParamsList);
}
} else {
// Is the basic type
paramListItem.setName(methodParameter.getName());
paramListItem.setHtmlType(paramBean.getHtmlType().name());
paramListItem.setAllowableValues(paramBean.getAllowableValues());
if (requestParam != null) {
// Handling requestparam annotations on parameters
paramListItem.setDocName(requestParam.value());
paramListItem.setDescription(requestParam.description());
paramListItem.setExample(requestParam.example());
paramListItem.setDefaultValue(requestParam.defaultValue());
paramListItem.setRequired(requestParam.required());
} else {
paramListItem.setRequired(false);
}
if (HtmlTypeEnum.TEXT_AREA.name().equals(paramListItem.getHtmlType())) {
List<ParamBean> apiParamsList = processField(argClass, parameterType, methodParameter);
paramListItem.setAllowableValues(apiParamsList.get(0).getAllowableValues());
paramListItem.setSubParamsJson(apiParamsList.get(0).getSubParamsJson());
}
}
}
apiParamsAndResp.setMethodParamInfo(methodParamInfoSb.toString());
}