package org.jboss.seam.ioc.spring; import static org.jboss.seam.annotations.Install.BUILT_IN; import javax.servlet.ServletContext; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.Startup; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.contexts.ServletLifecycle; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.XmlWebApplicationContext; /** * A seam component that loads up a spring WebApplicationContext * * @author Mike Youngstrom */ @Scope(ScopeType.APPLICATION) @BypassInterceptors @Startup(depends="org.jboss.seam.ioc.spring.springELResolver") @Name("org.jboss.seam.ioc.spring.contextLoader") @Install(value = false, precedence = BUILT_IN) public class ContextLoader { private WebApplicationContext webApplicationContext; private String[] configLocations = { XmlWebApplicationContext.DEFAULT_CONFIG_LOCATION }; @Create public void create() throws Exception { ServletContext servletContext = ServletLifecycle.getServletContext(); try { webApplicationContext = createContextLoader(servletContext); servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext); startupContextLoader(webApplicationContext); } catch (Exception e) { servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, e); throw e; } } protected WebApplicationContext createContextLoader(ServletContext servletContext) { XmlWebApplicationContext xmlWebApplicationContext = new XmlWebApplicationContext(); xmlWebApplicationContext.setServletContext(servletContext); xmlWebApplicationContext.setConfigLocations(getConfigLocations()); return xmlWebApplicationContext; } protected void startupContextLoader(WebApplicationContext webApplicationContext) { if(webApplicationContext instanceof ConfigurableWebApplicationContext) { ((ConfigurableWebApplicationContext) webApplicationContext).refresh(); } } @Destroy public void destroy() { if (webApplicationContext != null && webApplicationContext instanceof ConfigurableWebApplicationContext) { ((ConfigurableWebApplicationContext) webApplicationContext).close(); } } public String[] getConfigLocations() { return configLocations; } public void setConfigLocations(String[] configLocations) { this.configLocations = configLocations; } }