KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > portal > server > servlet > PortalContextListener


1 /*****************************************
2  * *
3  * JBoss Portal: The OpenSource Portal *
4  * *
5  * Distributable under LGPL license. *
6  * See terms of license at gnu.org. *
7  * *
8  *****************************************/

9 package org.jboss.portal.server.servlet;
10
11 import java.io.InputStream JavaDoc;
12 import java.util.Collections JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.LinkedList JavaDoc;
15 import java.util.List JavaDoc;
16
17 import javax.management.JMException JavaDoc;
18 import javax.management.MBeanServer JavaDoc;
19 import javax.management.ObjectName JavaDoc;
20 import javax.management.StandardMBean JavaDoc;
21 import javax.servlet.ServletContext JavaDoc;
22 import javax.servlet.ServletContextEvent JavaDoc;
23 import javax.servlet.ServletContextListener JavaDoc;
24 import javax.xml.parsers.DocumentBuilder JavaDoc;
25 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
26 import javax.xml.parsers.ParserConfigurationException JavaDoc;
27
28 import org.apache.log4j.Logger;
29 import org.jboss.mx.loading.UnifiedClassLoader;
30 import org.jboss.mx.util.MBeanServerLocator;
31 import org.jboss.mx.util.ObjectNameFactory;
32 import org.jboss.portal.common.util.JMX;
33 import org.jboss.portal.common.util.Tools;
34 import org.jboss.portal.common.util.XML;
35 import org.jboss.portal.server.PortalServer;
36 import org.jboss.system.ServiceControllerMBean;
37 import org.w3c.dom.Document JavaDoc;
38 import org.w3c.dom.Element JavaDoc;
39 import org.w3c.dom.NodeList JavaDoc;
40 import org.xml.sax.SAXException JavaDoc;
41
42 /**
43  * @author <a HREF="mailto:julien@jboss.org">Julien Viet</a>
44  * @version $Revision: 1.6 $
45  */

46 public class PortalContextListener implements ServletContextListener JavaDoc
47 {
48
49    protected final Logger log = Logger.getLogger(getClass());
50
51    protected ServletContext JavaDoc servletContext;
52
53    protected MBeanServer JavaDoc server;
54    protected ServiceControllerMBean controller;
55    protected List JavaDoc mbeans;
56
57    protected ClassLoader JavaDoc classLoader;
58
59    public void contextInitialized(ServletContextEvent JavaDoc event)
60    {
61       servletContext = event.getServletContext();
62
63       try
64       {
65          // Look for the right classloader
66
ClassLoader JavaDoc classLoader = Thread.currentThread().getContextClassLoader();
67          while (classLoader != null && !(classLoader instanceof UnifiedClassLoader))
68          {
69             classLoader = classLoader.getParent();
70          }
71
72          // Get the UCL otherwise return
73
if (classLoader == null)
74          {
75             log.error("Cannot find a suitable classloader");
76             return;
77          }
78          UnifiedClassLoader ucl = (UnifiedClassLoader)classLoader;
79          ObjectName JavaDoc loaderName = ucl.getObjectName();
80          this.classLoader = classLoader;
81
82          // Obtain the microkernel services
83
this.server = MBeanServerLocator.locateJBoss();
84          this.controller = (ServiceControllerMBean)JMX.getMBeanProxy(ServiceControllerMBean.class, ServiceControllerMBean.OBJECT_NAME, server);
85          this.mbeans = new LinkedList JavaDoc();
86
87          // Deploy services
88
InputStream JavaDoc in = null;
89          try
90          {
91             in = servletContext.getResourceAsStream("/WEB-INF/jboss-service.xml");
92             if(in != null)
93             {
94                DocumentBuilder JavaDoc builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
95                Document JavaDoc doc = builder.parse(in);
96
97                // Look in the jboss-service.xml the name given to this mbean by its depends reference
98
ObjectName JavaDoc bootStrapName = ObjectNameFactory.create("portal:service=BootStrapContext");
99                NodeList JavaDoc dependsElts = doc.getElementsByTagName("depends");
100                for (int i = 0;i < dependsElts.getLength();i++)
101                {
102                   Element JavaDoc dependsElt = (Element JavaDoc)dependsElts.item(i);
103                   String JavaDoc depends = XML.asString(dependsElt).trim();
104                   if (depends.endsWith(":service=BootStrapContext"))
105                   {
106                      // We found it
107
bootStrapName = ObjectNameFactory.create(depends);
108                   }
109                }
110
111                // Register the bootsrap
112
BootStrapContext bootStrap = new BootStrapContextImpl(event.getServletContext(), Thread.currentThread().getContextClassLoader());
113                StandardMBean JavaDoc mbean = new StandardMBean JavaDoc(bootStrap, BootStrapContext.class);
114                registerMBean(mbean, bootStrapName);
115                controller.create(bootStrapName);
116
117                NodeList JavaDoc mbeanElts = doc.getDocumentElement().getElementsByTagName("mbean");
118                for (int i = 0;i < mbeanElts.getLength();i++)
119                {
120                   Element JavaDoc mbeanElt = (Element JavaDoc)mbeanElts.item(i);
121                   List JavaDoc installed = controller.install(mbeanElt, loaderName);
122                   mbeans.addAll(installed);
123                   for (Iterator JavaDoc j = installed.iterator(); j.hasNext();)
124                   {
125                      ObjectName JavaDoc name = (ObjectName JavaDoc)j.next();
126                      controller.create(name);
127                   }
128                }
129             }
130          }
131          catch (SAXException JavaDoc e)
132          {
133             log.error("Cannot parse XML file", e);
134          }
135          catch (ParserConfigurationException JavaDoc e)
136          {
137             log.error("Cannot create a XML parser", e);
138          }
139          catch (Exception JavaDoc e)
140          {
141             log.error("Cannot register an mbean", e);
142          }
143          finally
144          {
145             Tools.safeClose(in);
146          }
147
148          // Start all
149
for (Iterator JavaDoc i = mbeans.iterator();i.hasNext();)
150          {
151             ObjectName JavaDoc name = (ObjectName JavaDoc)i.next();
152             controller.start(name);
153          }
154       }
155       catch (Exception JavaDoc e)
156       {
157          e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
158
}
159    }
160
161    public void contextDestroyed(ServletContextEvent JavaDoc event)
162    {
163       //
164
log.debug("Starting cleanup");
165       Collections.reverse(mbeans);
166       remove(controller, mbeans);
167       log.debug("Cleanup finished");
168
169       //
170
servletContext = null;
171       classLoader = null;
172       mbeans = null;
173       controller = null;
174    }
175
176    protected final void registerMBean(Object JavaDoc resource, ObjectName JavaDoc name) throws JMException JavaDoc
177    {
178       server.registerMBean(resource, name);
179       mbeans.add(name);
180    }
181
182    public static void remove(ServiceControllerMBean controller, List JavaDoc mbeans)
183    {
184       try
185       {
186          for (Iterator JavaDoc i = mbeans.iterator(); i.hasNext();)
187          {
188             ObjectName JavaDoc name = (ObjectName JavaDoc)i.next();
189             controller.stop(name);
190          }
191          for (Iterator JavaDoc i = mbeans.iterator(); i.hasNext();)
192          {
193             ObjectName JavaDoc name = (ObjectName JavaDoc)i.next();
194             controller.destroy(name);
195          }
196       }
197       catch (Exception JavaDoc e)
198       {
199          e.printStackTrace();
200       }
201       finally
202       {
203          for (Iterator JavaDoc i = mbeans.iterator(); i.hasNext();)
204          {
205             try
206             {
207                ObjectName JavaDoc name = (ObjectName JavaDoc)i.next();
208                controller.remove(name);
209             }
210             catch (Exception JavaDoc e)
211             {
212                e.printStackTrace();
213             }
214          }
215       }
216    }
217 }
218
Popular Tags