From 1232b9a9d8d34ffe90fd4ecdb049ea052e325cb5 Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Thu, 3 Jun 2021 21:19:50 +0200 Subject: [PATCH 1/2] Ignore Eclipse project files --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 70ef0046..725252d2 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,9 @@ target/ # IntelliJ Idea project files .idea -*.iml \ No newline at end of file +*.iml + +# Eclipse +.project +.classpath +.settings/ From 9005db30a00cc96fa458f22f84ca04c77de293dc Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Thu, 3 Jun 2021 21:21:27 +0200 Subject: [PATCH 2/2] Fix issue #197 Add overloads with explicit class loader to FunctionUtils --- .../spt/data/jslt/FunctionUtils.java | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/schibsted/spt/data/jslt/FunctionUtils.java b/core/src/main/java/com/schibsted/spt/data/jslt/FunctionUtils.java index 9ebf01c7..7397a2f2 100644 --- a/core/src/main/java/com/schibsted/spt/data/jslt/FunctionUtils.java +++ b/core/src/main/java/com/schibsted/spt/data/jslt/FunctionUtils.java @@ -31,7 +31,20 @@ static public Function wrapStaticMethod(String functionName, String className, String methodName) throws LinkageError, ExceptionInInitializerError, ClassNotFoundException { - Class klass = Class.forName(className); + return wrapStaticMethod(functionName, className, methodName, FunctionUtils.class.getClassLoader(), Thread.currentThread().getContextClassLoader()); + } + + /** + * Create a JSLT function from a static Java method. This will fail + * if the method is overloaded. The given class loaders will be tried + * in order to load the named class. + */ + static public Function wrapStaticMethod(String functionName, + String className, + String methodName, + ClassLoader... classLoaders) + throws LinkageError, ExceptionInInitializerError, ClassNotFoundException { + Class klass = loadClass(className, classLoaders); Method[] methods = klass.getMethods(); Method method = null; for (int ix = 0; ix < methods.length; ix++) { @@ -58,8 +71,44 @@ static public Function wrapStaticMethod(String functionName, Class[] paramTypes) throws LinkageError, ExceptionInInitializerError, ClassNotFoundException, NoSuchMethodException { - Class klass = Class.forName(className); + return wrapStaticMethod(functionName, className, methodName, paramTypes, FunctionUtils.class.getClassLoader(), Thread.currentThread().getContextClassLoader()); + } + /** + * Create a JSLT function from a static Java method. The given class + * loaders will be tried in order to load the named class. + * @param paramTypes Array of types used to match overloaded methods. + */ + static public Function wrapStaticMethod(String functionName, + String className, + String methodName, + Class[] paramTypes, + ClassLoader... classLoaders) + throws LinkageError, ExceptionInInitializerError, ClassNotFoundException, + NoSuchMethodException { + Class klass = loadClass(className, classLoaders); Method method = klass.getMethod(methodName, paramTypes); return new FunctionWrapper(functionName, method); } + + private static Class loadClass(String className, ClassLoader... classLoaders) throws LinkageError, ClassNotFoundException { + Class klass = null; + Throwable lastException = null; + for (ClassLoader classLoader : classLoaders) { + if (classLoader != null) { + try { + klass = Class.forName(className, true, classLoader); + lastException = null; + break; + } catch (LinkageError | ClassNotFoundException e) { + lastException = e; + } + } + } + if (lastException instanceof LinkageError) { + throw (LinkageError) lastException; + } else if (lastException instanceof ClassNotFoundException) { + throw (ClassNotFoundException) lastException; + } + return klass; + } }