FileDocCategorySizeDatePackage
DebugBean.javaAPI DocExample16648Thu Jun 28 16:14:16 BST 2001com.ora.jsp.util

DebugBean.java

package com.ora.jsp.util;

import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

/**
 * This class is a bean that can be used to extract debug
 * information from a JSP PageContext. The debug info is
 * sent to the browser, System.out, and the servlet log
 * file, depending on the value of the "debug" request
 * parameter sent with the request for the JSP page:
 * "resp", "stdout" and "log". The values can be combined to
 * get the information directed to multiple targets.
 *
 * @author Hans Bergsten, Gefion software <hans@gefionsoftware.com>
 * @version 1.0.1
 */
public class DebugBean {
    static private final String LINE_FEED = System.getProperty("line.separator");
    private PageContext pageContext;
    private long startTime;
    private String debugType;
    private ServletContext context;
    
    /**
     * Creates an instance and initializes the timer.
     */
    public DebugBean() {
        startTime = System.currentTimeMillis();
    }
    
    /**
     * Sets the pageContext property.
     */
    public void setPageContext(PageContext pageContext) {
        this.pageContext = pageContext;
    }
    
    /**
     * Returns a String with the number of milliseconds that
     * has passed since the bean was created or the last time
     * this method was called.
     */
    public String getElapsedTime() {
        String elapsedTime = 
            new Long(System.currentTimeMillis() - startTime).toString() + 
                " ms";
        startTime = System.currentTimeMillis();
        return handleMsg("elapsedTime", elapsedTime);
    }
    
    /**
     * Returns a String with all basic request information.
     */
    public String getRequestInfo() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        info.put("authType", nullToString(req.getAuthType()));
        info.put("characterEncoding", nullToString(req.getCharacterEncoding()));
        info.put("contentLength", new Integer(req.getContentLength()).toString());
        info.put("contentType", nullToString(req.getContentType()));
        info.put("contextPath", nullToString(req.getContextPath()));
        info.put("pathInfo", nullToString(req.getPathInfo()));
        info.put("protocol", nullToString(req.getProtocol()));
        info.put("queryString", nullToString(req.getQueryString()));
        info.put("remoteAddr", nullToString(req.getRemoteAddr()));
        info.put("remoteHost", nullToString(req.getRemoteHost()));
        info.put("remoteUser", nullToString(req.getRemoteUser()));
        info.put("requestURI", nullToString(req.getRequestURI()));
        info.put("scheme", nullToString(req.getScheme()));
        info.put("serverName", nullToString(req.getServerName()));
        info.put("serverPort", new Integer(req.getServerPort()).toString());
        info.put("servletPath", nullToString(req.getServletPath()));
        return handleMsg("requestInfo", info);
    }
    
    /**
     * Returns a String with all header information.
     */
    public String getHeaders() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        Enumeration names = req.getHeaderNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            Enumeration values = req.getHeaders(name);
            StringBuffer sb = new StringBuffer();
            boolean first = true;
            while (values.hasMoreElements()) {
                if (!first) {
                    sb.append(" | ");
                }
                first = false;
                sb.append(values.nextElement());
            }
            info.put(name, sb.toString());
        }
        return handleMsg("headers", info);
    }
    
    /**
     * Returns a String with all cookie information.
     */
    public String getCookies() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        Cookie[] cookies = req.getCookies();
        for (int i = 0; i < cookies.length; i++) {
            info.put(cookies[i].getName(), cookies[i].getValue());
        }
        return handleMsg("cookies", info);
    }
    
    /**
     * Returns a String with all request parameter information.
     */
    public String getParameters() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        Enumeration names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            String[] values = req.getParameterValues(name);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < values.length; i++) {
                if (i != 0) {
                    sb.append(" | ");
                }
                sb.append(values[i]);
            }
            info.put(name, sb.toString());
        }
        return handleMsg("parameters", info);
    }
    
    /**
     * Returns a String with all request scope variables.
     */
    public String getRequestScope() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        Enumeration names = req.getAttributeNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            Object value = req.getAttribute(name);
            info.put(name, toStringValue(value));
        }
        return handleMsg("requestScope", info);
    }
    
    /**
     * Returns a String with all page scope variables.
     */
    public String getPageScope() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        Enumeration names = 
            pageContext.getAttributeNamesInScope(PageContext.PAGE_SCOPE);
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            Object value = pageContext.getAttribute(name);
            info.put(name, toStringValue(value));
        }
        return handleMsg("pageScope", info);
    }
    
    /**
     * Returns a String with all session scope variables.
     */
    public String getSessionScope() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
        HttpSession session = req.getSession();
        Enumeration names = session.getAttributeNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            Object value = session.getAttribute(name);
            info.put(name, toStringValue(value));
        }
        return handleMsg("sessionScope", info);
    }
    
    /**
     * Returns a String with all application scope variables.
     */
    public String getApplicationScope() {
        if (pageContext == null) {
            throw new IllegalStateException("The pageContext property is not set");
        }
        
        Hashtable info = new Hashtable();
        ServletContext context = pageContext.getServletContext();
        Enumeration names = context.getAttributeNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            Object value = context.getAttribute(name);
            info.put(name, toStringValue(value));
        }
        return handleMsg("applicationScope", info);
    }
    
    /**
     * Returns the String "null" if the value is null,
     * otherwise the value itself.
     */
    private String nullToString(String value) {
        if (value == null) {
            return "null";
        }
        else {
            return value;
        }
    }
    
    /**
     * Returns true if the pageContext attribute has been set
     * and a valid "debug" request parameter is present in the request.
     */
    private boolean isDebugActive() {
        if (pageContext == null) {
            return false;
        }
        
        if (debugType == null) {
            String debugParam = pageContext.getRequest().getParameter("debug");
            if (debugParam != null) {
                debugType = debugParam;
            }
            else {
                debugType = "off";
            }
        }
        return "resp stdout log".indexOf(debugType) != -1;
    }
    
    /**
     * Returns a String suitable for browser debug display
     * and sends the debug message to System.out and/or
     * the servlet log file, depending on the value of
     * the "debug" request parameter. If debug is not active,
     * an empty String is returned.
     */
    private String handleMsg(String propName, String msg) {
        String returnVal = "";
        if (isDebugActive()) {
            log(propName, msg);
            if (debugType.indexOf("resp") != -1) {
                returnVal = propName + ": " + msg;
            }
        }
        return returnVal;
    }
    
    /**
     * If debug is activated, writes the specified property
     * value to the log file and returns it as an HTML table,
     * depending on the requested debug type.
     */
    private String handleMsg(String propName, Hashtable values) {
        String returnVal = "";
        if (isDebugActive()) {
            log(propName, values);
            if (debugType.indexOf("resp") != -1) {
                returnVal = toHTMLTable(propName, values);
            }
        }
        return returnVal;
    }
        
    /**
     * Writes the specified property value to the System.out or
     * the log file, depending on the requested debug type.
     */
    private void log(String propName, String msg) {
        HttpServletRequest request = 
            (HttpServletRequest) pageContext.getRequest();
        msg = "[DebugBean] " + request.getRequestURI() + " : " + 
            propName + " : " + msg;
        if (debugType.indexOf("stdout") != -1) {
            System.out.println(msg);
        }
        if (debugType.indexOf("log") != -1) {
            if (context == null) {
                context = pageContext.getServletContext();
            }
            context.log(msg);
        }
    }
        
    private void log(String propName, Hashtable values) {
        log(propName, toTabbedTable(values));
    }
    
    /**
     * Returns an HTML table with all the values of the
     * specified property.
     */
    private String toHTMLTable(String propName, Hashtable values) {
        StringBuffer tableSB = new StringBuffer("<table border=\"1\">");
        tableSB.append("<caption align=\"top\"><b>").
            append(propName).
            append("</b></caption>");
        Enumeration keys = values.keys();
        while (keys.hasMoreElements()) {
            String key = (String) keys.nextElement();
            tableSB.append("<tr><td>").
                append(key).
                append("</td><td>").
                append(values.get(key)).
                append("</td></tr>");
        }
        tableSB.append("</table>");
        return tableSB.toString();
    }
    
    /**
     * Returns an simple ASCII table with all the values of the
     * specified property, used for log output.
     */
    private String toTabbedTable(Hashtable values) {
        StringBuffer tableSB = new StringBuffer();
        Enumeration keys = values.keys();
        while (keys.hasMoreElements()) {
            String key = (String) keys.nextElement();
            tableSB.append(LINE_FEED).
                append(key).append("\t\t").
                append(values.get(key));
        }
        return tableSB.toString();
    }
    
    /**
     * Returns a String representation of the specified
     * Object, in a format suitable for debug output.
     */
    private String toStringValue(Object value) {
        StringBuffer sb = new StringBuffer();
        Class type = value.getClass();
        if (type.isArray()) {
            Class componentType = type.getComponentType();
            sb.append(componentType.getName());
            sb.append("[]: {");
            if (!componentType.isPrimitive()) {
                Object[] arr = (Object[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Boolean.TYPE) {
                boolean[] arr = (boolean[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Byte.TYPE) {
                byte[] arr = (byte[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Character.TYPE) {
                char[] arr = (char[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Double.TYPE) {
                double[] arr = (double[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Float.TYPE) {
                float[] arr = (float[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Integer.TYPE) {
                int[] arr = (int[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Long.TYPE) {
                long[] arr = (long[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            else if (componentType == Short.TYPE) {
                short[] arr = (short[]) value;
                for (int i = 0; i < arr.length; i++) {
                    if (i != 0) {
                        sb.append(", ");
                    }
                    sb.append(arr[i]);
                }
            }
            sb.append("}");
        }
        else {
            sb.append(value.getClass().getName()).
                append(": ").
                append(value.toString());
        }
        return sb.toString();
    }
}