示例#1
0
 /** Customize Tomcat configuration. */
 private void customizeTomcat(ConfigurableEmbeddedServletContainer container) {
   if (container instanceof TomcatEmbeddedServletContainerFactory) {
     TomcatEmbeddedServletContainerFactory tomcatFactory =
         (TomcatEmbeddedServletContainerFactory) container;
     tomcatFactory.addContextCustomizers(
         (TomcatContextCustomizer)
             context -> {
               // See https://github.com/jhipster/generator-jhipster/issues/3995
               StandardRoot resources = new StandardRoot();
               resources.setCacheMaxSize(40960);
               resources.setCacheObjectMaxSize(2048);
               context.setResources(resources);
             });
   }
 }
  @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();
    }
  }