@Override public void stop() throws LifecycleException { // in our destroyapplication method we need a valid classloader to // TomcatWebAppBuilder.afterStop() if (forceStopPhase || restarting) { internalStop(); } }
public void internalDestroy() { try { if (!stopped) { try { internalStop(); } catch (final LifecycleException e) { // no-op } } super.destroy(); } finally { cleanUpClassLoader(); } }
@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(); } }