import java.util.Hashtable;
+import java.util.Set;
import javax.management.DynamicMBean;
import javax.management.MBeanException;
import org.apache.catalina.deploy.ContextResourceLink;
import org.apache.catalina.deploy.NamingResources;
import org.apache.catalina.valves.ValveBase;
+import org.apache.coyote.ProtocolHandler;
+import org.apache.coyote.ajp.AjpAprProtocol;
+import org.apache.coyote.ajp.AjpProtocol;
+import org.apache.coyote.http11.Http11AprProtocol;
+import org.apache.coyote.http11.Http11NioProtocol;
+import org.apache.coyote.http11.Http11Protocol;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.IntrospectionUtils;
throws MalformedObjectNameException {
ObjectName name = null;
- if (connector.getClass().getName().indexOf("CoyoteConnector") >= 0 ) {
- try {
- String address = (String)
- IntrospectionUtils.getProperty(connector, "address");
- Integer port = (Integer)
- IntrospectionUtils.getProperty(connector, "port");
- StringBuffer sb = new StringBuffer(domain);
- sb.append(":type=Connector");
- sb.append(",port=" + port);
- if ((address != null) && (address.length()>0)) {
- sb.append(",address=" + address);
- }
- name = new ObjectName(sb.toString());
- return (name);
- } catch (Exception e) {
- throw new MalformedObjectNameException
- ("Cannot create object name for " + connector+e);
+ try {
+ String address = (String)
+ IntrospectionUtils.getProperty(connector, "address");
+ Integer port = (Integer)
+ IntrospectionUtils.getProperty(connector, "port");
+ StringBuffer sb = new StringBuffer(domain);
+ sb.append(":type=Connector");
+ sb.append(",port=" + port);
+ if ((address != null) && (address.length()>0)) {
+ sb.append(",address=" + address);
}
- } else {
+ name = new ObjectName(sb.toString());
+ return (name);
+ } catch (Exception e) {
throw new MalformedObjectNameException
- ("Cannot create object name for " + connector);
+ ("Cannot create object name for " + connector+e);
}
-
}
static void destroyMBean(Connector connector, Service service)
throws Exception {
- connector.setService(service);
- String mname = createManagedName(connector);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ // domain is engine name
+ String domain = service.getContainer().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, connector);
if( mserver.isRegistered( oname )) {
mserver.unregisterMBean(oname);
}
+ // Unregister associated request processor
+ String worker = null;
+ ProtocolHandler handler = connector.getProtocolHandler();
+ if (handler instanceof Http11Protocol) {
+ worker = ((Http11Protocol)handler).getName();
+ } else if (handler instanceof Http11NioProtocol) {
+ worker = ((Http11NioProtocol)handler).getName();
+ } else if (handler instanceof Http11AprProtocol) {
+ worker = ((Http11AprProtocol)handler).getName();
+ } else if (handler instanceof AjpProtocol) {
+ worker = ((AjpProtocol)handler).getName();
+ } else if (handler instanceof AjpAprProtocol) {
+ worker = ((AjpAprProtocol)handler).getName();
+ }
+ ObjectName query = new ObjectName(
+ domain + ":type=RequestProcessor,worker=" + worker + ",*");
+ Set<ObjectName> results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
}
static void destroyMBean(Context context)
throws Exception {
- String mname = createManagedName(context);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = context.getParent().getParent().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, context);
static void destroyMBean(ContextResource resource)
throws Exception {
+ // If this is a user database resource need to destroy groups, roles,
+ // users and UserDatabase mbean
+ if ("org.apache.catalina.UserDatabase".equals(resource.getType())) {
+ destroyMBeanUserDatabase(resource.getName());
+ }
+
String mname = createManagedName(resource);
ManagedBean managed = registry.findManagedBean(mname);
if (managed == null) {
*/
static void destroyMBean(Engine engine)
throws Exception {
-
- String mname = createManagedName(engine);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = engine.getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, engine);
static void destroyMBean(Host host)
throws Exception {
- String mname = createManagedName(host);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = host.getParent().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, host);
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, resources);
- if( mserver.isRegistered(oname) )
+ if( mserver.isRegistered(oname) )
mserver.unregisterMBean(oname);
}
ObjectName oname = createObjectName(domain, server);
if( mserver.isRegistered(oname) )
mserver.unregisterMBean(oname);
+
+ // Global String cache - fixed name
+ oname = new ObjectName("Catalina:type=StringCache");
+ if( mserver.isRegistered(oname) )
+ mserver.unregisterMBean(oname);
+
+ // MBean Factory - fixed name
+ oname = new ObjectName("Catalina:type=MBeanFactory");
+ if( mserver.isRegistered(oname) )
+ mserver.unregisterMBean(oname);
}
/**
+ * Deregister the MBean for the
+ * <code>UserDatabase</code> object with this name.
+ *
+ * @param userDatabase The UserDatabase to be managed
+ *
+ * @exception Exception if an MBean cannot be deregistered
+ */
+ static void destroyMBeanUserDatabase(String userDatabase)
+ throws Exception {
+
+ ObjectName query = null;
+ Set<ObjectName> results = null;
+
+ // Groups
+ query = new ObjectName(
+ "Users:type=Group,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // Roles
+ query = new ObjectName(
+ "Users:type=Role,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // Users
+ query = new ObjectName(
+ "Users:type=User,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // The database itself
+ ObjectName db = new ObjectName(
+ "Users:type=UserDatabase,database=" + userDatabase);
+ mserver.unregisterMBean(db);
+ }
+
+
+ /**
* Deregister the MBean for this
* <code>Valve</code> object.
*
createMBeans();
*/
- } else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
+ } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
try {
if (lifecycle instanceof Server) {
destroyMBeans((Server)lifecycle);
*/
protected void createMBeans(Service service) throws Exception {
- // Create the MBean for the Service itself
- if (log.isDebugEnabled())
- log.debug("Creating MBean for Service " + service);
- //MBeanUtils.createMBean(service);
if (service instanceof StandardService) {
((StandardService) service).addPropertyChangeListener(this);
}
protected void destroyMBeans(Connector connector, Service service)
throws Exception {
-// // deregister the MBean for the Connector itself
-// if (log.isDebugEnabled())
-// log.debug("Destroying MBean for Connector " + connector);
-// MBeanUtils.destroyMBean(connector, service);
+ // deregister the MBean for the Connector itself
+ if (log.isDebugEnabled())
+ log.debug("Destroying MBean for Connector " + connector);
+ MBeanUtils.destroyMBean(connector, service);
}
// deregister the MBean for the Context itself
if (log.isDebugEnabled())
log.debug("Destroying MBean for Context " + context);
- //MBeanUtils.destroyMBean(context);
+ MBeanUtils.destroyMBean(context);
if (context instanceof StandardContext) {
((StandardContext) context).
removePropertyChangeListener(this);
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Engine " + engine);
}
- //MBeanUtils.destroyMBean(engine);
+ MBeanUtils.destroyMBean(engine);
}
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Host " + host);
}
- //MBeanUtils.destroyMBean(host);
+ MBeanUtils.destroyMBean(host);
}
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Server " + server);
}
- //MBeanUtils.destroyMBean(server);
+ MBeanUtils.destroyMBean(server);
if (server instanceof StandardServer) {
((StandardServer) server).removePropertyChangeListener(this);
}
// Deregister the MBeans for the associated Engine
Engine engine = (Engine) service.getContainer();
if (engine != null) {
- //destroyMBeans(engine);
+ destroyMBeans(engine);
}
-// // Deregister the MBeans for the corresponding Connectors
-// Connector connectors[] = service.findConnectors();
-// for (int j = 0; j < connectors.length; j++) {
-// destroyMBeans(connectors[j], service);
-// }
-
- // Deregister the MBean for the Service itself
- if (log.isDebugEnabled()) {
- log.debug("Destroying MBean for Service " + service);
+ // Deregister the MBeans for the corresponding Connectors
+ Connector connectors[] = service.findConnectors();
+ for (int j = 0; j < connectors.length; j++) {
+ destroyMBeans(connectors[j], service);
}
- //MBeanUtils.destroyMBean(service);
+
if (service instanceof StandardService) {
((StandardService) service).removePropertyChangeListener(this);
}