package xeus.jcl.junit; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.net.URISyntaxException; import java.net.URL; import junit.framework.TestCase; import org.apache.log4j.Logger; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.FileSystemResource; import xeus.jcl.JarClassLoader; import xeus.jcl.JclObjectFactory; import xeus.jcl.JclUtils; import xeus.jcl.exception.JclException; @SuppressWarnings("all") public class LoadTest extends TestCase { private static Logger logger = Logger.getLogger( LoadTest.class ); public void testWithResourceName() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader( new String[] { "test-jcl.jar", "./test-classes" } ); // New class Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); // Locally loaded testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testWithClassFolder() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader( new String[] { "./test-classes" } ); Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testWithUrl() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException, URISyntaxException { // URL url = new URL("http://localhost:8080/blank/test-jcl.jar"); File f = new File( "test-jcl.jar" ); JarClassLoader jc = new JarClassLoader( new URL[] { f.toURI().toURL() } ); Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testWithInputStream() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { FileInputStream fis = new FileInputStream( "test-jcl.jar" ); JarClassLoader jc = new JarClassLoader( new FileInputStream[] { fis } ); Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); fis.close(); } public void testWithSpring() throws FileNotFoundException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException { XmlBeanFactory bf = new XmlBeanFactory( new FileSystemResource( "spring-test.xml" ) ); Object testObj = bf.getBean( "test" ); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testAddingMoreResources() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader(); jc.add( "./test-classes" ); Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testChangeClassLoadingOrder() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader(); jc.getSystemLoader().setOrder( 1 ); jc.getParentLoader().setOrder( 3 ); jc.getLocalLoader().setOrder( 2 ); jc.add( "./test-classes" ); // Should be loaded from system Object testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); testObj.getClass().getDeclaredMethod( "sayHello", null ).invoke( testObj, null ); } public void testInterfaceCast() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader(); jc.add( "test-jcl.jar" ); JclObjectFactory factory = JclObjectFactory.getInstance(); Object serializable = factory.create( jc, "xeus.jcl.test.Test" ); Serializable s = JclUtils.cast( serializable, Serializable.class ); assertNotNull( s ); s = (Serializable) JclUtils.toCastable( serializable, Serializable.class ); assertNotNull( s ); s = (Serializable) JclUtils.clone( serializable ); assertNotNull( s ); } public void testUnloading() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader( new String[] { "./test-classes" } ); Object testObj = null; jc.loadClass( "xeus.jcl.test.Test" ); jc.unloadClass( "xeus.jcl.test.Test" ); try { // Should get loaded from system testObj = jc.loadClass( "xeus.jcl.test.Test" ).newInstance(); assertNotNull( testObj ); return; } catch (ClassNotFoundException cnfe) { if( logger.isTraceEnabled() ) logger.trace( cnfe ); testObj = null; } assertNull( testObj ); } public void testEnabledFlag() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException, JclException { JarClassLoader jc = new JarClassLoader( new String[] { "test-jcl.jar" } ); jc.getLocalLoader().setEnabled( false ); jc.getCurrentLoader().setEnabled( false ); jc.getParentLoader().setEnabled( false ); jc.getSystemLoader().setEnabled( false ); try { jc.loadClass( "xeus.jcl.test.Test" ); } catch (ClassNotFoundException e) { // expected return; } throw new AssertionError( "Expected: ClassNotFoundException" ); } }