package org.eclipse.jetty.webapp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import org.eclipse.jetty.util.resource.Resource; import org.junit.Before; import org.junit.Test; public class WebAppClassLoaderTest { private WebAppContext _context; private WebAppClassLoader _loader; @Before public void init() throws Exception { Resource webapp = Resource.newResource("./src/test/webapp"); _context = new WebAppContext(); _context.setBaseResource(webapp); _context.setContextPath("/test"); _loader = new WebAppClassLoader(_context); _loader.addJars(webapp.addPath("WEB-INF/lib")); _loader.addClassPath(webapp.addPath("WEB-INF/classes")); _loader.setName("test"); } @Test public void testParentLoad() throws Exception { _context.setParentLoaderPriority(true); assertTrue(canLoadClass("org.acme.webapp.ClassInJarA")); assertTrue(canLoadClass("org.acme.webapp.ClassInJarB")); assertTrue(canLoadClass("org.acme.other.ClassInClassesC")); assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration")); Class clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA"); assertTrue(clazzA.getField("FROM_PARENT")!=null); } @Test public void testWebAppLoad() throws Exception { _context.setParentLoaderPriority(false); assertTrue(canLoadClass("org.acme.webapp.ClassInJarA")); assertTrue(canLoadClass("org.acme.webapp.ClassInJarB")); assertTrue(canLoadClass("org.acme.other.ClassInClassesC")); assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration")); Class<?> clazzA = _loader.loadClass("org.acme.webapp.ClassInJarA"); try { clazzA.getField("FROM_PARENT"); assertTrue(false); } catch(NoSuchFieldException e) { assertTrue(true); } } @Test public void testExposedClass() throws Exception { String[] oldSC=_context.getServerClasses(); String[] newSC=new String[oldSC.length+1]; newSC[0]="-org.eclipse.jetty.webapp.Configuration"; System.arraycopy(oldSC,0,newSC,1,oldSC.length); _context.setServerClasses(newSC); assertTrue(canLoadClass("org.acme.webapp.ClassInJarA")); assertTrue(canLoadClass("org.acme.webapp.ClassInJarB")); assertTrue(canLoadClass("org.acme.other.ClassInClassesC")); assertTrue(canLoadClass("org.eclipse.jetty.webapp.Configuration")); assertTrue(cantLoadClass("org.eclipse.jetty.webapp.JarScanner")); } @Test public void testSystemServerClass() throws Exception { String[] oldServC=_context.getServerClasses(); String[] newServC=new String[oldServC.length+1]; newServC[0]="org.eclipse.jetty.webapp.Configuration"; System.arraycopy(oldServC,0,newServC,1,oldServC.length); _context.setServerClasses(newServC); String[] oldSysC=_context.getSystemClasses(); String[] newSysC=new String[oldSysC.length+1]; newSysC[0]="org.eclipse.jetty.webapp."; System.arraycopy(oldSysC,0,newSysC,1,oldSysC.length); _context.setSystemClasses(newSysC); assertTrue(canLoadClass("org.acme.webapp.ClassInJarA")); assertTrue(canLoadClass("org.acme.webapp.ClassInJarB")); assertTrue(canLoadClass("org.acme.other.ClassInClassesC")); assertTrue(cantLoadClass("org.eclipse.jetty.webapp.Configuration")); assertTrue(cantLoadClass("org.eclipse.jetty.webapp.JarScanner")); } @Test public void testResources() throws Exception { List<URL> resources; _context.setParentLoaderPriority(false); resources =toList( _loader.getResources("org/acme/resource.txt")); assertEquals(3,resources.size()); assertEquals(0,resources.get(0).toString().indexOf("jar:file:")); assertEquals(-1,resources.get(1).toString().indexOf("test-classes")); assertEquals(0,resources.get(2).toString().indexOf("file:")); _context.setParentLoaderPriority(true); resources =toList( _loader.getResources("org/acme/resource.txt")); assertEquals(3,resources.size()); assertEquals(0,resources.get(0).toString().indexOf("file:")); assertEquals(0,resources.get(1).toString().indexOf("jar:file:")); assertEquals(-1,resources.get(2).toString().indexOf("test-classes")); String[] oldServC=_context.getServerClasses(); String[] newServC=new String[oldServC.length+1]; newServC[0]="org.acme."; System.arraycopy(oldServC,0,newServC,1,oldServC.length); _context.setServerClasses(newServC); _context.setParentLoaderPriority(true); resources =toList( _loader.getResources("org/acme/resource.txt")); assertEquals(2,resources.size()); assertEquals(0,resources.get(0).toString().indexOf("jar:file:")); assertEquals(0,resources.get(1).toString().indexOf("file:")); _context.setServerClasses(oldServC); String[] oldSysC=_context.getSystemClasses(); String[] newSysC=new String[oldSysC.length+1]; newSysC[0]="org.acme."; System.arraycopy(oldSysC,0,newSysC,1,oldSysC.length); _context.setSystemClasses(newSysC); _context.setParentLoaderPriority(true); resources =toList( _loader.getResources("org/acme/resource.txt")); assertEquals(1,resources.size()); assertEquals(0,resources.get(0).toString().indexOf("file:")); } private List<URL> toList(Enumeration<URL> e) { List<URL> list = new ArrayList<URL>(); while (e!=null && e.hasMoreElements()) list.add(e.nextElement()); return list; } private boolean canLoadClass(String clazz) throws ClassNotFoundException { return _loader.loadClass(clazz)!=null; } private boolean cantLoadClass(String clazz) { try { return _loader.loadClass(clazz)==null; } catch(ClassNotFoundException e) { return true; } } }