org.apache.catalina.manager.StatusManagerServlet.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.catalina.manager.StatusManagerServlet.java

Source

/*
 * $Header: /home/cvs/jakarta-tomcat-catalina/webapps/manager/WEB-INF/classes/org/apache/catalina/manager/StatusManagerServlet.java,v 1.12 2003/09/16 15:36:07 remm Exp $
 * $Revision: 1.12 $
 * $Date: 2003/09/16 15:36:07 $
 *
 * ====================================================================
 *
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 1999 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 * [Additional notices, if required by prior licensing conditions]
 *
 */

package org.apache.catalina.manager;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

import javax.management.MBeanServer;
import javax.management.MBeanServerNotification;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.ObjectInstance;
import javax.management.ObjectName;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.modeler.Registry;

import org.apache.catalina.util.ServerInfo;
import org.apache.catalina.util.StringManager;

/**
 * This servlet will display a complete status of the HTTP/1.1 connector.
 *
 * @author Remy Maucherat
 * @version $Revision: 1.12 $ $Date: 2003/09/16 15:36:07 $
 */

public class StatusManagerServlet extends HttpServlet implements NotificationListener {

    // ----------------------------------------------------- Instance Variables

    /**
     * The debugging detail level for this servlet.
     */
    private int debug = 0;

    /**
     * MBean server.
     */
    protected MBeanServer mBeanServer = null;

    /**
     * Vector of protocol handlers object names.
     */
    protected Vector protocolHandlers = new Vector();

    /**
     * Vector of thread pools object names.
     */
    protected Vector threadPools = new Vector();

    /**
     * Vector of request processors object names.
     */
    protected Vector requestProcessors = new Vector();

    /**
     * Vector of global request processors object names.
     */
    protected Vector globalRequestProcessors = new Vector();

    /**
     * The string manager for this package.
     */
    protected static StringManager sm = StringManager.getManager(Constants.Package);

    // --------------------------------------------------------- Public Methods

    /**
     * Initialize this servlet.
     */
    public void init() throws ServletException {

        // Retrieve the MBean server
        mBeanServer = Registry.getServer();

        // Set our properties from the initialization parameters
        String value = null;
        try {
            value = getServletConfig().getInitParameter("debug");
            debug = Integer.parseInt(value);
        } catch (Throwable t) {
            ;
        }

        try {

            // Query protocol handlers
            String onStr = "*:type=ProtocolHandler,*";
            ObjectName objectName = new ObjectName(onStr);
            Set set = mBeanServer.queryMBeans(objectName, null);
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                ObjectInstance oi = (ObjectInstance) iterator.next();
                protocolHandlers.addElement(oi.getObjectName());
            }

            // Query Thread Pools
            onStr = "*:type=ThreadPool,*";
            objectName = new ObjectName(onStr);
            set = mBeanServer.queryMBeans(objectName, null);
            iterator = set.iterator();
            while (iterator.hasNext()) {
                ObjectInstance oi = (ObjectInstance) iterator.next();
                threadPools.addElement(oi.getObjectName());
            }

            // Query Global Request Processors
            onStr = "*:type=GlobalRequestProcessor,*";
            objectName = new ObjectName(onStr);
            set = mBeanServer.queryMBeans(objectName, null);
            iterator = set.iterator();
            while (iterator.hasNext()) {
                ObjectInstance oi = (ObjectInstance) iterator.next();
                globalRequestProcessors.addElement(oi.getObjectName());
            }

            // Query Request Processors
            onStr = "*:type=RequestProcessor,*";
            objectName = new ObjectName(onStr);
            set = mBeanServer.queryMBeans(objectName, null);
            iterator = set.iterator();
            while (iterator.hasNext()) {
                ObjectInstance oi = (ObjectInstance) iterator.next();
                requestProcessors.addElement(oi.getObjectName());
            }

            // Register with MBean server
            onStr = "JMImplementation:type=MBeanServerDelegate";
            objectName = new ObjectName(onStr);
            mBeanServer.addNotificationListener(objectName, this, null, null);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * Finalize this servlet.
     */
    public void destroy() {

        ; // No actions necessary

    }

/**
 * Process a GET request for the specified resource.
 *
 * @param request The servlet request we are processing
 * @param response The servlet response we are creating
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet-specified error occurs
 */
public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws IOException, ServletException {

    // mode is flag for HTML or XML output
    int mode = 0;
    // if ?XML=true, set the mode to XML
    if (request.getParameter("XML") != null 
        && request.getParameter("XML").equals("true")) {
        mode = 1;
    }
    StatusTransformer.setContentType(response, mode);

    PrintWriter writer = response.getWriter();

    boolean completeStatus = false;
    if ((request.getPathInfo() != null) 
        && (request.getPathInfo().equals("/all"))) {
        completeStatus = true;
    }
    // use StatusTransformer to output status
    StatusTransformer.writeHeader(writer,mode);

    // Body Header Section
    Object[] args = new Object[2];
    args[0] = request.getContextPath();
    if (completeStatus) {
        args[1] = sm.getString("statusServlet.complete");
    } else {
        args[1] = sm.getString("statusServlet.title");
    }
    // use StatusTransformer to output status
    StatusTransformer.writeBody(writer,args,mode);

    // Manager Section
    args = new Object[9];
    args[0] = sm.getString("htmlManagerServlet.manager");
    args[1] = response.encodeURL(request.getContextPath() + "/html/list");
    args[2] = sm.getString("htmlManagerServlet.list");
    args[3] = response.encodeURL
        (request.getContextPath() + "/" +
         sm.getString("htmlManagerServlet.helpHtmlManagerFile"));
    args[4] = sm.getString("htmlManagerServlet.helpHtmlManager");
    args[5] = response.encodeURL
        (request.getContextPath() + "/" +
         sm.getString("htmlManagerServlet.helpManagerFile"));
    args[6] = sm.getString("htmlManagerServlet.helpManager");
    if (completeStatus) {
        args[7] = response.encodeURL
            (request.getContextPath() + "/status");
        args[8] = sm.getString("statusServlet.title");
    } else {
        args[7] = response.encodeURL
            (request.getContextPath() + "/status/all");
        args[8] = sm.getString("statusServlet.complete");
    }
    // use StatusTransformer to output status
    StatusTransformer.writeManager(writer,args,mode);

    // Server Header Section
    args = new Object[7];
    args[0] = sm.getString("htmlManagerServlet.serverTitle");
    args[1] = sm.getString("htmlManagerServlet.serverVersion");
    args[2] = sm.getString("htmlManagerServlet.serverJVMVersion");
    args[3] = sm.getString("htmlManagerServlet.serverJVMVendor");
    args[4] = sm.getString("htmlManagerServlet.serverOSName");
    args[5] = sm.getString("htmlManagerServlet.serverOSVersion");
    args[6] = sm.getString("htmlManagerServlet.serverOSArch");
    // use StatusTransformer to output status
    StatusTransformer.writePageHeading(writer,args,mode);

    // Server Row Section
    args = new Object[6];
    args[0] = ServerInfo.getServerInfo();
    args[1] = System.getProperty("java.runtime.version");
    args[2] = System.getProperty("java.vm.vendor");
    args[3] = System.getProperty("os.name");
    args[4] = System.getProperty("os.version");
    args[5] = System.getProperty("os.arch");
    // use StatusTransformer to output status
    StatusTransformer.writeServerInfo(writer, args, mode);

    try {

        // Display virtual machine statistics
        StatusTransformer.writeVMState(writer,mode);

        Enumeration enum = threadPools.elements();
        while (enum.hasMoreElements()) {
            ObjectName objectName = (ObjectName) enum.nextElement();
            String name = objectName.getKeyProperty("name");
            // use StatusTransformer to output status
            StatusTransformer.writeConnectorState
                (writer, objectName,
                 name, mBeanServer, globalRequestProcessors,
                 requestProcessors, mode);
        }

        if ((request.getPathInfo() != null) 
            && (request.getPathInfo().equals("/all"))) {
            // Note: Retrieving the full status is much slower
            // use StatusTransformer to output status
            StatusTransformer.writeDetailedState
                (writer, mBeanServer, mode);
        }

    } catch (Exception e) {
        throw new ServletException(e);
    }

    // use StatusTransformer to output status
    StatusTransformer.writeFooter(writer, mode);

}

    // ------------------------------------------- NotificationListener Methods

    public void handleNotification(Notification notification, java.lang.Object handback) {

        if (notification instanceof MBeanServerNotification) {
            ObjectName objectName = ((MBeanServerNotification) notification).getMBeanName();
            if (notification.getType().equals(MBeanServerNotification.REGISTRATION_NOTIFICATION)) {
                String type = objectName.getKeyProperty("type");
                if (type != null) {
                    if (type.equals("ProtocolHandler")) {
                        protocolHandlers.addElement(objectName);
                    } else if (type.equals("ThreadPool")) {
                        threadPools.addElement(objectName);
                    } else if (type.equals("GlobalRequestProcessor")) {
                        globalRequestProcessors.addElement(objectName);
                    } else if (type.equals("RequestProcessor")) {
                        requestProcessors.addElement(objectName);
                    }
                }
            } else if (notification.getType().equals(MBeanServerNotification.UNREGISTRATION_NOTIFICATION)) {
                String type = objectName.getKeyProperty("type");
                if (type != null) {
                    if (type.equals("ProtocolHandler")) {
                        protocolHandlers.removeElement(objectName);
                    } else if (type.equals("ThreadPool")) {
                        threadPools.removeElement(objectName);
                    } else if (type.equals("GlobalRequestProcessor")) {
                        globalRequestProcessors.removeElement(objectName);
                    } else if (type.equals("RequestProcessor")) {
                        requestProcessors.removeElement(objectName);
                    }
                }
                String j2eeType = objectName.getKeyProperty("j2eeType");
                if (j2eeType != null) {

                }
            }
        }

    }

}