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