@Override public TomEEWebappClassLoader copyWithoutTransformers() { final TomEEWebappClassLoader result = new TomEEWebappClassLoader(getParent()); result.additionalRepos = additionalRepos; result.configurer = configurer; super.copyStateWithoutTransformers(result); try { result.start(); } catch (LifecycleException e) { throw new IllegalStateException(e); } return result; }
@Before public void initContext() throws LifecycleException { final OpenEjbConfiguration configuration = new OpenEjbConfiguration(); configuration.facilities = new FacilitiesInfo(); final CoreContainerSystem containerSystem = new CoreContainerSystem(new IvmJndiFactory()); SystemInstance.get().setComponent(OpenEjbConfiguration.class, configuration); SystemInstance.get().setComponent(ContainerSystem.class, containerSystem); SystemInstance.get() .setComponent( WebAppEnricher.class, new WebAppEnricher() { @Override public URL[] enrichment(final ClassLoader webappClassLaoder) { return new URL[0]; } }); loader = new TomEEWebappClassLoader(ParentClassLoaderFinder.Helper.get()) { @Override protected void clearReferences() { // no-op: this test should be reworked to support it but in real life a loader is not // stopped/started } }; loader.init(); final StandardRoot resources = new StandardRoot(); loader.setResources(resources); resources.setContext( new StandardContext() { @Override public String getDocBase() { final File file = new File("target/foo"); file.mkdirs(); return file.getAbsolutePath(); } @Override public String getMBeanKeyProperties() { return "foo"; } { } }); resources.start(); loader.start(); info = new AppInfo(); info.appId = "test"; context = new AppContext( info.appId, SystemInstance.get(), loader, new IvmContext(), new IvmContext(), true); containerSystem.addAppContext(context); final WebContext webDeployment = new WebContext(context); webDeployment.setId(context.getId()); webDeployment.setClassLoader(loader); containerSystem.addWebContext(webDeployment); }
@Test public void tomcatClassLoaderParentShouldntBeNulAfterAStopStartOtherwiseReloadIsBroken() throws Exception { final CxfRSService server = new CxfRSService(); try { server.init(new Properties()); server.start(); server.afterApplicationCreated( new AssemblerAfterApplicationCreated( info, context, Collections.<BeanContext>emptyList())); { final ClassLoader beforeLoader = SystemInstance.get() .getComponent(ContainerSystem.class) .getWebContext("test") .getClassLoader(); assertSame(loader, beforeLoader); assertNotNull(beforeLoader); assertNotNull(Reflections.get(beforeLoader, "parent")); } loader.internalStop(); server.undeploy(new AssemblerBeforeApplicationDestroyed(info, context)); { final URLClassLoader afterLoader = URLClassLoader.class.cast( SystemInstance.get() .getComponent(ContainerSystem.class) .getWebContext("test") .getClassLoader()); assertSame(loader, afterLoader); assertNotNull(afterLoader); assertEquals(0, afterLoader.getURLs().length); assertEquals(LifecycleState.STOPPED, loader.getState()); } final StandardRoot resources = new StandardRoot(); loader.setResources(resources); resources.setContext( new StandardContext() { @Override public String getDocBase() { final File file = new File("target/foo"); file.mkdirs(); return file.getAbsolutePath(); } @Override public String getMBeanKeyProperties() { return "foo"; } { } }); resources.start(); loader.start(); // TomcatWebAppBuilder ill catch start event from StandardContext and force a classloader Reflections.set(loader, "parent", ParentClassLoaderFinder.Helper.get()); server.afterApplicationCreated( new AssemblerAfterApplicationCreated( info, context, Collections.<BeanContext>emptyList())); { final ClassLoader afterLoader = SystemInstance.get() .getComponent(ContainerSystem.class) .getWebContext("test") .getClassLoader(); assertSame(loader, afterLoader); assertNotNull(afterLoader); assertNotNull(Reflections.get(afterLoader, "parent")); } server.undeploy(new AssemblerBeforeApplicationDestroyed(info, context)); } finally { server.stop(); } }