001package org.javasimon.console;
002
003import java.io.IOException;
004import javax.servlet.Filter;
005import javax.servlet.FilterChain;
006import javax.servlet.FilterConfig;
007import javax.servlet.ServletException;
008import javax.servlet.ServletRequest;
009import javax.servlet.ServletResponse;
010import javax.servlet.http.HttpServletRequest;
011import javax.servlet.http.HttpServletResponse;
012
013import org.javasimon.Manager;
014import org.javasimon.utils.SimonUtils;
015
016/**
017 * Simon Console filter does the same as {@link SimonConsoleServlet} and provides just an alternative way
018 * to include embeddable console in your applications. Putting this filter before the Simon Servlet filter is also
019 * the easiest way how to avoid monitoring of the console itself.
020 *
021 * @author Richard Richter
022 * @since 2.3
023 */
024@SuppressWarnings("UnusedParameters")
025public class SimonConsoleFilter implements Filter {
026        private SimonConsoleRequestProcessor requestProcessor;
027
028        @Override
029        public final void init(FilterConfig config) {
030                // Manager
031                Manager manager = SimonConsoleServlet.getManager(config.getServletContext());
032                // URL Prefix
033                String urlPrefix = config.getInitParameter(SimonConsoleServlet.URL_PREFIX_INIT_PARAMETER);
034                // Plugin classes
035                String pluginClasses = config.getInitParameter(SimonConsoleServlet.PLUGIN_CLASSES_INIT_PARAMETER);
036                // Create request processor
037                requestProcessor = SimonConsoleRequestProcessor.create(urlPrefix, manager, pluginClasses);
038
039        }
040
041        /**
042         * Wraps the HTTP request with Simon measuring. Separate Simons are created for different URIs (parameters
043         * ignored).
044         *
045         * @param servletRequest HTTP servlet request
046         * @param servletResponse HTTP servlet response
047         * @param filterChain filter chain
048         * @throws java.io.IOException possibly thrown by other filter/serlvet in the chain
049         * @throws javax.servlet.ServletException possibly thrown by other filter/serlvet in the chain
050         */
051        public final void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
052                HttpServletRequest request = (HttpServletRequest) servletRequest;
053                HttpServletResponse response = (HttpServletResponse) servletResponse;
054
055                String localPath = request.getRequestURI().substring(request.getContextPath().length());
056                if (localPath.startsWith(requestProcessor.getUrlPrefix())) {
057                        requestProcessor.processRequest(request, response);
058                        return;
059                }
060
061                filterChain.doFilter(request, response);
062        }
063
064        @Override
065        public void destroy() {
066        }
067}