Search in sources :

Example 1 with GenericWebServletApplicationContext

use of cn.taketoday.web.context.support.GenericWebServletApplicationContext in project today-infrastructure by TAKETODAY.

the class AbstractGenericWebContextLoader method loadContext.

// SmartContextLoader
/**
 * Load a Spring {@link WebServletApplicationContext} from the supplied
 * {@link MergedContextConfiguration}.
 * <p>Implementation details:
 * <ul>
 * <li>Calls {@link #validateMergedContextConfiguration(WebMergedContextConfiguration)}
 * to allow subclasses to validate the supplied configuration before proceeding.</li>
 * <li>Creates a {@link GenericWebServletApplicationContext} instance.</li>
 * <li>If the supplied {@code MergedContextConfiguration} references a
 * {@linkplain MergedContextConfiguration#getParent() parent configuration},
 * the corresponding {@link MergedContextConfiguration#getParentApplicationContext()
 * ApplicationContext} will be retrieved and
 * {@linkplain GenericWebServletApplicationContext#setParent(ApplicationContext) set as the parent}
 * for the context created by this method.</li>
 * <li>Delegates to {@link #configureWebResources} to create the
 * {@link MockServletContext} and set it in the {@code WebServletApplicationContext}.</li>
 * <li>Calls {@link #prepareContext} to allow for customizing the context
 * before bean definitions are loaded.</li>
 * <li>Calls {@link #customizeBeanFactory} to allow for customizing the
 * context's {@code StandardBeanFactory}.</li>
 * <li>Delegates to {@link #loadBeanDefinitions} to populate the context
 * from the locations or classes in the supplied {@code MergedContextConfiguration}.</li>
 * <li>Delegates to {@link AnnotationConfigUtils} for
 * {@linkplain AnnotationConfigUtils#registerAnnotationConfigProcessors registering}
 * annotation configuration processors.</li>
 * <li>Calls {@link #customizeContext} to allow for customizing the context
 * before it is refreshed.</li>
 * <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
 * context and registers a JVM shutdown hook for it.</li>
 * </ul>
 *
 * @return a new web application context
 * @see SmartContextLoader#loadContext(MergedContextConfiguration)
 * @see GenericWebServletApplicationContext
 */
@Override
public final ConfigurableApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
    Assert.isTrue(mergedConfig instanceof WebMergedContextConfiguration, () -> String.format("Cannot load WebServletApplicationContext from non-web merged context configuration %s. " + "Consider annotating your test class with @WebAppConfiguration.", mergedConfig));
    WebMergedContextConfiguration webMergedConfig = (WebMergedContextConfiguration) mergedConfig;
    if (logger.isDebugEnabled()) {
        logger.debug(String.format("Loading WebServletApplicationContext for merged context configuration %s.", webMergedConfig));
    }
    validateMergedContextConfiguration(webMergedConfig);
    GenericWebServletApplicationContext context = new GenericWebServletApplicationContext();
    ApplicationContext parent = mergedConfig.getParentApplicationContext();
    if (parent != null) {
        context.setParent(parent);
    }
    configureWebResources(context, webMergedConfig);
    prepareContext(context, webMergedConfig);
    customizeBeanFactory(context.getBeanFactory(), webMergedConfig);
    loadBeanDefinitions(context, webMergedConfig);
    AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
    customizeContext(context, webMergedConfig);
    context.refresh();
    context.registerShutdownHook();
    return context;
}
Also used : GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) WebServletApplicationContext(cn.taketoday.web.servlet.WebServletApplicationContext) ConfigurableApplicationContext(cn.taketoday.context.ConfigurableApplicationContext) ApplicationContext(cn.taketoday.context.ApplicationContext) GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext)

Example 2 with GenericWebServletApplicationContext

use of cn.taketoday.web.context.support.GenericWebServletApplicationContext in project today-framework by TAKETODAY.

the class AbstractGenericWebContextLoader method configureWebResources.

/**
 * Configures web resources for the supplied web application context (WAC).
 * <h4>Implementation Details</h4>
 * <p>If the supplied WAC has no parent or its parent is not a WAC, the
 * supplied WAC will be configured as the Root WAC (see "<em>Root WAC
 * Configuration</em>" below).
 * <p>Otherwise the context hierarchy of the supplied WAC will be traversed
 * to find the top-most WAC (i.e., the root); and the {@link ServletContext}
 * of the Root WAC will be set as the {@code ServletContext} for the supplied
 * WAC.
 * <h4>Root WAC Configuration</h4>
 * <ul>
 * <li>The resource base path is retrieved from the supplied
 * {@code WebMergedContextConfiguration}.</li>
 * <li>A {@link ResourceLoader} is instantiated for the {@link MockServletContext}:
 * if the resource base path is prefixed with "{@code classpath:}", a
 * {@link DefaultResourceLoader} will be used; otherwise, a
 * {@link FileSystemResourceLoader} will be used.</li>
 * <li>A {@code MockServletContext} will be created using the resource base
 * path and resource loader.</li>
 * <li>The supplied {@link GenericWebServletApplicationContext} is then stored in
 * the {@code MockServletContext} under the
 * {@link WebServletApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE} key.</li>
 * <li>Finally, the {@code MockServletContext} is set in the
 * {@code WebServletApplicationContext}.</li>
 * </ul>
 *
 * @param context the web application context for which to configure the web resources
 * @param webMergedConfig the merged context configuration to use to load the web application context
 */
protected void configureWebResources(GenericWebServletApplicationContext context, WebMergedContextConfiguration webMergedConfig) {
    ApplicationContext parent = context.getParent();
    // set the current context as the root WebServletApplicationContext:
    if (!(parent instanceof WebServletApplicationContext)) {
        String resourceBasePath = webMergedConfig.getResourceBasePath();
        ResourceLoader resourceLoader = (resourceBasePath.startsWith(ResourceLoader.CLASSPATH_URL_PREFIX) ? new DefaultResourceLoader() : new FileSystemResourceLoader());
        ServletContext servletContext = new MockServletContext(resourceBasePath, resourceLoader);
        servletContext.setAttribute(WebServletApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
        context.setServletContext(servletContext);
    } else {
        ServletContext servletContext = null;
        // Find the root WebServletApplicationContext
        while (parent != null) {
            if (parent instanceof WebServletApplicationContext && !(parent.getParent() instanceof WebServletApplicationContext)) {
                servletContext = ((WebServletApplicationContext) parent).getServletContext();
                break;
            }
            parent = parent.getParent();
        }
        Assert.state(servletContext != null, "Failed to find root WebServletApplicationContext in the context hierarchy");
        context.setServletContext(servletContext);
    }
}
Also used : FileSystemResourceLoader(cn.taketoday.core.io.FileSystemResourceLoader) ResourceLoader(cn.taketoday.core.io.ResourceLoader) DefaultResourceLoader(cn.taketoday.core.io.DefaultResourceLoader) GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) WebServletApplicationContext(cn.taketoday.web.servlet.WebServletApplicationContext) ConfigurableApplicationContext(cn.taketoday.context.ConfigurableApplicationContext) ApplicationContext(cn.taketoday.context.ApplicationContext) FileSystemResourceLoader(cn.taketoday.core.io.FileSystemResourceLoader) MockServletContext(cn.taketoday.mock.web.MockServletContext) ServletContext(jakarta.servlet.ServletContext) GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) WebServletApplicationContext(cn.taketoday.web.servlet.WebServletApplicationContext) MockServletContext(cn.taketoday.mock.web.MockServletContext) DefaultResourceLoader(cn.taketoday.core.io.DefaultResourceLoader)

Example 3 with GenericWebServletApplicationContext

use of cn.taketoday.web.context.support.GenericWebServletApplicationContext in project today-framework by TAKETODAY.

the class AbstractGenericWebContextLoader method loadContext.

// SmartContextLoader
/**
 * Load a Spring {@link WebServletApplicationContext} from the supplied
 * {@link MergedContextConfiguration}.
 * <p>Implementation details:
 * <ul>
 * <li>Calls {@link #validateMergedContextConfiguration(WebMergedContextConfiguration)}
 * to allow subclasses to validate the supplied configuration before proceeding.</li>
 * <li>Creates a {@link GenericWebServletApplicationContext} instance.</li>
 * <li>If the supplied {@code MergedContextConfiguration} references a
 * {@linkplain MergedContextConfiguration#getParent() parent configuration},
 * the corresponding {@link MergedContextConfiguration#getParentApplicationContext()
 * ApplicationContext} will be retrieved and
 * {@linkplain GenericWebServletApplicationContext#setParent(ApplicationContext) set as the parent}
 * for the context created by this method.</li>
 * <li>Delegates to {@link #configureWebResources} to create the
 * {@link MockServletContext} and set it in the {@code WebServletApplicationContext}.</li>
 * <li>Calls {@link #prepareContext} to allow for customizing the context
 * before bean definitions are loaded.</li>
 * <li>Calls {@link #customizeBeanFactory} to allow for customizing the
 * context's {@code StandardBeanFactory}.</li>
 * <li>Delegates to {@link #loadBeanDefinitions} to populate the context
 * from the locations or classes in the supplied {@code MergedContextConfiguration}.</li>
 * <li>Delegates to {@link AnnotationConfigUtils} for
 * {@linkplain AnnotationConfigUtils#registerAnnotationConfigProcessors registering}
 * annotation configuration processors.</li>
 * <li>Calls {@link #customizeContext} to allow for customizing the context
 * before it is refreshed.</li>
 * <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
 * context and registers a JVM shutdown hook for it.</li>
 * </ul>
 *
 * @return a new web application context
 * @see SmartContextLoader#loadContext(MergedContextConfiguration)
 * @see GenericWebServletApplicationContext
 */
@Override
public final ConfigurableApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
    Assert.isTrue(mergedConfig instanceof WebMergedContextConfiguration, () -> String.format("Cannot load WebServletApplicationContext from non-web merged context configuration %s. " + "Consider annotating your test class with @WebAppConfiguration.", mergedConfig));
    WebMergedContextConfiguration webMergedConfig = (WebMergedContextConfiguration) mergedConfig;
    if (logger.isDebugEnabled()) {
        logger.debug(String.format("Loading WebServletApplicationContext for merged context configuration %s.", webMergedConfig));
    }
    validateMergedContextConfiguration(webMergedConfig);
    GenericWebServletApplicationContext context = new GenericWebServletApplicationContext();
    ApplicationContext parent = mergedConfig.getParentApplicationContext();
    if (parent != null) {
        context.setParent(parent);
    }
    configureWebResources(context, webMergedConfig);
    prepareContext(context, webMergedConfig);
    customizeBeanFactory(context.getBeanFactory(), webMergedConfig);
    loadBeanDefinitions(context, webMergedConfig);
    AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
    customizeContext(context, webMergedConfig);
    context.refresh();
    context.registerShutdownHook();
    return context;
}
Also used : GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) WebServletApplicationContext(cn.taketoday.web.servlet.WebServletApplicationContext) ConfigurableApplicationContext(cn.taketoday.context.ConfigurableApplicationContext) ApplicationContext(cn.taketoday.context.ApplicationContext) GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext)

Example 4 with GenericWebServletApplicationContext

use of cn.taketoday.web.context.support.GenericWebServletApplicationContext in project today-framework by TAKETODAY.

the class EnvironmentSystemIntegrationTests method webApplicationContext.

@Test
void webApplicationContext() {
    GenericWebServletApplicationContext ctx = new GenericWebServletApplicationContext(newBeanFactoryWithEnvironmentAwareBean());
    assertHasStandardServletEnvironment(ctx);
    ctx.setEnvironment(prodWebEnv);
    ctx.refresh();
    assertHasEnvironment(ctx, prodWebEnv);
    assertEnvironmentBeanRegistered(ctx);
    assertEnvironmentAwareInvoked(ctx, prodWebEnv);
}
Also used : GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) Test(org.junit.jupiter.api.Test)

Example 5 with GenericWebServletApplicationContext

use of cn.taketoday.web.context.support.GenericWebServletApplicationContext in project today-framework by TAKETODAY.

the class EnvironmentSystemIntegrationTests method registerServletParamPropertySources_GenericWebApplicationContext.

@Test
void registerServletParamPropertySources_GenericWebApplicationContext() {
    MockServletContext servletContext = new MockServletContext();
    servletContext.addInitParameter("pCommon", "pCommonContextValue");
    servletContext.addInitParameter("pContext1", "pContext1Value");
    GenericWebServletApplicationContext ctx = new GenericWebServletApplicationContext();
    ctx.setServletContext(servletContext);
    ctx.refresh();
    ConfigurableEnvironment environment = ctx.getEnvironment();
    assertThat(environment).isInstanceOf(StandardServletEnvironment.class);
    PropertySources propertySources = environment.getPropertySources();
    assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)).isTrue();
    // ServletContext params are available
    assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonContextValue");
    assertThat(environment.getProperty("pContext1")).isEqualTo("pContext1Value");
    // Servlet* PropertySources have precedence over System* PropertySources
    assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME))).isLessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)));
    // Replace system properties with a mock property source for convenience
    MockPropertySource mockSystemProperties = new MockPropertySource(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
    mockSystemProperties.setProperty("pCommon", "pCommonSysPropsValue");
    mockSystemProperties.setProperty("pSysProps1", "pSysProps1Value");
    propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockSystemProperties);
    // assert that servletcontext init params resolve with higher precedence than sysprops
    assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonContextValue");
    assertThat(environment.getProperty("pSysProps1")).isEqualTo("pSysProps1Value");
}
Also used : GenericWebServletApplicationContext(cn.taketoday.web.context.support.GenericWebServletApplicationContext) MockPropertySource(cn.taketoday.mock.env.MockPropertySource) MockServletContext(cn.taketoday.mock.web.MockServletContext) Test(org.junit.jupiter.api.Test)

Aggregations

GenericWebServletApplicationContext (cn.taketoday.web.context.support.GenericWebServletApplicationContext)10 ApplicationContext (cn.taketoday.context.ApplicationContext)4 ConfigurableApplicationContext (cn.taketoday.context.ConfigurableApplicationContext)4 MockServletContext (cn.taketoday.mock.web.MockServletContext)4 WebServletApplicationContext (cn.taketoday.web.servlet.WebServletApplicationContext)4 Test (org.junit.jupiter.api.Test)4 AnnotatedBeanDefinitionReader (cn.taketoday.context.annotation.AnnotatedBeanDefinitionReader)2 ClassPathBeanDefinitionScanner (cn.taketoday.context.annotation.ClassPathBeanDefinitionScanner)2 DefaultResourceLoader (cn.taketoday.core.io.DefaultResourceLoader)2 FileSystemResourceLoader (cn.taketoday.core.io.FileSystemResourceLoader)2 ResourceLoader (cn.taketoday.core.io.ResourceLoader)2 MockPropertySource (cn.taketoday.mock.env.MockPropertySource)2 ServletContext (jakarta.servlet.ServletContext)2