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;
}