/* * Copyright 2013 eXo Platform SAS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package juzu.impl.common; import juzu.test.AbstractTestCase; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import java.io.File; import java.io.InputStream; import java.net.URL; import java.net.URLClassLoader; import java.util.Collections; /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class ClassLoaderTestCase extends AbstractTestCase { /** . */ private File targetDir; /** . */ private JavaArchive classes; /** . */ private JavaArchive lib; /** . */ private File libFile; /** . */ private ClassLoader effectiveLoader; @Override public void setUp() throws Exception { String targetPath = System.getProperty("targetDir"); assertNotNull(targetPath); File targetDir = new File(targetPath); assertTrue(targetDir.isDirectory()); // Build a correct parent CL and check everything first JavaArchive classes = ShrinkWrap.create(JavaArchive.class).addClass(Dev.class).addAsResource(new StringAsset("classes_resource_value"), "classes_resource"); JavaArchive lib = ShrinkWrap.create(JavaArchive.class).addClass(Lib.class).addAsResource(new StringAsset("lib_resource_value"), "lib_resource"); File explodedDir = explode(targetDir, classes, lib); File libFile = new File(explodedDir, "WEB-INF/lib/lib.jar"); File classesDir = new File(explodedDir, "WEB-INF/classes"); URLClassLoader cl = new URLClassLoader(new URL[]{classesDir.toURI().toURL(), libFile.toURI().toURL()}, getExtClassLoader()); Class<?> devClass = cl.loadClass(Dev.class.getName()); assertNotSame(devClass, Dev.class); Class<?> libClass = cl.loadClass(Lib.class.getName()); assertNotSame(libClass, Lib.class); InputStream classesResource = cl.getResourceAsStream("classes_resource"); assertNotNull(classesResource); assertEquals("classes_resource_value", Tools.read(classesResource)); InputStream libResource = cl.getResourceAsStream("lib_resource"); assertNotNull(libResource); assertEquals("lib_resource_value", Tools.read(libResource)); // this.targetDir = targetDir; this.effectiveLoader = cl; this.lib = lib; this.classes = classes; this.libFile = libFile; } private ClassLoader getExtClassLoader() { ClassLoader systemCL = ClassLoader.getSystemClassLoader(); ClassLoader extCL = systemCL.getParent(); try { extCL.loadClass(Dev.class.getName()); fail(); } catch (ClassNotFoundException e) { } try { extCL.loadClass(Lib.class.getName()); fail(); } catch (ClassNotFoundException e) { } return extCL; } private File explode(File targetDir, JavaArchive classes, JavaArchive lib) { WebArchive archive = ShrinkWrap.create(WebArchive.class); archive.merge(classes, "WEB-INF/classes"); archive.addAsDirectory("WEB-INF/lib"); File explodedDir = archive.as(ExplodedExporter.class).exportExploded(targetDir); File libJar = new File(explodedDir, "WEB-INF/lib/lib.jar"); lib.as(ZipExporter.class).exportTo(libJar); return explodedDir; } @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 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"))); } }