in dbus-java-utils/src/main/java/org/freedesktop/dbus/utils/generator/InterfaceCodeGenerator.java [259:320]
private List<ClassBuilderInfo> extractMethods(Element _methodElement, ClassBuilderInfo _clzBldr) throws IOException, DBusException {
List<ClassBuilderInfo> additionalClasses = new ArrayList<>();
if (_methodElement.hasChildNodes()) {
List<Element> methodArgs = convertToElementList(XmlUtil.applyXpathExpressionToDocument("./arg", _methodElement));
Map<String, String> inputArgs = new LinkedHashMap<>();
Map<String, String> outputArgs = new LinkedHashMap<>();
int unknownArgNameCnt = 0;
for (Element argElm : methodArgs) {
String argType;
String argName = argElm.getAttribute("name");
if (argElm.getAttribute("type").contains("(")) { // this argument requires some sort of struct
String structPart = argElm.getAttribute("type").replaceAll("(\\(.+\\))", "$1");
String parentType = buildStructClass(structPart, _methodElement.getAttribute("name") + "Struct", _clzBldr, additionalClasses);
if (parentType != null) {
argType = parentType;
} else {
argType = null;
}
} else {
argType = TypeConverter.getJavaTypeFromDBusType(argElm.getAttribute("type"), _clzBldr.getImports());
}
if (StringUtil.isBlank(argName)) {
argName = "arg" + unknownArgNameCnt;
unknownArgNameCnt++;
} else {
argName = StringUtil.snakeToCamelCase(argName);
}
if ("in".equals(argElm.getAttribute("direction"))) {
inputArgs.put(argName, TypeConverter.getProperJavaClass(argType, _clzBldr.getImports()));
} else if ("out".equals(argElm.getAttribute("direction"))) {
outputArgs.put(argName, TypeConverter.getProperJavaClass(argType, _clzBldr.getImports()));
}
}
String resultType;
if (outputArgs.size() > 1) { // multi-value return
logger.debug("Found method with multiple return values: {}", _methodElement.getAttribute("name"));
resultType = createTuple(outputArgs, _methodElement.getAttribute("name") + "Tuple", _clzBldr, additionalClasses);
}
logger.debug("Found method with arguments: {}({})", _methodElement.getAttribute("name"), inputArgs);
resultType = outputArgs.isEmpty() ? "void" : outputArgs.get(new ArrayList<>(outputArgs.keySet()).get(0));
ClassMethod classMethod = new ClassMethod(_methodElement.getAttribute("name"), resultType, false);
classMethod.getArguments().putAll(inputArgs);
_clzBldr.getMethods().add(classMethod);
} else { // method has no arguments
ClassMethod classMethod = new ClassMethod(_methodElement.getAttribute("name"), "void", false);
_clzBldr.getMethods().add(classMethod);
}
return additionalClasses;
}