package io.lumify.core.util; import io.lumify.core.exception.LumifyException; import java.io.PrintStream; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; public class ClassUtil { private static final String LINE_SEPARATOR = System.getProperty("line.separator"); @SuppressWarnings("unchecked") public static <T> Class<? extends T> forName(String className) { try { return (Class<? extends T>) Class.forName(className); } catch (ClassNotFoundException e) { throw new LumifyException("Could not load class " + className); } } public static Method findMethod(Class clazz, String methodName, Class[] parameters) { while (clazz != null) { try { return getDeclaredMethod(clazz, methodName, parameters); } catch (NoSuchMethodException e) { clazz = clazz.getSuperclass(); } } return null; } public static void logClasspath(ClassLoader classLoader) { logClasspath(classLoader, System.out); } public static void logClasspath(ClassLoader classLoader, PrintStream printStream) { outputClasspath(classLoader, printStream); } public static void logClasspath(ClassLoader classLoader, LumifyLogger lumifyLogger) { outputClasspath(classLoader, lumifyLogger); } private static void outputClasspath(ClassLoader classLoader, Object outputObject) { StringBuilder sb = new StringBuilder(); if (classLoader instanceof URLClassLoader) { sb.append(classLoader.getClass().getName()); for (URL url : ((URLClassLoader) classLoader).getURLs()) { sb.append(LINE_SEPARATOR).append(url.toString()); } } else { sb.append("unable to enumerate entries for ").append(classLoader.getClass().getName()); } if (outputObject instanceof PrintStream) { ((PrintStream) outputObject).println(sb.toString()); } else if (outputObject instanceof LumifyLogger) { ((LumifyLogger) outputObject).debug(sb.toString()); } else { throw new LumifyException("unexpected outputObject"); } ClassLoader parentClassLoader = classLoader.getParent(); if (parentClassLoader != null) { outputClasspath(parentClassLoader, outputObject); } } @SuppressWarnings("unchecked") private static Method getDeclaredMethod(Class clazz, String methodName, Class[] parameters) throws NoSuchMethodException { return clazz.getDeclaredMethod(methodName, parameters); } }