public Dynamic(Logger logger, ClassLoader baseClassLoader, ReadFileSystem<S> source) { super(logger); // this.classLoader = null; this.baseClassLoader = baseClassLoader; this.classPathLoader = new ParentJarClassLoader(baseClassLoader); this.scanner = FileSystemScanner.createHashing(source); this.snapshot = scanner.take(); this.classPath = null; this.failed = false; }
@Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> found = super.loadClass(name, resolve); if (found.getClassLoader() == super.getParent()) { URL url = super.getResource(name.replace('.', '/') + ".class"); if (shouldLoad(url)) { return found; } else { throw new ClassNotFoundException(); } } return found; }
public Dynamic(Logger logger, ClassLoader baseClassLoader, ReadFileSystem<S> source) { super(logger); // this.classLoader = null; this.baseClassLoader = baseClassLoader; this.classPathLoader = new ParentJarClassLoader(baseClassLoader); this.scanner = FileSystemScanner.createHashing(source); this.snapshot = scanner.take(); this.classPath = null; this.failed = false; }
@Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { Class<?> found = super.loadClass(name, resolve); if (found.getClassLoader() == super.getParent()) { URL url = super.getResource(name.replace('.', '/') + ".class"); if (shouldLoad(url)) { return found; } else { throw new ClassNotFoundException(); } } return found; }
@Test public void testLoadingFromAncestor() throws Exception { ClassLoader cl = new ParentJarClassLoader(new URLClassLoader(new URL[0], effectiveLoader)); // We can load from file assertSame(cl.loadClass(Dev.class.getName()), effectiveLoader.loadClass(Dev.class.getName())); URL classesResource = cl.getResource("classes_resource"); assertNotNull(classesResource); assertEquals(Collections.singletonList(classesResource), Tools.list(cl.getResources("classes_resource"))); // We can load from jar assertSame(effectiveLoader.loadClass(Lib.class.getName()), cl.loadClass(Lib.class.getName())); URL libResource = cl.getResource("lib_resource"); assertNotNull(libResource); assertEquals("lib_resource_value", Tools.read(libResource)); assertEquals(Collections.singletonList(libResource), Tools.list(cl.getResources("lib_resource"))); } }
@Override public URL getResource(String name) { URL url; try { url = (URL)findResource.invoke(parent, name); } catch (Exception e) { throw new UnsupportedOperationException("Not yet handled", e); } if (url != null) { if (shouldLoad(url)) { return url; } else { return null; } } else { return super.getResource(name); } }
@Test public void testLoadingFromAncestor() throws Exception { ClassLoader cl = new ParentJarClassLoader(new URLClassLoader(new URL[0], effectiveLoader)); // We can load from file assertSame(cl.loadClass(Dev.class.getName()), effectiveLoader.loadClass(Dev.class.getName())); URL classesResource = cl.getResource("classes_resource"); assertNotNull(classesResource); assertEquals(Collections.singletonList(classesResource), Tools.list(cl.getResources("classes_resource"))); // We can load from jar assertSame(effectiveLoader.loadClass(Lib.class.getName()), cl.loadClass(Lib.class.getName())); URL libResource = cl.getResource("lib_resource"); assertNotNull(libResource); assertEquals("lib_resource_value", Tools.read(libResource)); assertEquals(Collections.singletonList(libResource), Tools.list(cl.getResources("lib_resource"))); } }
@Override public URL getResource(String name) { URL url; try { url = (URL)findResource.invoke(parent, name); } catch (Exception e) { throw new UnsupportedOperationException("Not yet handled", e); } if (url != null) { if (shouldLoad(url)) { return url; } else { return null; } } else { return super.getResource(name); } }
@Test public void testLoadingLoadingFromParent() throws Exception { // We cannot load from file ClassLoader cl = new ParentJarClassLoader(effectiveLoader); try { cl.loadClass(Dev.class.getName()); fail(); } catch (ClassNotFoundException e) { } URL classesResource = cl.getResource("classes_resource"); assertNull(classesResource); assertFalse(cl.getResources("classes_resource").hasMoreElements()); assertEquals(Collections.emptyList(), Tools.list(cl.getResources("classes_resource"))); // We can load from jar assertSame(effectiveLoader.loadClass(Lib.class.getName()), cl.loadClass(Lib.class.getName())); URL libResource = cl.getResource("lib_resource"); assertNotNull(libResource); assertEquals("lib_resource_value", Tools.read(libResource)); Tools.list(cl.getResources("lib_resource").hasMoreElements()); assertEquals(Collections.singletonList(libResource), Tools.list(cl.getResources("lib_resource"))); }
@Test public void testLoadingLoadingFromParent() throws Exception { // We cannot load from file ClassLoader cl = new ParentJarClassLoader(effectiveLoader); try { cl.loadClass(Dev.class.getName()); fail(); } catch (ClassNotFoundException e) { } URL classesResource = cl.getResource("classes_resource"); assertNull(classesResource); assertFalse(cl.getResources("classes_resource").hasMoreElements()); assertEquals(Collections.emptyList(), Tools.list(cl.getResources("classes_resource"))); // We can load from jar assertSame(effectiveLoader.loadClass(Lib.class.getName()), cl.loadClass(Lib.class.getName())); URL libResource = cl.getResource("lib_resource"); assertNotNull(libResource); assertEquals("lib_resource_value", Tools.read(libResource)); Tools.list(cl.getResources("lib_resource").hasMoreElements()); assertEquals(Collections.singletonList(libResource), Tools.list(cl.getResources("lib_resource"))); }