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]>

Reply via email to