01: package org.osbl.client.web.spring;
02:
03: import org.springframework.beans.BeansException;
04: import org.springframework.beans.factory.ListableBeanFactory;
05: import org.springframework.beans.factory.access.BootstrapException;
06: import org.springframework.web.context.support.ServletContextResource;
07: import org.osbl.client.ClientServiceProvider;
08: import org.osbl.spring.DeployedBeanFactory;
09: import org.osbl.ServiceProvider;
10: import org.conform.BeanMetaProvider;
11:
12: import javax.naming.InitialContext;
13: import javax.naming.NamingException;
14: import javax.servlet.*;
15: import java.beans.Introspector;
16: import java.util.StringTokenizer;
17:
18: public class SpringContextLoaderListener implements
19: ServletContextListener {
20: DeployedBeanFactory beanFactory;
21:
22: public void contextInitialized(ServletContextEvent event) {
23: ServletContext servletContext = event.getServletContext();
24: beanFactory = new DeployedBeanFactory(
25: loadParentContext(servletContext));
26:
27: String servletContextFileNames = servletContext
28: .getInitParameter("servletContextFileNames");
29: StringTokenizer tokenizer = new StringTokenizer(
30: servletContextFileNames, ", ");
31: for (; tokenizer.hasMoreTokens();) {
32: String resource = tokenizer.nextToken();
33: beanFactory.addResource(new ServletContextResource(
34: servletContext, resource));
35: }
36:
37: SpringClientServiceProvider serviceProvider = new SpringClientServiceProvider(
38: beanFactory);
39: servletContext.setAttribute("serviceProvider", serviceProvider);
40: ClientServiceProvider.setInstance(serviceProvider);
41: beanFactory.preInstantiateSingletons();
42: ClientServiceProvider.unsetInstance();
43: }
44:
45: protected ListableBeanFactory loadParentContext(
46: ServletContext servletContext) throws BeansException {
47: String jndiName = servletContext
48: .getInitParameter("jndiContextName");
49: if (jndiName == null) {
50: throw new BootstrapException(
51: "Please add the jndiContextName init param to your web.xml");
52: }
53: try {
54: return (ListableBeanFactory) new InitialContext()
55: .lookup(jndiName);
56: } catch (NamingException ex) {
57: throw new RuntimeException(ex);
58: }
59: }
60:
61: public void contextDestroyed(ServletContextEvent event) {
62: BeanMetaProvider beanMetaProvider = (BeanMetaProvider) ServiceProvider
63: .getInstance().getService("StaticBeanMetaProvider");
64: beanMetaProvider.clearCache();
65:
66: beanFactory.destroySingletons();
67:
68: // just to be sure the Introspector does release all hard references
69: Introspector.flushCaches();
70: }
71: }
|