in dubbo-api-docs/dubbo-api-docs-core/src/main/java/org/apache/dubbo/apidocs/core/DubboApiDocsAnnotationScanner.java [410:514]
private ParamBean processHtmlType(Class<?> classType, RequestParam annotation, ParamBean param) {
if (param == null) {
param = new ParamBean();
}
if (annotation != null) {
param.setAllowableValues(annotation.allowableValues());
}
// Is there any allowed values
boolean hasAllowableValues = (param.getAllowableValues() != null && param.getAllowableValues().length > 0);
// Processed or not
boolean processed = false;
if (Integer.class.isAssignableFrom(classType) || int.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.NUMBER_INTEGER);
processed = true;
} else if (Byte.class.isAssignableFrom(classType) || byte.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.TEXT_BYTE);
processed = true;
} else if (Long.class.isAssignableFrom(classType) || long.class.isAssignableFrom(classType) ||
BigDecimal.class.isAssignableFrom(classType) || BigInteger.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.NUMBER_INTEGER);
processed = true;
} else if (Double.class.isAssignableFrom(classType) || double.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.NUMBER_DECIMAL);
processed = true;
} else if (Float.class.isAssignableFrom(classType) || float.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.NUMBER_DECIMAL);
processed = true;
} else if (String.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.TEXT);
processed = true;
} else if (Character.class.isAssignableFrom(classType) || char.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.TEXT_CHAR);
processed = true;
} else if (Short.class.isAssignableFrom(classType) || short.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.NUMBER_INTEGER);
processed = true;
} else if (Date.class.isAssignableFrom(classType) || LocalDateTime.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.DATETIME_SELECTOR);
processed = true;
} else if (LocalDate.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.DATE_SELECTOR);
processed = true;
} else if (classType.isArray() || Collection.class.isAssignableFrom(classType) ||
Map.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.TEXT_AREA);
processed = true;
}
if (processed) {
// Processed, time to return
if (hasAllowableValues) {
// Allowed values has value, change to select
param.setHtmlType(HtmlTypeEnum.SELECT);
}
return param;
}
// haven't dealt with it. Go on
if (Boolean.class.isAssignableFrom(classType) || boolean.class.isAssignableFrom(classType)) {
param.setHtmlType(HtmlTypeEnum.SELECT);
// Boolean can only be true / false. No matter what the previous allowed value is, it is forced to replace
param.setAllowableValues(new String[]{ALLOWABLE_BOOLEAN_TRUE, ALLOWABLE_BOOLEAN_FALSE});
processed = true;
} else if (Enum.class.isAssignableFrom(classType)) {
// process enum
param.setHtmlType(HtmlTypeEnum.SELECT);
Object[] enumConstants = classType.getEnumConstants();
String[] enumValues = new String[enumConstants.length];
try {
Method getNameMethod = classType.getMethod(METHOD_NAME_NAME);
for (int i = 0; i < enumConstants.length; i++) {
Object obj = enumConstants[i];
enumValues[i] = (String) getNameMethod.invoke(obj);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
LOG.error(e.getMessage(), e);
}
if (!hasAllowableValues) {
// If there is no optional value, it is taken from the enumeration.
param.setAllowableValues(enumValues);
} else {
// If there has allowable values, it is necessary to check whether the allowable values matches the enumeration.
boolean checkSuccess = true;
String[] allowableValues = param.getAllowableValues();
for (String allowableValue : allowableValues) {
for (String enumValue : enumValues) {
if (!StringUtils.equals(enumValue, allowableValue)) {
checkSuccess = false;
}
}
}
if (!checkSuccess) {
LOG.error("The allowed value in the @RequestParam annotation does not match the " +
"annotated enumeration " + classType.getCanonicalName() + ", please check!");
}
}
processed = true;
}
if (processed) {
return param;
}
return null;
}