All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.test.clusterbench.common.debug.AbstractCommonDebugServlet Maven / Gradle / Ivy

There is a newer version: 11.0.1.Final
Show newest version
/*
 * Copyright The ClusterBench Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package org.jboss.test.clusterbench.common.debug;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import org.jboss.test.clusterbench.common.ClusterBenchConstants;
import org.jboss.test.clusterbench.common.SerialBean;

/**
 * Servlet which outputs debug information provided by the {@link #getContainerSpecificDebugInfo(HttpServletRequest)} method.
 *
 * @author Radoslav Husar
 * @version April 2012
 */
public abstract class AbstractCommonDebugServlet extends HttpServlet {

    private static final Logger log = Logger.getLogger(AbstractCommonDebugServlet.class.getName());
    public static final String KEY = AbstractCommonDebugServlet.class.getName();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        HttpSession session = req.getSession(true);
        resp.setContentType("text/plain");
        resp.setCharacterEncoding(StandardCharsets.UTF_8.name());
        PrintWriter out = resp.getWriter();

        if (session.isNew()) {
            log.log(Level.INFO, "New session created: {0}", session.getId());
            session.setAttribute(KEY, new SerialBean());
        } else if (session.getAttribute(KEY) == null) {
            log.log(Level.INFO, "Session is not new, creating SerialBean: {0}", session.getId());
            session.setAttribute(KEY, new SerialBean());
        }

        SerialBean bean = (SerialBean) session.getAttribute(KEY);

        resp.setContentType("text/plain");

        // Readonly?
        if (req.getParameter(ClusterBenchConstants.READONLY) != null) {
            out.print(bean.getSerial());
            out.println(this.getContainerSpecificDebugInfo(req));
            return;
        }

        int serial = bean.getSerial();
        bean.setSerial(serial + 1);

        // Now store bean in the session
        session.setAttribute(KEY, bean);

        // Write out request headers
        Enumeration headers = req.getHeaderNames();
        while (headers.hasMoreElements()) {
            String header = headers.nextElement();
            out.println("Request header: " + header + "=" + req.getHeader(header));
        }

        // Request URI
        out.println("Request URI: " + req.getRequestURI());
        // Query path of the URL
        out.println("Query string: " + req.getQueryString());
        // Query path of the URL decoded
        out.println("Query string UTF-8 decoded: " + ((req.getQueryString() == null) ? "null" :
                                                    URLDecoder.decode(req.getQueryString(), StandardCharsets.UTF_8)));
        // Extra path information
        out.println("Path info: " + req.getPathInfo());
        // Common debug info
        out.println("Serial: " + serial);
        // Get the session ID with the route (if present)
        out.println("Session ID: " + req.getSession().getId());
        // Current invocation time; useful for testing session timeouts
        out.println("Current time: " + new Date());
        // Display Server/Local ports
        out.println("ServletRequest.getServerPort(): " + req.getServerPort());
        out.println("ServletRequest.getLocalPort(): " + req.getLocalPort());
        // Fetch just the node name for now
        out.println("Node name: " + System.getProperty("jboss.node.name"));
        // All parameters from current request
        out.println(printRequestParameters(req));

        // Container/EE-specific debug info
        out.println(this.getContainerSpecificDebugInfo(req));

        // Invalidate?
        if (req.getParameter(ClusterBenchConstants.INVALIDATE) != null) {
            log.log(Level.INFO, "Invalidating: {0}", session.getId());
            session.invalidate();
        }
    }

    private String printRequestParameters(HttpServletRequest request) {
        final StringBuilder responseText = new StringBuilder();

        responseText.append("Parameters [key=value]: {");

        final Map params = request.getParameterMap();

        final Iterator i = params.keySet().iterator();
        while (i.hasNext()) {
            String key = i.next();
            String value = (params.get(key))[0];
            responseText.append("[");
            responseText.append(key);
            responseText.append("=");
            responseText.append(value);
            responseText.append("]");
            if (i.hasNext()) responseText.append(" ");
        }
        responseText.append("}");

        return responseText.toString();
    }

    @Override
    public String getServletInfo() {
        return "Debug servlet.";
    }

    /**
     * Implement this method to print out any debug info specific to the container or EE version.
     *
     * @param req HttpServletRequest
     * @return debug info String
     */
    abstract public String getContainerSpecificDebugInfo(HttpServletRequest req);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy