public List getIllegalLoggerMethodInvocations()

in dubbo-error-code-inspector/src/main/java/org/apache/dubbo/errorcode/extractor/JavassistConstantPoolErrorCodeExtractor.java [49:101]


    public List<MethodDefinition> getIllegalLoggerMethodInvocations(String classFilePath) {

        ClassFile classFile = JavassistUtils.openClassFile(classFilePath);
        List<Object> constPoolItems = JavassistUtils.getConstPoolItems(classFile.getConstPool());

        List<Integer> interfaceMethodRefIndices = constPoolItems.stream().filter(x -> {
            try {
                if (x == null) return false;
                return x.getClass() == Class.forName("javassist.bytecode.InterfaceMethodrefInfo");
            } catch (ClassNotFoundException e) {
                return false;
            }
        }).map(this::getIndexFieldInConstPoolItems).collect(Collectors.toList());

        List<MethodDefinition> methodDefinitions = new ArrayList<>();

        for (int index : interfaceMethodRefIndices) {
            ConstPool cp = classFile.getConstPool();

            MethodDefinition methodDefinition = new MethodDefinition();
            methodDefinition.setClassName(
                cp.getInterfaceMethodrefClassName(index)
            );

            methodDefinition.setMethodName(
                cp.getUtf8Info(
                    cp.getNameAndTypeName(
                        cp.getInterfaceMethodrefNameAndType(index)
                    )
                )
            );

            methodDefinition.setArguments(
                cp.getUtf8Info(
                    cp.getNameAndTypeDescriptor(
                        cp.getInterfaceMethodrefNameAndType(index)
                    )
                )
            );

            methodDefinitions.add(methodDefinition);
        }

        Predicate<MethodDefinition> legacyLoggerClass = x -> x.getClassName().equals("org.apache.dubbo.common.logger.Logger");
        Predicate<MethodDefinition> errorTypeAwareLoggerClass = x -> x.getClassName().equals("org.apache.dubbo.common.logger.ErrorTypeAwareLogger");
        Predicate<MethodDefinition> loggerClass = legacyLoggerClass.or(errorTypeAwareLoggerClass);

        return methodDefinitions.stream()
            .filter(loggerClass)
            .filter(x -> x.getMethodName().equals("warn") || x.getMethodName().equals("error"))
            .filter(x -> x.getArguments().split(";").length < 4)
            .collect(Collectors.toList());
    }