public Function getFunction()

in src/main/java/org/apache/commons/jxpath/PackageFunctions.java [100:165]


    public Function getFunction(final String namespace, final String name, Object[] parameters) {
        if (!Objects.equals(this.namespace, namespace)) {
            return null;
        }
        if (parameters == null) {
            parameters = EMPTY_ARRAY;
        }
        if (parameters.length >= 1) {
            Object target = TypeUtils.convert(parameters[0], Object.class);
            if (target != null) {
                Method method = MethodLookupUtils.lookupMethod(target.getClass(), name, parameters);
                if (method != null) {
                    return new MethodFunction(method);
                }
                if (target instanceof NodeSet) {
                    target = ((NodeSet) target).getPointers();
                }
                method = MethodLookupUtils.lookupMethod(target.getClass(), name, parameters);
                if (method != null) {
                    return new MethodFunction(method);
                }
                if (target instanceof Collection) {
                    final Iterator iter = ((Collection) target).iterator();
                    if (iter.hasNext()) {
                        target = iter.next();
                        if (target instanceof Pointer) {
                            target = ((Pointer) target).getValue();
                        }
                    } else {
                        target = null;
                    }
                }
            }
            if (target != null) {
                final Method method = MethodLookupUtils.lookupMethod(target.getClass(), name, parameters);
                if (method != null) {
                    return new MethodFunction(method);
                }
            }
        }
        final String fullName = classPrefix + name;
        final int inx = fullName.lastIndexOf('.');
        if (inx == -1) {
            return null;
        }
        final String className = fullName.substring(0, inx);
        final String methodName = fullName.substring(inx + 1);
        Class<?> functionClass;
        try {
            functionClass = ClassLoaderUtil.getClass(className, true);
        } catch (final ClassNotFoundException ex) {
            throw new JXPathException("Cannot invoke extension function " + (namespace != null ? namespace + ":" + name : name), ex);
        }
        if (methodName.equals("new")) {
            final Constructor constructor = MethodLookupUtils.lookupConstructor(functionClass, parameters);
            if (constructor != null) {
                return new ConstructorFunction(constructor);
            }
        } else {
            final Method method = MethodLookupUtils.lookupStaticMethod(functionClass, methodName, parameters);
            if (method != null) {
                return new MethodFunction(method);
            }
        }
        return null;
    }