org.addsimplicity.anicetus.web.TelemetryServletFilter.java Source code

Java tutorial

Introduction

Here is the source code for org.addsimplicity.anicetus.web.TelemetryServletFilter.java

Source

/**
 * Copyright 2008-2009 Dan Pritchett
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 */
package org.addsimplicity.anicetus.web;

import java.io.IOException;
import java.util.Enumeration;
import java.util.UUID;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * @author Dan Pritchett
 * 
 */
public class TelemetryServletFilter implements Filter {
    private static final String s_PARENT_NAME = "x-anicetus-parent-guid";

    private ServletContext m_servletContext;
    private String m_sessionContextName;

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#destroy()
     */
    public void destroy() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
     * javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
            throws IOException, ServletException {
        ApplicationContext curCtx = WebApplicationContextUtils.getWebApplicationContext(m_servletContext);

        TelemetryHttpContext curHttpCtx = (TelemetryHttpContext) curCtx.getBean(m_sessionContextName);
        TelemetryHttpSession curSess = (TelemetryHttpSession) curHttpCtx.getSession();
        setRequestOnSession(curSess, (HttpServletRequest) request);
        TelemetryProxyResponse proxyResp = new TelemetryProxyResponse((HttpServletResponse) response, curSess);

        filter.doFilter(request, proxyResp);
    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    public void init(FilterConfig config) throws ServletException {
        m_servletContext = config.getServletContext();
        m_sessionContextName = config.getInitParameter("SessionContextName");
        if (m_sessionContextName == null) {
            m_sessionContextName = "sessionContext";
        }
    }

    @SuppressWarnings("unchecked")
    private void setRequestOnSession(TelemetryHttpSession session, HttpServletRequest request) {
        session.setMethod(request.getMethod());
        session.setProtocol(request.getProtocol());
        if (request.getContentType() != null) {
            session.setContentType(request.getContentType(), HeaderType.Request);
        }
        session.setRequestURL(request.getRequestURI());

        Enumeration<String> pnames = request.getParameterNames();
        while (pnames.hasMoreElements()) {
            String name = pnames.nextElement();
            session.setParameter(name, request.getParameter(name));
        }

        Enumeration<String> hnames = request.getHeaderNames();
        while (hnames.hasMoreElements()) {
            String name = hnames.nextElement();
            String value = request.getHeader(name);
            if (value != null) {
                session.setHeader(name, request.getHeader(name), HeaderType.Request);
            }
        }

        String parent = request.getHeader(s_PARENT_NAME);
        if (parent == null) {
            parent = request.getParameter(s_PARENT_NAME);
        }

        if (parent != null) {
            try {
                UUID parentId = UUID.fromString(parent);
                session.setParentId(parentId);
            } catch (IllegalArgumentException iae) {
                // TODO - Exception handler
            }

        }
    }

}