in dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java [182:271]
private static void appendParameters0(
Map<String, String> parameters, Object config, String prefix, boolean asParameters) {
if (config == null) {
return;
}
// If asParameters=false, it means append attributes, ignore @Parameter annotation's attributes except 'append'
// and 'attribute'
// How to select the appropriate one from multiple getter methods of the property?
// e.g. Using String getGeneric() or Boolean isGeneric()? Judge by field type ?
// Currently, use @Parameter.attribute() to determine whether it is an attribute.
BeanInfo beanInfo = getBeanInfo(config.getClass());
for (MethodDescriptor methodDescriptor : beanInfo.getMethodDescriptors()) {
Method method = methodDescriptor.getMethod();
try {
String name = method.getName();
if (MethodUtils.isGetter(method)) {
if (method.getReturnType() == Object.class) {
continue;
}
String key;
Parameter parameter = method.getAnnotation(Parameter.class);
if (asParameters) {
if (parameter != null && parameter.excluded()) {
continue;
}
// get parameter key
if (parameter != null && parameter.key().length() > 0) {
key = parameter.key();
} else {
key = calculatePropertyFromGetter(name);
}
} else { // as attributes
// filter non attribute
if (parameter != null && !parameter.attribute()) {
continue;
}
// get attribute name
String propertyName = calculateAttributeFromGetter(name);
// convert camelCase/snake_case to kebab-case
key = StringUtils.convertToSplitName(propertyName, "-");
}
Object value = method.invoke(config);
String str = String.valueOf(value).trim();
if (value != null && str.length() > 0) {
if (asParameters && parameter != null && parameter.escaped()) {
str = URL.encode(str);
}
if (parameter != null && parameter.append()) {
String pre = parameters.get(key);
if (pre != null && pre.length() > 0) {
str = pre + "," + str;
// Remove duplicate values
Set<String> set = StringUtils.splitToSet(str, ',');
str = StringUtils.join(set, ",");
}
}
if (prefix != null && prefix.length() > 0) {
key = prefix + "." + key;
}
parameters.put(key, str);
} else if (asParameters && parameter != null && parameter.required()) {
throw new IllegalStateException(config.getClass().getSimpleName() + "." + key + " == null");
}
} else if (isParametersGetter(method)) {
Map<String, String> map = (Map<String, String>) method.invoke(config);
map = convert(map, prefix);
if (asParameters) {
// put all parameters to url
parameters.putAll(map);
} else {
// encode parameters to string for config overriding, see AbstractConfig#refresh()
String key = calculatePropertyFromGetter(name);
String encodeParameters = StringUtils.encodeParameters(map);
if (encodeParameters != null) {
parameters.put(key, encodeParameters);
}
}
} else if (isNestedGetter(config, method)) {
Object inner = method.invoke(config);
String fieldName = MethodUtils.extractFieldName(method);
String nestedPrefix = prefix == null ? fieldName : prefix + "." + fieldName;
appendParameters0(parameters, inner, nestedPrefix, asParameters);
}
} catch (Exception e) {
throw new IllegalStateException("Append parameters failed: " + e.getMessage(), e);
}
}
}