1 9 package org.jboss.portal.server.servlet; 10 11 import java.io.InputStream ; 12 import java.util.Collections ; 13 import java.util.Iterator ; 14 import java.util.LinkedList ; 15 import java.util.List ; 16 17 import javax.management.JMException ; 18 import javax.management.MBeanServer ; 19 import javax.management.ObjectName ; 20 import javax.management.StandardMBean ; 21 import javax.servlet.ServletContext ; 22 import javax.servlet.ServletContextEvent ; 23 import javax.servlet.ServletContextListener ; 24 import javax.xml.parsers.DocumentBuilder ; 25 import javax.xml.parsers.DocumentBuilderFactory ; 26 import javax.xml.parsers.ParserConfigurationException ; 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 ; 38 import org.w3c.dom.Element ; 39 import org.w3c.dom.NodeList ; 40 import org.xml.sax.SAXException ; 41 42 46 public class PortalContextListener implements ServletContextListener 47 { 48 49 protected final Logger log = Logger.getLogger(getClass()); 50 51 protected ServletContext servletContext; 52 53 protected MBeanServer server; 54 protected ServiceControllerMBean controller; 55 protected List mbeans; 56 57 protected ClassLoader classLoader; 58 59 public void contextInitialized(ServletContextEvent event) 60 { 61 servletContext = event.getServletContext(); 62 63 try 64 { 65 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 67 while (classLoader != null && !(classLoader instanceof UnifiedClassLoader)) 68 { 69 classLoader = classLoader.getParent(); 70 } 71 72 if (classLoader == null) 74 { 75 log.error("Cannot find a suitable classloader"); 76 return; 77 } 78 UnifiedClassLoader ucl = (UnifiedClassLoader)classLoader; 79 ObjectName loaderName = ucl.getObjectName(); 80 this.classLoader = classLoader; 81 82 this.server = MBeanServerLocator.locateJBoss(); 84 this.controller = (ServiceControllerMBean)JMX.getMBeanProxy(ServiceControllerMBean.class, ServiceControllerMBean.OBJECT_NAME, server); 85 this.mbeans = new LinkedList (); 86 87 InputStream in = null; 89 try 90 { 91 in = servletContext.getResourceAsStream("/WEB-INF/jboss-service.xml"); 92 if(in != null) 93 { 94 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 95 Document doc = builder.parse(in); 96 97 ObjectName bootStrapName = ObjectNameFactory.create("portal:service=BootStrapContext"); 99 NodeList dependsElts = doc.getElementsByTagName("depends"); 100 for (int i = 0;i < dependsElts.getLength();i++) 101 { 102 Element dependsElt = (Element )dependsElts.item(i); 103 String depends = XML.asString(dependsElt).trim(); 104 if (depends.endsWith(":service=BootStrapContext")) 105 { 106 bootStrapName = ObjectNameFactory.create(depends); 108 } 109 } 110 111 BootStrapContext bootStrap = new BootStrapContextImpl(event.getServletContext(), Thread.currentThread().getContextClassLoader()); 113 StandardMBean mbean = new StandardMBean (bootStrap, BootStrapContext.class); 114 registerMBean(mbean, bootStrapName); 115 controller.create(bootStrapName); 116 117 NodeList mbeanElts = doc.getDocumentElement().getElementsByTagName("mbean"); 118 for (int i = 0;i < mbeanElts.getLength();i++) 119 { 120 Element mbeanElt = (Element )mbeanElts.item(i); 121 List installed = controller.install(mbeanElt, loaderName); 122 mbeans.addAll(installed); 123 for (Iterator j = installed.iterator(); j.hasNext();) 124 { 125 ObjectName name = (ObjectName )j.next(); 126 controller.create(name); 127 } 128 } 129 } 130 } 131 catch (SAXException e) 132 { 133 log.error("Cannot parse XML file", e); 134 } 135 catch (ParserConfigurationException e) 136 { 137 log.error("Cannot create a XML parser", e); 138 } 139 catch (Exception e) 140 { 141 log.error("Cannot register an mbean", e); 142 } 143 finally 144 { 145 Tools.safeClose(in); 146 } 147 148 for (Iterator i = mbeans.iterator();i.hasNext();) 150 { 151 ObjectName name = (ObjectName )i.next(); 152 controller.start(name); 153 } 154 } 155 catch (Exception e) 156 { 157 e.printStackTrace(); } 159 } 160 161 public void contextDestroyed(ServletContextEvent event) 162 { 163 log.debug("Starting cleanup"); 165 Collections.reverse(mbeans); 166 remove(controller, mbeans); 167 log.debug("Cleanup finished"); 168 169 servletContext = null; 171 classLoader = null; 172 mbeans = null; 173 controller = null; 174 } 175 176 protected final void registerMBean(Object resource, ObjectName name) throws JMException 177 { 178 server.registerMBean(resource, name); 179 mbeans.add(name); 180 } 181 182 public static void remove(ServiceControllerMBean controller, List mbeans) 183 { 184 try 185 { 186 for (Iterator i = mbeans.iterator(); i.hasNext();) 187 { 188 ObjectName name = (ObjectName )i.next(); 189 controller.stop(name); 190 } 191 for (Iterator i = mbeans.iterator(); i.hasNext();) 192 { 193 ObjectName name = (ObjectName )i.next(); 194 controller.destroy(name); 195 } 196 } 197 catch (Exception e) 198 { 199 e.printStackTrace(); 200 } 201 finally 202 { 203 for (Iterator i = mbeans.iterator(); i.hasNext();) 204 { 205 try 206 { 207 ObjectName name = (ObjectName )i.next(); 208 controller.remove(name); 209 } 210 catch (Exception e) 211 { 212 e.printStackTrace(); 213 } 214 } 215 } 216 } 217 } 218 | Popular Tags |