/** * Returns a new Java function instance. * * @param name function name * @param args arguments * @param qc query context * @param sc static context * @param ii input info * @return Java function or {@code null} * @throws QueryException query exception */ static JavaMapping get( final QNm name, final Expr[] args, final QueryContext qc, final StaticContext sc, final InputInfo ii) throws QueryException { final byte[] uri = name.uri(); // check if URI starts with "java:" prefix (if yes, module must be Java code) final boolean java = startsWith(uri, JAVAPREF); // rewrite function name: convert dashes to upper-case initials final String local = camelCase(string(name.local())); // check imported Java modules final String path = camelCase(toPath(java ? substring(uri, JAVAPREF.length) : uri)); final ModuleLoader modules = qc.resources.modules(); final Object jm = modules.findImport(path); if (jm != null) { final Method meth = getModMethod(jm, path, local, args.length, qc, ii); if (meth != null) return new JavaModuleFunc(sc, ii, jm, meth, args); } // only allowed with administrator permissions if (!qc.context.user.has(Perm.ADMIN)) return null; // check addressed class try { return new JavaFunc(sc, ii, modules.findClass(path), local, args); } catch (final ClassNotFoundException ex) { // only throw exception if "java:" prefix was explicitly specified if (java) throw FUNCJAVA_X.get(ii, path); } catch (final Throwable th) { throw JAVAINIT_X.get(ii, th); } // no function found return null; }
/** * Converts a module URI to a Java path. * * @param uri module URI * @return module path */ private static String toPath(final byte[] uri) { final String path = string(uri), p = ModuleLoader.uri2path(path); return p == null ? path : ModuleLoader.capitalize(p).replace("/", ".").substring(1); }