private List extractMethods()

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;

    }