craigmcc 02/04/26 22:09:03 Modified: catalina/src/share/org/apache/catalina/mbeans StandardServerMBean.java mbeans-descriptors.xml Log: Switch to using the Catalina component tree directly for all persistence operations -- since we will need this for components that are not reflected as MBeans directly anyway, it's better to be consistent. This still leaves a few FIXMEs, but for the most part a running Catalina configuration is faithfully recorded into a conf/server.xml.new file that would (if renamed) reproduce the same configuration after a restart. Revision Changes Path 1.10 +532 -210 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/StandardServerMBean.java Index: StandardServerMBean.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/StandardServerMBean.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- StandardServerMBean.java 26 Apr 2002 17:40:50 -0000 1.9 +++ StandardServerMBean.java 27 Apr 2002 05:09:03 -0000 1.10 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/StandardServerMBean.java,v 1.9 2002/04/26 17:40:50 craigmcc Exp $ - * $Revision: 1.9 $ - * $Date: 2002/04/26 17:40:50 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/StandardServerMBean.java,v 1.10 2002/04/27 05:09:03 craigmcc Exp $ + * $Revision: 1.10 $ + * $Date: 2002/04/27 05:09:03 $ * * ==================================================================== * @@ -64,6 +64,8 @@ package org.apache.catalina.mbeans; +import java.beans.IndexedPropertyDescriptor; +import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -76,8 +78,25 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.RuntimeOperationsException; +import org.apache.catalina.Connector; +import org.apache.catalina.Container; +import org.apache.catalina.Context; +import org.apache.catalina.Engine; +import org.apache.catalina.Host; +import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleListener; +import org.apache.catalina.Loader; +import org.apache.catalina.Logger; +import org.apache.catalina.Manager; +import org.apache.catalina.Pipeline; +import org.apache.catalina.Realm; import org.apache.catalina.Server; -import org.apache.catalina.core.StandardServer; +import org.apache.catalina.ServerFactory; +import org.apache.catalina.Service; +import org.apache.catalina.Store; +import org.apache.catalina.Valve; +import org.apache.catalina.net.ServerSocketFactory; +import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.modeler.BaseModelMBean; @@ -86,17 +105,74 @@ * <code>org.apache.catalina.core.StandardServer</code> component.</p> * * @author Amy Roh - * @version $Revision: 1.9 $ $Date: 2002/04/26 17:40:50 $ + * @version $Revision: 1.10 $ $Date: 2002/04/27 05:09:03 $ */ public class StandardServerMBean extends BaseModelMBean { + + // ------------------------------------------------------- Static Variables + + /** * The <code>MBeanServer</code> for this application. */ private static MBeanServer mserver = MBeanUtils.createServer(); + /** + * The set of class/property combinations that should <strong>NOT</strong> + * be persisted because they are automatically calculated. + */ + private static String exceptions[][] = { + { "org.apache.catalina.core.StandardContext", "configured" }, + { "org.apache.catalina.core.StandardContext", "publicId" }, + { "org.apache.catalina.core.StandardContext", "workDir" }, + { "org.apache.catalina.session.StandardManager", "distributable" }, + { "org.apache.catalina.session.StandardManager", "entropy" }, + }; + + + /** + * The set of classes that represent persistable properties. + */ + private static Class persistables[] = { + String.class, + Integer.class, Integer.TYPE, + Boolean.class, Boolean.TYPE, + Byte.class, Byte.TYPE, + Character.class, Character.TYPE, + Double.class, Double.TYPE, + Float.class, Float.TYPE, + Long.class, Long.TYPE, + Short.class, Short.TYPE, + }; + + + /** + * The set of class names that should be skipped when persisting state, + * because the corresponding listeners, valves, etc. are configured + * automatically at startup time. + */ + private static String skippables[] = { + "org.apache.catalina.authenticator.BasicAuthenticator", + "org.apache.catalina.authenticator.DigestAuthenticator", + "org.apache.catalina.authenticator.FormAuthenticator", + "org.apache.catalina.authenticator.NonLoginAuthenticator", + "org.apache.catalina.authenticator.SSLAuthenticator", + "org.apache.catalina.core.NamingContextListener", + "org.apache.catalina.core.StandardContextValve", + "org.apache.catalina.core.StandardEngineValve", + "org.apache.catalina.core.StandardHostValve", + "org.apache.catalina.startup.ContextConfig", + "org.apache.catalina.startup.EngineConfig", + "org.apache.catalina.startup.HostConfig", + "org.apache.catalina.valves.CertificatesValve", + "org.apache.catalina.valves.ErrorDispatcherValve", + "org.apache.catalina.valves.ErrorReportValve", + }; + + // ----------------------------------------------------------- Constructors @@ -199,10 +275,7 @@ // (which will recursively store everything ObjectName oname = null; try { - oname = - MBeanUtils.createObjectName("Catalina", - (Server) getManagedResource()); - storeServer(writer, 0, oname); + storeServer(writer, 0, ServerFactory.getServer()); } catch (Exception e) { if (writer != null) { try { @@ -234,57 +307,136 @@ /** - * Store the relevant attributes of the specified MBean. + * Is the specified class name + property name combination an + * exception that should not be persisted? + * + * @param className The class name to check + * @param property The property name to check + */ + private boolean isException(String className, String property) { + + for (int i = 0; i < exceptions.length; i++) { + if (className.equals(exceptions[i][0]) && + property.equals(exceptions[i][1])) { + return (true); + } + } + return (false); + + } + + + /** + * Is the specified property type one for which we should generate + * a persistence attribute? + * + * @param clazz Java class to be tested + */ + private boolean isPersistable(Class clazz) { + + for (int i = 0; i < persistables.length; i++) { + if (persistables[i] == clazz) { + return (true); + } + } + return (false); + + } + + + /** + * Is the specified class name one that should be skipped because + * the corresponding component is configured automatically at + * startup time? + * + * @param className Class name to be tested + */ + private boolean isSkippable(String className) { + + for (int i = 0; i < skippables.length; i++) { + if (skippables[i] == className) { + return (true); + } + } + return (false); + + } + + + /** + * Store the relevant attributes of the specified JavaBean, plus a + * <code>className</code> attribute defining the fully qualified + * Java class name of the bean. * * @param writer PrintWriter to which we are storing - * @param oname ObjectName of the MBean for the object we are storing + * @param bean Bean whose properties are to be rendered as attributes, * * @exception Exception if an exception occurs while storing */ private void storeAttributes(PrintWriter writer, - ObjectName oname) throws Exception { + Object bean) throws Exception { + + storeAttributes(writer, true, bean); + + } + + + /** + * Store the relevant attributes of the specified JavaBean. + * + * @param writer PrintWriter to which we are storing + * @param include Should we include a <code>className</code> attribute? + * @param bean Bean whose properties are to be rendered as attributes, + * + * @exception Exception if an exception occurs while storing + */ + private void storeAttributes(PrintWriter writer, boolean include, + Object bean) throws Exception { - // Acquire the set of attributes we should be saving - MBeanInfo minfo = mserver.getMBeanInfo(oname); - MBeanAttributeInfo ainfo[] = minfo.getAttributes(); - if (ainfo == null) { - ainfo = new MBeanAttributeInfo[0]; + // Render a className attribute if requested + if (include) { + writer.print(" className=\""); + writer.print(bean.getClass().getName()); + writer.print("\""); } - // Save the value of each relevant attribute - for (int i = 0; i < ainfo.length; i++) { + // Acquire the list of properties for this bean + PropertyDescriptor descriptors[] = + PropertyUtils.getPropertyDescriptors(bean); + if (descriptors == null) { + descriptors = new PropertyDescriptor[0]; + } - // Make sure this is an attribute we want to save - String aname = ainfo[i].getName(); - if ("managedResource".equals(aname)) { - continue; // KLUDGE - these should be removed + // Render the relevant properties of this bean + String className = bean.getClass().getName(); + for (int i = 0; i < descriptors.length; i++) { + if (descriptors[i] instanceof IndexedPropertyDescriptor) { + continue; // Indexed properties are not persisted } - if (!ainfo[i].isReadable()) { - continue; // We cannot read the current value + if (!isPersistable(descriptors[i].getPropertyType()) || + (descriptors[i].getReadMethod() == null) || + (descriptors[i].getWriteMethod() == null)) { + continue; // Must be a read-write primitive or String } - if (!"className".equals(aname) && !ainfo[i].isWritable()) { - continue; // We will not be able to configure this attribute - } - - // Acquire the value of this attribute - Object value = mserver.getAttribute(oname, aname); + Object value = + PropertyUtils.getSimpleProperty(bean, + descriptors[i].getName()); if (value == null) { - continue; // No need to explicitly record this + continue; // Null values are not persisted + } + if (isException(className, descriptors[i].getName())) { + continue; // Skip the specified exceptions } if (!(value instanceof String)) { value = value.toString(); } - - // Add this attribute value to our output - writer.print(" "); - writer.print(aname); + writer.print(' '); + writer.print(descriptors[i].getName()); writer.print("=\""); writer.print((String) value); writer.print("\""); - } - } @@ -293,26 +445,38 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param connector Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeConnector(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Connector connector) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Connector"); - storeAttributes(writer, oname); + storeAttributes(writer, connector); writer.println(">"); - // Store nested <Listener> elements - ; // FIXME - // Store nested <Factory> element - ; // FIXME + ServerSocketFactory factory = connector.getFactory(); + if (factory != null) { + storeFactory(writer, indent + 2, factory); + } + + // Store nested <Listener> elements + if (connector instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) connector).findLifecycleListeners(); + if (listeners == null) { + listeners = new LifecycleListener[0]; + } + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store the ending of this element for (int i = 0; i < indent; i++) { @@ -328,76 +492,85 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param context Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeContext(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Context context) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Context"); - storeAttributes(writer, oname); + storeAttributes(writer, context); writer.println(">"); // Store nested <InstanceListener> elements ; // FIXME // Store nested <Listener> elements - ; // FIXME + if (context instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) context).findLifecycleListeners(); + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store nested <Loader> element - ; // FIXME + Loader loader = context.getLoader(); + if (loader != null) { + storeLoader(writer, indent + 2, loader); + } // Store nested <Logger> element - StringBuffer loggerSearch = - new StringBuffer("Catalina:type=Logger,path="); - loggerSearch.append(oname.getKeyProperty("path")); - loggerSearch.append(",host="); - loggerSearch.append(oname.getKeyProperty("host")); - loggerSearch.append(",service="); - loggerSearch.append(oname.getKeyProperty("service")); - ObjectName loggerQuery = new ObjectName(loggerSearch.toString()); - Iterator loggerNames = - mserver.queryNames(loggerQuery, null).iterator(); - while (loggerNames.hasNext()) { - storeLogger(writer, indent + 2, - (ObjectName) loggerNames.next()); + Logger logger = context.getLogger(); + if (logger != null) { + Logger parentLogger = null; + if (context.getParent() != null) { + parentLogger = context.getParent().getLogger(); + } + if (logger != parentLogger) { + storeLogger(writer, indent + 2, logger); + } } // Store nested <Manager> element - ; // FIXME + Manager manager = context.getManager(); + if (manager != null) { + storeManager(writer, indent + 2, manager); + } // Store nested <Parameter> elements ; // FIXME // Store nested <Realm> element - StringBuffer realmSearch = - new StringBuffer("Catalina:type=Realm,path="); - realmSearch.append(oname.getKeyProperty("path")); - realmSearch.append(",host="); - realmSearch.append(oname.getKeyProperty("host")); - realmSearch.append(",service="); - realmSearch.append(oname.getKeyProperty("service")); - ObjectName realmQuery = new ObjectName(realmSearch.toString()); - Iterator realmNames = - mserver.queryNames(realmQuery, null).iterator(); - while (realmNames.hasNext()) { - storeRealm(writer, indent + 2, - (ObjectName) realmNames.next()); + Realm realm = context.getRealm(); + if (realm != null) { + Realm parentRealm = null; + if (context.getParent() != null) { + parentRealm = context.getParent().getRealm(); + } + if (realm != parentRealm) { + storeRealm(writer, indent + 2, realm); + } } - // Store nested <ResourceLink> elements + // Store nested <ResourceLink> elements (and resource params?) ; // FIXME // Store nested <Resources> element ; // FIXME // Store nested <Valve> elements - ; // FIXME + if (context instanceof Pipeline) { + Valve valves[] = ((Pipeline) context).getValves(); + for (int i = 0; i < valves.length; i++) { + storeValve(writer, indent + 2, valves[i]); + } + } // Store nested <WrapperLifecycle> elements ; // FIXME @@ -419,19 +592,19 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param engine Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeEngine(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Engine engine) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Engine"); - storeAttributes(writer, oname); + storeAttributes(writer, engine); writer.println(">"); // Store nested <Default> element @@ -440,48 +613,58 @@ // Store nested <DefaultContext> element ; // FIXME - // Store nested <Host> elements - StringBuffer hostSearch = - new StringBuffer("Catalina:type=Host,service="); - hostSearch.append(oname.getKeyProperty("service")); - hostSearch.append(",*"); - ObjectName hostQuery = new ObjectName(hostSearch.toString()); - Iterator hostNames = - mserver.queryNames(hostQuery, null).iterator(); - while (hostNames.hasNext()) { - storeHost(writer, indent + 2, - (ObjectName) hostNames.next()); + // Store nested <Host> elements (or other relevant containers) + Container children[] = engine.findChildren(); + for (int i = 0; i < children.length; i++) { + if (children[i] instanceof Context) { + storeContext(writer, indent + 2, (Context) children[i]); + } else if (children[i] instanceof Engine) { + storeEngine(writer, indent + 2, (Engine) children[i]); + } else if (children[i] instanceof Host) { + storeHost(writer, indent + 2, (Host) children[i]); + } } // Store nested <Listener> elements - ; // FIXME + if (engine instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) engine).findLifecycleListeners(); + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store nested <Logger> element - StringBuffer loggerSearch = - new StringBuffer("Catalina:type=Logger,service="); - loggerSearch.append(oname.getKeyProperty("service")); - ObjectName loggerQuery = new ObjectName(loggerSearch.toString()); - Iterator loggerNames = - mserver.queryNames(loggerQuery, null).iterator(); - while (loggerNames.hasNext()) { - storeLogger(writer, indent + 2, - (ObjectName) loggerNames.next()); + Logger logger = engine.getLogger(); + if (logger != null) { + Logger parentLogger = null; + if (engine.getParent() != null) { + parentLogger = engine.getParent().getLogger(); + } + if (logger != parentLogger) { + storeLogger(writer, indent + 2, logger); + } } // Store nested <Realm> element - StringBuffer realmSearch = - new StringBuffer("Catalina:type=Realm,service="); - realmSearch.append(oname.getKeyProperty("service")); - ObjectName realmQuery = new ObjectName(realmSearch.toString()); - Iterator realmNames = - mserver.queryNames(realmQuery, null).iterator(); - while (realmNames.hasNext()) { - storeRealm(writer, indent + 2, - (ObjectName) realmNames.next()); + Realm realm = engine.getRealm(); + if (realm != null) { + Realm parentRealm = null; + if (engine.getParent() != null) { + parentRealm = engine.getParent().getRealm(); + } + if (realm != parentRealm) { + storeRealm(writer, indent + 2, realm); + } } // Store nested <Valve> elements - ; // FIXME + if (engine instanceof Pipeline) { + Valve valves[] = ((Pipeline) engine).getValves(); + for (int i = 0; i < valves.length; i++) { + storeValve(writer, indent + 2, valves[i]); + } + } // Store the ending of this element for (int i = 0; i < indent; i++) { @@ -493,46 +676,65 @@ /** + * Store the specified ServerSocketFactory properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param factory Object whose properties are being stored + * + * @exception Exception if an exception occurs while storing + */ + private void storeFactory(PrintWriter writer, int indent, + ServerSocketFactory factory) throws Exception { + + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Factory"); + storeAttributes(writer, factory); + writer.println("/>"); + + } + + + /** * Store the specified Host properties. * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param host Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeHost(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Host host) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Host"); - storeAttributes(writer, oname); + storeAttributes(writer, host); writer.println(">"); // Store nested <Alias> elements ; // FIXME - // Store nested <Context> elements - StringBuffer contextSearch = - new StringBuffer("Catalina:type=Context,host="); - contextSearch.append(oname.getKeyProperty("host")); - contextSearch.append(",service="); - contextSearch.append(oname.getKeyProperty("service")); - contextSearch.append(",*"); - ObjectName contextQuery = new ObjectName(contextSearch.toString()); - Iterator contextNames = - mserver.queryNames(contextQuery, null).iterator(); - while (contextNames.hasNext()) { - storeContext(writer, indent + 2, - (ObjectName) contextNames.next()); - } - // Store nested <Cluster> elements ; // FIXME + // Store nested <Context> elements (or other relevant containers) + Container children[] = host.findChildren(); + for (int i = 0; i < children.length; i++) { + if (children[i] instanceof Context) { + storeContext(writer, indent + 2, (Context) children[i]); + } else if (children[i] instanceof Engine) { + storeEngine(writer, indent + 2, (Engine) children[i]); + } else if (children[i] instanceof Host) { + storeHost(writer, indent + 2, (Host) children[i]); + } + } + // Store nested <Default> element ; // FIXME @@ -540,38 +742,45 @@ ; // FIXME // Store nested <Listener> elements - ; // FIXME + if (host instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) host).findLifecycleListeners(); + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store nested <Logger> element - StringBuffer loggerSearch = - new StringBuffer("Catalina:type=Logger,host="); - loggerSearch.append(oname.getKeyProperty("host")); - loggerSearch.append(",service="); - loggerSearch.append(oname.getKeyProperty("service")); - ObjectName loggerQuery = new ObjectName(loggerSearch.toString()); - Iterator loggerNames = - mserver.queryNames(loggerQuery, null).iterator(); - while (loggerNames.hasNext()) { - storeLogger(writer, indent + 2, - (ObjectName) loggerNames.next()); + Logger logger = host.getLogger(); + if (logger != null) { + Logger parentLogger = null; + if (host.getParent() != null) { + parentLogger = host.getParent().getLogger(); + } + if (logger != parentLogger) { + storeLogger(writer, indent + 2, logger); + } } // Store nested <Realm> element - StringBuffer realmSearch = - new StringBuffer("Catalina:type=Realm,host="); - realmSearch.append(oname.getKeyProperty("host")); - realmSearch.append(",service="); - realmSearch.append(oname.getKeyProperty("service")); - ObjectName realmQuery = new ObjectName(realmSearch.toString()); - Iterator realmNames = - mserver.queryNames(realmQuery, null).iterator(); - while (realmNames.hasNext()) { - storeRealm(writer, indent + 2, - (ObjectName) realmNames.next()); + Realm realm = host.getRealm(); + if (realm != null) { + Realm parentRealm = null; + if (host.getParent() != null) { + parentRealm = host.getParent().getRealm(); + } + if (realm != parentRealm) { + storeRealm(writer, indent + 2, realm); + } } // Store nested <Valve> elements - ; // FIXME + if (host instanceof Pipeline) { + Valve valves[] = ((Pipeline) host).getValves(); + for (int i = 0; i < valves.length; i++) { + storeValve(writer, indent + 2, valves[i]); + } + } // Store the ending of this element for (int i = 0; i < indent; i++) { @@ -583,30 +792,103 @@ /** + * Store the specified Listener properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param listener Object whose properties are being stored + * + * @exception Exception if an exception occurs while storing + */ + private void storeListener(PrintWriter writer, int indent, + LifecycleListener listener) throws Exception { + + if (isSkippable(listener.getClass().getName())) { + return; + } + + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Listener"); + storeAttributes(writer, listener); + writer.println("/>"); + + } + + + /** + * Store the specified Loader properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param loader Object whose properties are being stored + * + * @exception Exception if an exception occurs while storing + */ + private void storeLoader(PrintWriter writer, int indent, + Loader loader) throws Exception { + + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Loader"); + storeAttributes(writer, loader); + writer.println("/>"); + + } + + + /** * Store the specified Logger properties. * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param logger Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeLogger(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Logger logger) throws Exception { - // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Logger"); - storeAttributes(writer, oname); + storeAttributes(writer, logger); + writer.println("/>"); + + } + + + /** + * Store the specified Manager properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param manager Object whose properties are being stored + * + * @exception Exception if an exception occurs while storing + */ + private void storeManager(PrintWriter writer, int indent, + Manager manager) throws Exception { + + // Store the beginning of this element + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Manager"); + storeAttributes(writer, manager); writer.println(">"); + // Store nested <Store> element + ; // FIXME + // Store the ending of this element for (int i = 0; i < indent; i++) { writer.print(' '); } - writer.println("</Logger>"); + writer.println("</Manager>"); } @@ -616,26 +898,19 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param realm Object whose properties are being stored * * @exception Exception if an exception occurs while storing */ private void storeRealm(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Realm realm) throws Exception { - // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Realm"); - storeAttributes(writer, oname); - writer.println(">"); - - // Store the ending of this element - for (int i = 0; i < indent; i++) { - writer.print(' '); - } - writer.println("</Realm>"); + storeAttributes(writer, realm); + writer.println("/>"); } @@ -645,36 +920,37 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param server Object to be stored * * @exception Exception if an exception occurs while storing */ private void storeServer(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Server server) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Server"); - storeAttributes(writer, oname); + storeAttributes(writer, server); writer.println(">"); // Store nested <GlobalNamingResources> element ; // FIXME // Store nested <Listener> elements - ; // FIXME + if (server instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) server).findLifecycleListeners(); + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store nested <Service> elements - StringBuffer serviceSearch = - new StringBuffer("Catalina:type=Service,*"); - ObjectName serviceQuery = new ObjectName(serviceSearch.toString()); - Iterator serviceNames = - mserver.queryNames(serviceQuery, null).iterator(); - while (serviceNames.hasNext()) { - storeService(writer, indent + 2, - (ObjectName) serviceNames.next()); + Service services[] = server.findServices(); + for (int i = 0; i < services.length; i++) { + storeService(writer, indent + 2, services[i]); } // Store the ending of this element @@ -691,55 +967,101 @@ * * @param writer PrintWriter to which we are storing * @param indent Number of spaces to indent this element - * @param oname ObjectName of the MBean for the object we are storing + * @param server Object to be stored * * @exception Exception if an exception occurs while storing */ private void storeService(PrintWriter writer, int indent, - ObjectName oname) throws Exception { + Service service) throws Exception { // Store the beginning of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.print("<Service"); - storeAttributes(writer, oname); + storeAttributes(writer, service); writer.println(">"); // Store nested <Connector> elements - StringBuffer connectorSearch = - new StringBuffer("Catalina:type=Connector,service="); - connectorSearch.append(oname.getKeyProperty("name")); - connectorSearch.append(",*"); - ObjectName connectorQuery = new ObjectName(connectorSearch.toString()); - Iterator connectorNames = - mserver.queryNames(connectorQuery, null).iterator(); - while (connectorNames.hasNext()) { - storeConnector(writer, indent + 2, - (ObjectName) connectorNames.next()); - } - - // Store nested <Engine> element - StringBuffer engineSearch = - new StringBuffer("Catalina:type=Engine,service="); - engineSearch.append(oname.getKeyProperty("name")); - engineSearch.append(",*"); - ObjectName engineQuery = new ObjectName(engineSearch.toString()); - Iterator engineNames = - mserver.queryNames(engineQuery, null).iterator(); - while (engineNames.hasNext()) { - storeEngine(writer, indent + 2, - (ObjectName) engineNames.next()); + Connector connectors[] = service.findConnectors(); + for (int i = 0; i < connectors.length; i++) { + storeConnector(writer, indent + 2, connectors[i]); + } + + // Store nested <Engine> element (or other appropriate container) + Container container = service.getContainer(); + if (container != null) { + if (container instanceof Context) { + storeContext(writer, indent + 2, (Context) container); + } else if (container instanceof Engine) { + storeEngine(writer, indent + 2, (Engine) container); + } else if (container instanceof Host) { + storeHost(writer, indent + 2, (Host) container); + } } // Store nested <Listener> elements - ; // FIXME + if (service instanceof Lifecycle) { + LifecycleListener listeners[] = + ((Lifecycle) service).findLifecycleListeners(); + for (int i = 0; i < listeners.length; i++) { + storeListener(writer, indent + 2, listeners[i]); + } + } // Store the ending of this element for (int i = 0; i < indent; i++) { writer.print(' '); } writer.println("</Service>"); + + } + + + /** + * Store the specified Store properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param store Object whose properties are being stored + * + * @exception Exception if an exception occurs while storing + */ + private void storeStore(PrintWriter writer, int indent, + Store store) throws Exception { + + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Store"); + storeAttributes(writer, store); + writer.println("/>"); + + } + + + /** + * Store the specified Valve properties. + * + * @param writer PrintWriter to which we are storing + * @param indent Number of spaces to indent this element + * @param valve Object whose properties are being valved + * + * @exception Exception if an exception occurs while storing + */ + private void storeValve(PrintWriter writer, int indent, + Valve valve) throws Exception { + + if (isSkippable(valve.getClass().getName())) { + return; + } + + for (int i = 0; i < indent; i++) { + writer.print(' '); + } + writer.print("<Valve"); + storeAttributes(writer, valve); + writer.println("/>"); } 1.48 +13 -2 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml Index: mbeans-descriptors.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/mbeans/mbeans-descriptors.xml,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- mbeans-descriptors.xml 26 Apr 2002 17:40:50 -0000 1.47 +++ mbeans-descriptors.xml 27 Apr 2002 05:09:03 -0000 1.48 @@ -6,7 +6,7 @@ <!-- Descriptions of JMX MBeans for Catalina - $Id: mbeans-descriptors.xml,v 1.47 2002/04/26 17:40:50 craigmcc Exp $ + $Id: mbeans-descriptors.xml,v 1.48 2002/04/27 05:09:03 craigmcc Exp $ --> <mbeans-descriptors> @@ -1996,7 +1996,7 @@ <mbean name="StandardManager" - className="org.apache.catalina.mbeans.ClassNameMBean" + className="org.apache.catalina.mbeans.ClassNameMBean" description="Standard implementation of the Manager interface" domain="Catalina" group="Manager" @@ -2012,6 +2012,11 @@ sessions" type="int"/> + <attribute name="className" + description="Fully qualified class name of the managed object" + type="java.lang.String" + writeable="false"/> + <attribute name="debug" description="The debugging detail level for this component" type="int"/> @@ -2282,6 +2287,7 @@ <mbean name="WebappLoader" + className="org.apache.catalina.mbeans.ClassNameMBean" description="Classloader implementation which is specialized for handling web applications" domain="Catalina" @@ -2292,6 +2298,11 @@ description="The number of seconds between checks for modified classes" type="int"/> + + <attribute name="className" + description="Fully qualified class name of the managed object" + type="java.lang.String" + writeable="false"/> <attribute name="debug" description="The debugging detail level for this component"
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>