package streamflow.engine.framework; import java.net.URL; import java.net.URLClassLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FrameworkFirstClassLoader extends ClassLoader { private Logger LOG = LoggerFactory.getLogger(FrameworkFirstClassLoader.class); private FrameworkClassLoader frameworkClassLoader; public FrameworkFirstClassLoader(URL[] frameworkUrls) { this(frameworkUrls, Thread.currentThread().getContextClassLoader()); } public FrameworkFirstClassLoader(URL[] frameworkUrls, ClassLoader parent) { super(parent); frameworkClassLoader = new FrameworkClassLoader(frameworkUrls, this.getParent()); } public void includeURL(URL frameworkUrl) { frameworkClassLoader.includeURL(frameworkUrl); } @Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { try { return frameworkClassLoader.findClass(name); } catch (ClassNotFoundException ex) { return super.loadClass(name, resolve); } } @Override public URL getResource(String name) { URL resource = frameworkClassLoader.getResource(name); if (resource == null) { resource = super.getResource(name); } return resource; } private class FrameworkClassLoader extends URLClassLoader { private final ClassLoader parentClassLoader; public FrameworkClassLoader(URL[] frameworkUrls, ClassLoader parentClassLoader) { super(frameworkUrls, null); this.parentClassLoader = parentClassLoader; } public void includeURL(URL frameworkUrl) { this.addURL(frameworkUrl); } @Override public Class<?> findClass(String name) throws ClassNotFoundException { try { // Attempt to reuse any classes which have already been loaded Class<?> loadedClass = super.findLoadedClass(name); if (loadedClass != null) { return loadedClass; } return super.findClass(name); } catch (ClassNotFoundException e) { return parentClassLoader.loadClass(name); } } } }